標籤:
JDBC
英文名稱:JavaDataBaseConnectivity
中文名稱:java資料庫連接
簡稱:JDBC
JDBC是一種用於執行SQL語句的JavaAPI,
可以為多種關聯式資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。JDBC提供了一種基準,據此可以構建更進階的工具和介面,使資料庫開發人員能夠編寫資料庫應用
程式。
一、建立資料庫連接
1、引用jar檔案(http://dev.mysql.com/downloads/connector/j/ 下載jar檔案)
2、註冊驅動Class.forName(“com.mysql.jdbc.Driver”)(只需註冊一次)
3、定義資料庫連接字串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表示永不逾時
二、常用資料庫操作
//資料庫連接字串 publicstaticfinalStringDRIVER="com.mysql.jdbc.Driver"; publicstaticfinalStringURL="jdbc:mysql://127.0.0.1:3306/MyLibrary?user=root&password=123456&useUnicode=true&characterEncoding=utf-8";
1、添加資料
publicstaticvoidinsert()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(); } }
2、刪除資料
publicstaticvoiddelete(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(); } }
3、修改資料
publicstaticvoidupdate()throwsSQLException{ Connectioncon=DriverManager.getConnection(URL); Statementst=con.createStatement(); st.executeUpdate("updatearticlesettitle=‘新標題‘whereid=1;"); con.close(); st.close(); }
4、查詢資料
publicstaticvoidselect()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(); } }
5、參數預先處理
publicstaticvoidinsert(Stringtitle)throwsSQLException{ Connectioncon=DriverManager.getConnection(URL); PreparedStatementpst=con.prepareStatement("insertintoarticle(title)values(?);"); pst.setString(1,title); pst.executeUpdate(); con.close(); pst.close(); }
6、批處理
publicstaticvoidinsertBatch(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、事務操作
7.1、資料庫事務的特性:
原子性(atomicity):一個事務是一個不可分割的工作單位,事務中包括的操作要麼都做,要麼都不做。
一致性(consistency):事務必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation):一個事務的執行不能被其他事務幹擾。即一個事務內部的操作及使用的資料對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾。
持久性(durability):持久性也稱永久性(permanence),指一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。接下來的其他動作或故障不應該對其有任何影響。
7.2、JDBC事務操作
(1)setAutoCommit(Booleanauto Commit):設定是否自動認可事務;
(2)commit():提交事務;
(3)rollback():撤消事務;
預設的情況為自動認可事務,也就是說,每一條對資料庫的更新的sql語句代表一項事務,操作成功後,系統自動調用commit()來提交,否則將調用rollback()來撤消事務。在jdbc中,可以通過調用setAutoCommit(false)來禁止自動認可事務。然後就可以把多條更新資料庫的sql語句做為一個事務,在所有操作完成之後,調用commit()來進行整體提交。倘若其中一項sql操作失敗,就不會執行commit()方法,而是產生相應的sqlexception,此時就可以捕獲異常代碼塊中調用rollback()方法撤消事務。
publicstaticvoidtransaction()throwsSQLException{ Connectioncon=DriverManager.getConnection(URL); Statementst=con.createStatement(); try{ con.setAutoCommit(false);//更改JDBC事務的預設提交方式 st.executeUpdate("deletefromarticlewhereid=1;"); st.executeUpdate("deletefromarticlewhereid=2;"); con.commit();//提交JDBC事務 con.setAutoCommit(true);//恢複JDBC事務的預設提交方式 }catch(Exceptionexc){ con.rollback();//復原JDBC事務 }finally{ st.close(); con.close(); } }
8、調用mysql預存程序
publicstaticvoidcallProcedure()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); }
三、JDBC執行sql語句方法
1、executeQuery(String sql): 執行SQL查詢,並返回ResultSet 對象。
2、executeUpdate(String sql): 可執行增,刪,改,返回執行受到影響的行數。
3、execute(String sql);:可執行任何SQL語句,返回一個布爾值,表示是否返回ResultSet 。
四、JDBC Statement類型
1、Statement:介面提供了執行語句和擷取結果的基本方法,用於執行不帶參數的簡單SQL語句,每次執行sql語句,資料庫都要執行sql語句的編譯,最好用於僅執行一次查詢並返回結果的情形,效率高於PreparedStatement。
2、PrepareStatement:可變參數的SQL,編譯一次,執行多次,效率高;安全性好,有效防止Sql注入等問題;支援批次更新,大量刪除;執行的SQL語句中是可以帶參數的,並支援批量執行SQL。由於採用Cache機制,則預先編譯的語句,就會放在Cache中,下次執行相同SQL語句時,則可以直接從Cache中取出來。
3、CallableStatement:用於執行對資料庫已預存程序的調用,繼承自PreparedStatement,支援帶參SQL操作;支援調用預存程序,提供了對輸出和輸入/輸出參數的支援;
在JDBC中調用預存程序的文法如下所示:
{call過程名[(?,?)]}
返回結果參數的過程的文法為:
{?=call過程名[(?,?,...)]}
不帶參數的預存程序的文法類似:
{call過程名}
CallableStatement中定義的所有方法都用於處理OUT參數或INOUT參數的輸出部分:註冊OUT參數的JDBC類型(一般SQL類型)、從這些參數中檢索結果,或者檢查所返回的值是否為JDBCNULL。
JDBC資料庫常用操作(mysql)