Java通過JDBC進行簡單的增刪改查MySQL資料庫

來源:互聯網
上載者:User


JDBC基本操作

 

下面的所有方法和資料成員都在public class JDBCOperation內部。

(1)定義記錄的類(可選)

這樣做主要是為了便於操作和介面定義,是非必須的。

static class Student {
        private String Id;
        private String Name;
        private String Sex;
        private String Age;
 
        Student(String Name, String Sex, String Age) {
            this.Id = null; //default
            this.Name = Name;
            this.Sex = Sex;
            this.Age = Age;
        }
 
        public String getId() {
            return Id;
        }
 
        public void setId(String Id) {
            this.Id = Id;
        }
 
        public String getName() {
            return Name;
        }
 
        public void setName(String Name) {
            this.Name = Name;
        }
 
        public String getSex() {
            return Sex;
        }
 
        public void setSex(String Sex) {
            this.Sex = Sex;
        }
 
        public String getAge() {
            return Age;
        }
 
        public void setage(String Age) {
            this.Age = Age;
        }
}
 

(2)串連的擷取

在操作前必須先擷取與資料庫的串連。


private static Connection getConn() {
    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/samp_db";
    String username = "root";
    String password = "";
    Connection conn = null;
    try {
        Class.forName(driver); //classLoader,載入對應驅動
        conn = (Connection) DriverManager.getConnection(url, username, password);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return conn;
}
 

(3)insert

private static int insert(Student student) {
    Connection conn = getConn();
    int i = 0;
    String sql = "insert into students (Name,Sex,Age) values(?,?,?)";
    PreparedStatement pstmt;
    try {
        pstmt = (PreparedStatement) conn.prepareStatement(sql);
        pstmt.setString(1, student.getName());
        pstmt.setString(2, student.getSex());
        pstmt.setString(3, student.getAge());
        i = pstmt.executeUpdate();
        pstmt.close();
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return i;
}
 

(4)update


private static int update(Student student) {
    Connection conn = getConn();
    int i = 0;
    String sql = "update students set Age='" + student.getAge() + "' where Name='" + student.getName() + "'";
    PreparedStatement pstmt;
    try {
        pstmt = (PreparedStatement) conn.prepareStatement(sql);
        i = pstmt.executeUpdate();
        System.out.println("resutl: " + i);
        pstmt.close();
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return i;
}

 

(5)select

以select * from XXX為例。

private static Integer getAll() {
    Connection conn = getConn();
    String sql = "select * from students";
    PreparedStatement pstmt;
    try {
        pstmt = (PreparedStatement)conn.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        int col = rs.getMetaData().getColumnCount();
        System.out.println("============================");
        while (rs.next()) {
            for (int i = 1; i <= col; i++) {
                System.out.print(rs.getString(i) + "\t");
                if ((i == 2) && (rs.getString(i).length() < 8)) {
                    System.out.print("\t");
                }
             }
            System.out.println("");
        }
            System.out.println("============================");
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}

 

(6)delete


private static int delete(String name) {
    Connection conn = getConn();
    int i = 0;
    String sql = "delete from students where Name='" + name + "'";
    PreparedStatement pstmt;
    try {
        pstmt = (PreparedStatement) conn.prepareStatement(sql);
        i = pstmt.executeUpdate();
        System.out.println("resutl: " + i);
        pstmt.close();
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return i;
}


測試

在測試前,需要在系統中開啟對應資料庫的服務。MySQL在Windows下的啟動命令為

net start mysql
 

測試代碼


public static void main(String args[]) {
    JDBCOperation.getAll();
    JDBCOperation.insert(new Student("Achilles", "Male", "14"));
    JDBCOperation.getAll();
    JDBCOperation.update(new Student("Bean", "", "7"));
    JDBCOperation.delete("Achilles");
    JDBCOperation.getAll();
}

 

Eclipse中的輸出

 

============================
1    Ender        male    8   
2    Bean        male    6   
3    Petra        fema    9   
4    Peter        male    9   
5    _Graff        male    40   
6    GOD        fema    255   
============================
============================
1    Ender        male    8   
2    Bean        male    6   
3    Petra        fema    9   
4    Peter        male    9   
5    _Graff        male    40   
6    GOD        fema    255   
7    Achilles    Male    14   
============================
resutl: 1
resutl: 1
============================
1    Ender        male    8   
2    Bean        male    7   
3    Petra        fema    9   
4    Peter        male    9   
5    _Graff        male    40   
6    GOD        fema    255   
============================
複製代碼
 

程式碼分析

在上述對資料庫進行增刪改查的過程中,可以發現其共性部分,即通用的流程:

(1)建立Connection對象、SQL查詢命令字串;

(2)對Connection對象傳入SQL查詢命令,獲得PreparedStatement對象;

(3)對PreparedStatement對象執行executeUpdate()或executeQurey()獲得結果;

(4)先後關閉PreparedStatement對象和Connection對象。

可見,使用JDBC時,最常打交道的是Connection、PreparedStatement這兩個類,以及select中的ResultSet類。查閱Java API手冊可以瞭解其具體的意義和方法。

下面引用的Java API的資料出自
http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/index.html。

Connection

java.sql
介面 Connection

所有超級介面:
Wrapper

 

 
與特定資料庫的串連(會話)。在串連上下文中執行 SQL 陳述式並返回結果。
Connection 對象的資料庫能夠提供描述其表、所支援的 SQL 文法、預存程序、此串連功能等等的資訊。此資訊是使用 getMetaData 方法獲得的。
 

PreparedStatemnt

java.sql
介面 PreparedStatement

所有超級介面:
Statement, Wrapper
所有已知子介面:
CallableStatement

 

表示先行編譯的 SQL 陳述式的對象。
SQL 陳述式被先行編譯並儲存在 PreparedStatement 對象中。然後可以使用此對象多次高效地執行該語句。
 
常用方法
boolean  execute()
在此 PreparedStatement 對象中執行 SQL 陳述式,該語句可以是任何種類的 SQL 陳述式。
ResultSet  executeQuery()
在此 PreparedStatement 對象中執行 SQL 查詢,並返回該查詢產生的 ResultSet 對象。
int  executeUpdate()
在此 PreparedStatement 對象中執行 SQL 陳述式,該語句必須是一個 SQL 資料操作語言(Data Manipulation Language,DML)語句,比如 INSERT、UPDATE 或 DELETE 語句;或者是無返回內容的 SQL 陳述式,比如 DDL 語句。
ResultSet

java.sql
介面 ResultSet

所有超級介面:
Wrapper

所有已知子介面:

CachedRowSet, FilteredRowSet, JdbcRowSet, JoinRowSet, RowSet, SyncResolver, WebRowSet

 

表示資料庫結果集的資料表,通常通過執行查詢資料庫的語句產生。
思考問題

1.每次SQL操作都需要建立和關閉串連,這勢必會消耗大量的資源開銷,如何避免?

分析:可以採用串連池,對串連進行統一維護,不必每次都建立和關閉。事實上這是很多對JDBC進行封裝的工具所採用的。

 

2.Java代碼中,傳入的資料格式與資料庫定義不同怎麼辦?如把Java的String對象賦值給資料庫的tinyint屬性。

分析:在執行SQL語句時,資料庫會嘗試進行轉換。根據我的實驗,如果用內容為純字母的String對象傳入tinyint的age屬性時,會被轉化成0。具體轉化規則應該和資料庫有關。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.