JDBC應用小結。本站提示廣大學習愛好者:(JDBC應用小結)文章只能為提供參考,不一定能成為您想要的結果。以下是JDBC應用小結正文
1.起首解釋甚麼是JDBC
在第一眼看到這個名詞之前,我認為有需要曉得它的英文全稱是甚麼,Java Database Connectivity,從英文字面上懂得就直譯為
可連通的Java數據庫,說白了也就是想供給一套中央環節,去銜接Java代碼與數據庫,使之可以直接經由過程操作Java代碼便可以掌握數據庫。
2.JDBC的本質
它是Java拜訪數據庫的處理計劃,願望能過用異樣的方法拜訪分歧的數據庫,以到達完成與詳細數據庫有關的Java操作界面。
JDBC本質上就是就是一套尺度化的接口,分歧的數據庫廠商依據本身的數據庫特色去完成這套接口,完成的詳細辦法無需我們去關懷。
JDBC中數據庫廠商完成的重要接口以下:
DriverManager :驅動治理
Connection、
DatabaseMetaData :銜接接口
Statement、
PreparedStatement
CallableStatement: 語句對象接口
ResultSet、
ResultSetMetaData: 成果集接口
3.JDBC的任務道理
法式員挪用的是底層數據庫廠商完成的部門,
即:1)經由過程Connection 接話柄現第一步的銜接
2)經由過程Statement成果傳送sql語句
3)數據庫前往成果保留到ResultSet成果聚集接口中
重要流程可歸結為:
1)加載驅動,創立銜接
2)創立語句對象
3)履行SQL語句
4)發還成果集
5)封閉銜接
上面我以我學的oracle數據庫合營eclips為例慢慢論述一下若何完成JDBC
1)加載驅動
應用的辦法為:Class.forName(“驅動”);
關於若何取得到這個驅動,我所曉得的辦法是:睜開JDBC的jar包,如我應用的是ojdbc6.jar,在外面找到oracle.jdbc.driver,在外面再找到OracleDriver然後鼠標右鍵點qualitycopy,粘貼到引號當中便可,如:Class.forName("oracle.jdbc.driver.OracleDriver");
2)創立銜接
應用的辦法為: conn=DriverManager.getConnection(“jdbc:oracle:thin:@IP地址:1521:orcl","數據庫賬號","數據庫暗碼”);
如:conn=DriverManager.getConnection("jdbc:oracle:thin:@172.16.3.8:1521:orcl","jsd1601","jsd1601");
3)創立語句對象
應用的辦法為:Statement stmt=conn.createStatement();
須要留意的是,應用的是第二步下面創立出來的銜接去挪用辦法
挪用executeUpdate辦法將sql語句傳入個中便可履行所寫的sql語句,這裡須要留意的是,executeUpdate辦法能履行的sql品種為insert,update,delete
如: Statement stmt=conn.createStatement();
String sql="insert into emp_jiawenzhe(empno,ename,sal,deptno) values(1000,'賈文哲',1500,10)";
int i=stmt.executeUpdate(sql);
這外面的前往值i就是受影響的行數,我們可以依據這個受影響的行數來斷定能否操作勝利
4)而關於前往的成果集重要是指停止select操作(這裡暫不提)
5)最初封閉銜接
如:conn.close();
羅列一全體代碼,包含正文:
package jdbc_day01; import java.sql.*; /** * 演示JDBC的操作步調 * 1、加載驅動法式 * 2、創立銜接 * 3、創立語句對象 * 4、發送SQL語句 * 5、假如發送的是select語句,處置成果集 * 6、封閉銜接 * @author jiawenzhe * */ public class JDBCDome01 { public static void main(String[] args) throws SQLException { //需求:創立一個員工,員工號,員工名,工資,部分號 //1、 Connection conn=null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); System.out.println("驅動加載勝利"); //2、 conn= DriverManager.getConnection("jdbc:oracle:thin:@172.16.3.8:1521:orcl","jsd1601","jsd1601"); System.out.println(conn.getClass().getName()); //3、 //Statment 語句對象。發送並履行SQL語句 /* * int excuteUpdate(String sql); * 發送insert,update,delete語句 * 前往值int表現影響數據庫表的行數 */ Statement stmt=conn.createStatement(); String sql="insert into emp_jiawenzhe(empno,ename,sal,deptno) " + "values(1000,'王小二',1500,10)"; int i=stmt.executeUpdate(sql); if(i>0){ System.out.println("保留勝利!"); } } catch (ClassNotFoundException e) { e.printStackTrace(); //1、記載日記 //2、告訴挪用者 throw new RuntimeException("加載驅動毛病",e); }finally{ //封閉銜接 if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
注:oracle數據庫可使用的jar包:ojdbc14.jar/ojdbc6.jar(oracle12c用這個)
mysql數據庫可使用的jar包:mysql-connector-java-5.0.4-bin.jar
加載驅動類:
Class.forName("com.mysql.jdbc.Driver");
1.封裝辦法的引出
學了一段時光的Java給我感想最深的就是,以後寫某一系列的代碼的時刻,假如湧現了代碼的復用,確定會選擇一種辦法對代碼停止必定水平的封裝,從封裝一個辦法到封裝一個類,之前有提到的應用JDBC停止數據庫的操作(增,刪,改,由於查詢觸及到對成果集的操作,將零丁聲明)分為四個進程:
1)加載驅動
2)創立銜接
3)創立語句對象,發送SQL
4)封閉銜接
也就是說我們在停止任何對數據庫操作的時刻,都要停止上述步調,這便湧現了代碼的冗余,因而便提出了封裝這些個性的步調到一個類中,使其能成為一種對象類,為我所用
2.三個版本的封裝
1.版本1
我在進修的時刻是慢慢對這些類停止一個漸進性的封裝,慢慢完美的,由於假如直接提出最終版的封裝,關於初學者很難接收,上面我將論述第一種也就是最簡略的封裝辦法:
你在後面會發明,不管你想若何操作數據庫,加載驅動都是必弗成少的,而加載驅動外面重要就是聲明,驅動的名字,IP地址,端標語,數據庫賬戶名,暗碼等等,而這些的本質就是字符串所以我將這些字符串零丁界說出來,以下面所示:
private static String driverclass="oracle.jdbc.driver.OracleDriver"; private static String url="jdbc:oracle:thin:losthost:1521:orcl"; private static String user="system"; private static String password="123";
如許在創立銜接的時刻我可以直接拿到變量的名字去取代很長的字符串,而加載驅動時處所法Class.forName,我們將它聲明在靜態塊中,由於加載數據的同時,加載了驅動
以下面所示:
static{ try { Class.forName(driverclass); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new RuntimeException("加載驅動毛病",e); } }
關於創立銜接,就是挪用DriverManager的getConnection辦法,並將對應的用戶名,暗碼放入個中,我們將這個辦法直接放到我本身界說的辦法中,然後直接挪用我的辦法即可以創立銜接,須要留意的是,辦法的前往值是Connection這個對象,很好懂得,由於就是要拿到這個銜接類型的對象,以下面所示:
public static Connection getConnection() throws SQLException{ Connection conn= DriverManager.getConnection(url,user,password); return conn; }
然後是創立語句對象,發送SQL,固然SQL是這外面獨一特別的處所,由於SQL要做的事千差萬別,所以這個步調就不消封裝了。
最初是封閉銜接,就是挪用了close()這個辦法,以下面所示
public static void close(Connection conn){ if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("封閉銜接毛病",e); } } }
全體的初版本的封裝以下面所示:
package jbbc_day01; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * 用來治理銜接 * @author jiawenzhe * */ public class DBUtil { private static String driverclass="oracle.jdbc.driver.OracleDriver"; private static String url="jdbc:oracle:thin:losthost:1521:orcl"; private static String user="system"; private static String password="123"; //1、加載驅動 static{ try { Class.forName(driverclass); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new RuntimeException("加載驅動毛病",e); } } //2、創立銜接 /* * 若何界說一個可以或許創立銜接的辦法 * 前往值類型:能否有運算成果,假如有,成果的類型即為前往值類型 * 參數列表: * 辦法功效中能否有不肯定的數據介入運算,假如有,即為參數 */ public static Connection getConnection() throws SQLException{ Connection conn= DriverManager.getConnection(url,user,password); return conn; } //3、封閉銜接 public static void close(Connection conn){ if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("封閉銜接毛病",e); } } } }
如許一個封裝就行了,然後在停止SQL操作的時刻直接挪用這個封裝類便可以了,而你只須要寫的就是創立你的語句對象,發送你的SQL語句便可
2.版本2
其實版本2與版本一很相似,就是為了去填補版本1的一個缺乏的地方,就是,當你改換數據庫的時刻,分歧數據庫的賬號暗碼是紛歧樣的,這就要對賬號暗碼和IP地址停止修正,我之前將這些以字符串的情勢封裝在了對象類當中,那就意味著我們每次改換數據庫必需對對象類停止修正,如許是很不當當的,因而提出了一種改良方法就是將這些銜接數據放到一個設置裝備擺設文件當中,對象類去讀取這個設置裝備擺設文件,我們在修正的時刻直接去修正這個設置裝備擺設文件便可以了
在引見這個版本之前,我前引出一個新類就是Properties,他就是一個能讀取文件,並以流的情勢去讀取設置裝備擺設文件內容然後前往給對象類的
起首我先把設置裝備擺設文件示例出來,其實不消說明,了如指掌,以下所示:
jdbc.driverclass=oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:localhost:orcl jdbc.user=system jdbc.password=123
後面是鍵,前面是值,後面的鍵值是我們本身界說的,就像界說變量名字一樣,前面的值就是我們數據庫的現實情形,這裡我們須要特殊留意的是,這個設置裝備擺設文件的後綴名必定要以.properties開頭,由於如許Properties這個類能力讀取的到。
這部門的示例以下:
static{ try { //加載屬性文件數據 Properties pop=new Properties(); pop.load(DBUtil2.class.getClassLoader().getResourceAsStream("db.properties")); url=pop.getProperty("jdbc.url"); driverclass=pop.getProperty("jdbc.driverclass"); user=pop.getProperty("jdbc.user"); password=pop.getProperty("jdbc.password"); Class.forName(driverclass); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new RuntimeException("加載驅動毛病",e); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
load()這個辦法就是去讀取也能夠以為是加載設置裝備擺設文件的,這個整整一句話記住就行,不消去深究其意義,而getProperty()就是經由過程鍵取得到了對應的值,很像鍵值對聚集獲得值得情勢
全體代碼以下:
package jbbc_day01; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; /** * 用來治理銜接 * 數據庫銜接信息,保留在屬性文件中 * @author jiawenzhe * */ public class DBUtil2 { private static String driverclass; private static String url; private static String user; private static String password; //1、加載驅動 static{ try { //加載屬性文件數據 Properties pop=new Properties(); pop.load(DBUtil2.class.getClassLoader().getResourceAsStream("db.properties")); url=pop.getProperty("jdbc.url"); driverclass=pop.getProperty("jdbc.driverclass"); user=pop.getProperty("jdbc.user"); password=pop.getProperty("jdbc.password"); Class.forName(driverclass); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new RuntimeException("加載驅動毛病",e); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //2、創立銜接 /* * 若何界說一個可以或許創立銜接的辦法 * 前往值類型:能否有運算成果,假如有,成果的類型即為前往值類型 * 參數列表: * 辦法功效中能否有不肯定的數據介入運算,假如有,即為參數 */ public static Connection getConnection() throws SQLException{ Connection conn= DriverManager.getConnection(url,user,password); return conn; } //3、封閉銜接 public static void close(Connection conn){ if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("封閉銜接毛病",e); } } } }