JDBC

JDBC(Java Data Base Connectivity,java數據庫連接)是一種用於執行SQL語句的Java API,可以爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序。

2.數據庫驅動

  我們安裝好數據庫之後,我們的應用程序也是不能直接使用數據庫的,必須要通過相應的數據庫驅動程序,通過驅動程序去和數據庫打交道。其實也就是數據庫廠商的JDBC接口實現,即對Connection等接口的實現類的jar文件。

二、常用接口

1.Driver接口

  Driver接口由數據庫廠家提供,作爲java開發人員,只需要使用Driver接口就可以了。在編程中要連接數據庫,必須先裝載特定廠商的數據庫驅動程序,不同的數據庫有不同的裝載方法。如:

  裝載MySql驅動:Class.forName(“com.mysql.jdbc.Driver”);

  裝載Oracle驅動:Class.forName(“oracle.jdbc.driver.OracleDriver”);

2.Connection接口

  Connection與特定數據庫的連接(會話),在連接上下文中執行sql語句並返回結果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定義的數據庫Connection連接上。

  連接MySql數據庫:Connection conn = DriverManager.getConnection(“jdbc:mysql://host:port/database”, “user”, “password”);

  連接Oracle數據庫:Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@host:port:database”, “user”, “password”);

  連接SqlServer數據庫:Connection conn = DriverManager.getConnection(“jdbc:microsoft:sqlserver://host:port; DatabaseName=database”, “user”, “password”);

  常用方法:

createStatement():創建向數據庫發送sql的statement對象。
prepareStatement(sql) :創建向數據庫發送預編譯sql的PrepareSatement對象。
prepareCall(sql):創建執行存儲過程的callableStatement對象。
setAutoCommit(boolean autoCommit):設置事務是否自動提交。
commit() :在鏈接上提交事務。
rollback() :在此鏈接上回滾事務。
3.Statement接口

  用於執行靜態SQL語句並返回它所生成結果的對象。

  三種Statement類:

Statement:由createStatement創建,用於發送簡單的SQL語句(不帶參數)。
PreparedStatement :繼承自Statement接口,由preparedStatement創建,用於發送含有一個或多個參數的SQL語句。PreparedStatement對象比Statement對象的效率更高,並且可以防止SQL注入,所以我們一般都使用PreparedStatement。
CallableStatement:繼承自PreparedStatement接口,由方法prepareCall創建,用於調用存儲過程。
  常用Statement方法:

execute(String sql):運行語句,返回是否有結果集
executeQuery(String sql):運行select語句,返回ResultSet結果集。
executeUpdate(String sql):運行insert/update/delete操作,返回更新的行數。
addBatch(String sql) :把多條sql語句放到一個批處理中。
executeBatch():向數據庫發送一批sql語句執行。
4.ResultSet接口

  ResultSet提供檢索不同類型字段的方法,常用的有:

getString(int index)、getString(String columnName):獲得在數據庫裏是varchar、char等類型的數據對象。
getFloat(int index)、getFloat(String columnName):獲得在數據庫裏是Float類型的數據對象。
getDate(int index)、getDate(String columnName):獲得在數據庫裏是Date類型的數據。
getBoolean(int index)、getBoolean(String columnName):獲得在數據庫裏是Boolean類型的數據。
getObject(int index)、getObject(String columnName):獲取在數據庫裏任意類型的數據。
  ResultSet還提供了對結果集進行滾動的方法:

next():移動到下一行
Previous():移動到前一行
absolute(int row):移動到指定行
beforeFirst():移動resultSet的最前面。
afterLast() :移動到resultSet的最後面。
使用後依次關閉對象及連接:ResultSet → Statement → Connection

三、使用JDBC的步驟

  加載JDBC驅動程序 → 建立數據庫連接Connection → 創建執行SQL的語句Statement → 處理執行結果ResultSet → 釋放資源

1.註冊驅動 (只做一次)

  方式一:Class.forName(“com.MySQL.jdbc.Driver”);
  推薦這種方式,不會對具體的驅動類產生依賴。
  方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);
  會造成DriverManager中產生兩個一樣的驅動,並會對具體的驅動類產生依賴。

2.建立連接

 Connection conn = DriverManager.getConnection(url, user, password);
  URL用於標識數據庫的位置,通過URL地址告訴JDBC程序連接哪個數據庫,URL的寫法爲:

  其他參數如:useUnicode=true&characterEncoding=utf8

3.創建執行SQL語句的statement

複製代碼
1 //Statement
2 String id = “5”;
3 String sql = “delete from table where id=” + id;
4 Statement st = conn.createStatement();
5 st.executeQuery(sql);
6 //存在sql注入的危險
7 //如果用戶傳入的id爲“5 or 1=1”,那麼將刪除表中的所有記錄
複製代碼

複製代碼
1 //PreparedStatement 有效的防止sql注入(SQL語句在程序運行前已經進行了預編譯,當運行時動態地把參數傳給PreprareStatement時,即使參數裏有敏感字符如 or ‘1=1’也數據庫會作爲一個參數一個字段的屬性值來處理而不會作爲一個SQL指令)
2 String sql = “insert into user (name,pwd) values(?,?)”;
3 PreparedStatement ps = conn.preparedStatement(sql);
4 ps.setString(1, “col_value”); //佔位符順序從1開始
5 ps.setString(2, “123456”); //也可以使用setObject
6 ps.executeQuery();
複製代碼
4.處理執行結果(ResultSet)

1 ResultSet rs = ps.executeQuery();
2 While(rs.next()){
3 rs.getString(“col_name”);
4 rs.getInt(1);
5 //…
6 }
5.釋放資源

複製代碼
//數據庫連接(Connection)非常耗資源,儘量晚創建,儘量早的釋放
//都要加try catch 以防前面關閉出錯,後面的就不執行了
1 try {
2 if (rs != null) {
3 rs.close();
4 }
5 } catch (SQLException e) {
6 e.printStackTrace();
7 } finally {
8 try {
9 if (st != null) {
10 st.close();
11 }
12 } catch (SQLException e) {
13 e.printStackTrace();
14 } finally {
15 try {
16 if (conn != null) {
17 conn.close();
18 }
19 } catch (SQLException e) {
20 e.printStackTrace();
21 }
22 }
23 }
複製代碼

四、事務(ACID特點、隔離級別、提交commit、回滾rollback)

1.批處理Batch

插入2萬條數據的測試
2.測試事務的基本概念和用法

測試事務的基本概念和用法
控制檯輸出
五、時間處理(Date和Time以及Timestamp區別、隨機日期生成)

java.util.Date

子類:java.sql.Date
子類:java.sql.Time
子類:java.sql.Timestamp

測試時間處理(java.sql.Date,Time,Timestamp)
測試時間處理(java.sql.Date,Time,Timestamp),取出指定時間段的數據
六、CLOB文本大對象操作

測試CLOB 文本大對象的使用
七、BLOB二進制大對象的使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章