JDBC
英文名稱:JavaDataBaseConnectivity
中文名稱:java數據庫鏈接
簡稱:JDBC
JDBC是一種用於執行SQL語句的JavaAPI,
能夠爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此能夠構建更高級的工具和接口,使數據庫開發人員可以編寫數據庫應用
程序。java
1、創建數據庫鏈接mysql
一、引用jar文件(http://dev.mysql.com/downloads/connector/j/ 下載jar文件)sql
二、註冊驅動Class.forName(「com.mysql.jdbc.Driver」)(只需註冊一次)數據庫
三、定義數據庫鏈接字符串URL="jdbc:mysql://127.0.0.1:3306/數據庫名稱?user=用戶名&password=密碼&useUnicode=true&characterEncoding=utf-8";安全
JDBC:子協議:子名稱//主機名:端口/數據庫名?屬性名=屬性值&…
user:用戶名
password:密碼
useUnicode:是否使用Unicode字符集,若是參數characterEncoding設置爲gb2312或gbk,本參數值必須設置爲true
characterEncoding:當useUnicode設置爲true時,指定字符編碼。好比可設置爲gb2312或gbk
autoReconnect:當數據庫鏈接異常中斷時,是否自動從新鏈接。(默認:false)
autoReconnectForPools:是否使用針對數據庫鏈接池的重連策略。(默認:false)
failOverReadOnly:自動重連成功後,鏈接是否設置爲只讀。(默認:true)
maxReconnects:autoReconnect設置爲true時,重試鏈接的次數 (默認3:)
initialTimeout:autoReconnect設置爲true時,兩次重連之間的時間間隔,單位:秒 2
connectTimeout:和數據庫服務器創建socket鏈接時的超時,單位:毫秒。 0表示永不超時,適用於JDK 1.4及更高版本 0
socketTimeout:socket操做(讀寫)超時,單位:毫秒。 0表示永不超時服務器
2、經常使用數據庫操做 併發
//數據庫鏈接字符串 public static final String DRIVER="com.mysql.jdbc.Driver"; public static final String URL="jdbc:mysql://127.0.0.1:3306/MyLibrary?user=root&password=123456&useUnicode=true&characterEncoding=utf-8";
一、添加數據socket
public static void insert()throwsSQLException{ Connectioncon=null; Statementst=null; try{ Class.forName(DRIVER); con=DriverManager.getConnection(URL); st=con.createStatement(); st.execute("insertintoarticle(title)values('標題');"); }catch(ClassNotFoundExceptione){ e.printStackTrace(); }finally{ con.close(); st.close(); } }
二、刪除數據工具
public static void delete(intid)throwsSQLException{ Connectioncon=null; Statementst=null; try{ Class.forName(DRIVER); con=DriverManager.getConnection(URL); st=con.createStatement(); st.executeUpdate("deletefromarticlewhereid="+id+";"); }catch(ClassNotFoundExceptione){ e.printStackTrace(); }finally{ con.close(); st.close(); } }
三、修改數據編碼
public static void update()throwsSQLException{ Connectioncon=DriverManager.getConnection(URL); Statementst=con.createStatement(); st.executeUpdate("updatearticlesettitle='新標題'whereid=1;"); con.close(); st.close(); }
四、查詢數據
public static void select()throwsSQLException{ Connectioncon=null; Statementst=null; try{ Class.forName(DRIVER); con=DriverManager.getConnection(URL); st=con.createStatement(); ResultSetrs=st.executeQuery("select*fromarticle;"); while(rs.next()){ System.out.print(rs.getInt("id")); System.out.println(rs.getString("title")); } //按表結構自動輸出 // ResultSetMetaDatarsmd=rs.getMetaData(); // for(inti=1;i<rsmd.getColumnCount();i++){ // System.out.print(rsmd.getColumnName(i)); // System.out.println(rsmd.getColumnTypeName(i)); // } }catch(ClassNotFoundExceptione){ e.printStackTrace(); }finally{ st.close(); con.close(); } }
五、參數預處理
public static void insert(Stringtitle)throwsSQLException{ Connectioncon=DriverManager.getConnection(URL); PreparedStatementpst=con.prepareStatement("insertintoarticle(title)values(?);"); pst.setString(1,title); pst.executeUpdate(); con.close(); pst.close(); }
六、批處理
public static void insertBatch(String[]title)throwsSQLException{ // Connectioncon=DriverManager.getConnection(URL); // Statementst=con.createStatement(); // for(inti=0;i<title.length;i++){ // st.addBatch("insertintoarticle(title)values('"+title[i]+"');"); // } // st.executeBatch(); // con.close(); // st.close(); //參數預處理+批處理 Connectioncon=DriverManager.getConnection(URL); PreparedStatementpst=con.prepareStatement("insertintoarticle(title)values(?);"); for(inti=0;i<title.length;i++){ pst.setString(1,title[i]); pst.addBatch(); } pst.executeBatch(); con.close(); pst.close(); }
七、事務操做
7.一、數據庫事務的特性:
原子性(atomicity):一個事務是一個不可分割的工做單位,事務中包括的操做要麼都作,要麼都不作。
一致性(consistency):事務必須是使數據庫從一個一致性狀態變到另外一個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation):一個事務的執行不能被其餘事務干擾。即一個事務內部的操做及使用的數據對併發的其餘事務是隔離的,併發執行的各個事務之間不能互相干擾。
持久性(durability):持續性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其餘操做或故障不該該對其有任何影響。
7.二、JDBC事務操做
(1)setAutoCommit(Booleanauto Commit):設置是否自動提交事務;
(2)commit():提交事務;
(3)rollback():撤消事務;
默認的狀況爲自動提交事務,也就是說,每一條對數據庫的更新的sql語句表明一項事務,操做成功後,系統自動調用commit()來提交,不然將調用rollback()來撤消事務。在jdbc中,能夠經過調用setAutoCommit(false)來禁止自動提交事務。而後就能夠把多條更新數據庫的sql語句作爲一個事務,在全部操做完成以後,調用commit()來進行總體提交。假若其中一項sql操做失敗,就不會執行commit()方法,而是產生相應的sqlexception,此時就能夠捕獲異常代碼塊中調用rollback()方法撤消事務。
public static void transaction()throwsSQLException{ Connectioncon=DriverManager.getConnection(URL); Statementst=con.createStatement(); try{ con.setAutoCommit(false);//更改JDBC事務的默認提交方式 st.executeUpdate("deletefromarticlewhereid=1;");
//Savepoint sp = conn.setSavepoint();設置回滾點 st.executeUpdate("deletefromarticlewhereid=2;"); con.commit();//提交JDBC事務 con.setAutoCommit(true);//恢復JDBC事務的默認提交方式 }catch(Exceptionexc){ con.rollback();//回滾JDBC事務 }finally{ st.close(); con.close(); } }
八、調用mysql存儲過程
public static void callProcedure()throwsSQLException{ Connectioncon=DriverManager.getConnection(URL); CallableStatementcst=con.prepareCall("{callproc_select(?)}");
//傳入參數值 cst.setInt(1,3); //若是第一個結果是ResultSet對象,則返回true;若是第一個結果是更新、添加、修改或者沒有結果,則返回false booleanissuccess=cst.execute(); //成功返回true,失敗返回false System.out.println(issuccess); }
3、JDBC執行sql語句方法
一、executeQuery(String sql): 執行SQL查詢,並返回ResultSet 對象。
二、executeUpdate(String sql): 可執行增,刪,改,返回執行受到影響的行數。
三、execute(String sql);:可執行任何SQL語句,返回一個布爾值,表示是否返回ResultSet 。
4、JDBC Statement類型
一、Statement:接口提供了執行語句和獲取結果的基本方法,用於執行不帶參數的簡單SQL語句,每次執行sql語句,數據庫都要執行sql語句的編譯,最好用於僅執行一次查詢並返回結果的情形,效率高於PreparedStatement。
二、PrepareStatement:可變參數的SQL,編譯一次,執行屢次,效率高;安全性好,有效防止Sql注入等問題;支持批量更新,批量刪除;執行的SQL語句中是能夠帶參數的,並支持批量執行SQL。因爲採用Cache機制,則預先編譯的語句,就會放在Cache中,下次執行相同SQL語句時,則能夠直接從Cache中取出來。
三、CallableStatement:用於執行對數據庫已存儲過程的調用,繼承自PreparedStatement,支持帶參SQL操做;支持調用存儲過程,提供了對輸出和輸入/輸出參數的支持;在JDBC中調用存儲過程的語法以下所示: {call過程名[(?,?)]} 返回結果參數的過程的語法爲: {?=call過程名[(?,?,...)]} 不帶參數的存儲過程的語法相似: {call過程名} CallableStatement中定義的全部方法都用於處理OUT參數或INOUT參數的輸出部分:註冊OUT參數的JDBC類型(通常SQL類型)、從這些參數中檢索結果,或者檢查所返回的值是否爲JDBCNULL。