JDBC進行簡單的增刪改查,小結

最近在複習jdbc知識,突然想總結一下,畢竟框架基礎都是jdbc。

前言:什麼是JDBC

  Java 數據庫連接,(Java Database Connectivity,簡稱JDBC)是Java語言中用來規範客戶端程序如何來訪問數據庫的應用程序接口,提供了諸如查詢和更新數據庫中數據的方法。JDBC也是Sun Microsystems的商標。它JDBC是面向關係型數據庫的。

  簡單地說,就是用於執行SQL語句的一類Java API,通過JDBC使得我們可以直接使用Java編程來對關係數據庫進行操作。通過封裝,可以使開發人員使用純Java API完成SQL的執行。

   首先我們需要導入jar包,(不會可以百度)

如果對MySQL進行操作,這時下面的import就不會報錯了:
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
除此以外,還需要JDBC的包,直接import即可。
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

JDBC基本操作
 爲了簡單起見,與數據庫相關的操作、命令、參數都被硬編碼了。有興趣的讀者可以對這些進行探索,降低數據與操作的耦合性。
  先看具體代碼並實踐,本文下面部分對對用到的API稍作了研究。
  下面的所有方法和數據成員都在public class JDBCOperation內部。

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


  這樣做主要是爲了便於操作和接口定義,是非必須的。

相當於封裝了一個Javabean
複製代碼
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)連接的獲取


  在操作前必須先獲取與數據庫的連接。


  driver、url的格式同樣可以參考各種數據庫對應的jar包、驅動類名和URL格式。


複製代碼
private static Connection getConn() {
    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/mydb";
    String username = "root";
    String password = "123";
    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;//返回連接對象
}

對數據庫操作無非是增刪改查。

增:

(PreparedStatement優於Statement  )//至於爲什麼 我以後會講

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;

改:

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;
}

查:

rivate 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;
}

刪:

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;
}

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();
}

測試後得到結果。

總結一下:

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


  (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

PreparedStatemnt


java.sql 
接口 PreparedStatement
所有超級接口:
Statement, Wrapper
所有已知子接口:
CallableStatement
public interface PreparedStatementextends Statement
表示預編譯的 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
public interface ResultSetextends Wrapper
表示數據庫結果集的數據表,通常通過執行查詢數據庫的語句生成。


  


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


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


 


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


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


發佈了108 篇原創文章 · 獲贊 35 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章