Java Database Connectivity:Java訪問數據庫的解決方案。
JDBC是Java應用程序訪問數據庫的里程碑式解決方案。Java研發者但願用相同的方式訪問不一樣的數據庫,以實現與具體數據庫無關的Java操做界面。
JDBC定義了一套標準接口,即訪問數據庫的通用API,不一樣的數據庫廠商根據各自數據庫的特色去實現這些接口。
JDBC中定義了一些接口:
一、驅動管理:
DriverManager
二、鏈接接口
Connection
DatabasemetaData
三、語句對象接口
Statement
PreparedStatement
CallableStatement
四、結果集接口
ResultSet
ResultSetMetaData
JDBC只定義接口,具體實現由各個數據庫廠商負責。
程序員使用時只須要調用接口,實際調用的是底層數據庫廠商的實現部分。
JDBC訪問數據庫的工做過程:
加載驅動,創建鏈接
建立語句對象
執行SQL語句
處理結果集
關閉鏈接
要使用JDBC接口,須要先將對應數據庫的實現部分(驅動)加載進來。
驅動類加載方式(Oracle):
Class.forName("oracle.jdbc.driver.OracleDriver");
這條語句的含義是:裝載驅動類,驅動類經過static塊實如今DriverManager中的「自動註冊」。java
Connection接口負責應用程序對數據庫的鏈接,在加載驅動以後,使用url、username、password三個參數,建立到具體數據庫的鏈接。
Class.forName("oracle.jdbc.OracleDriver") //根據url鏈接參數,找到與之匹配的Driver對象,調用其方法獲取鏈接 Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.0.26:1521:tarena", "openlab","open123");
須要注意的是:Connection只是接口,真正的實現是由數據庫廠商提供的驅動包完成的。程序員
Statement接口用來處理髮送到數據庫的SQL語句對象,經過Connection對象建立。主要有三個經常使用方法:
Statement stmt=conn.createStatement(); //1.execute方法,若是執行的sql是查詢語句且有結果集則返回true,若是是非查詢語句或者沒有結果集,返回false boolean flag = stmt.execute(sql); //2.執行查詢語句,返回結果集 ResultSetrs = stmt.executeQuery(sql); //3.執行DML語句,返回影響的記錄數 int flag = stmt.executeUpdate(sql);
執行查詢SQL語句後返回的結果集,由ResultSet接口接收。
經常使用處理方式:遍歷 / 判斷是否有結果(登陸)。
String sql = "select * from emp"; ResultSetrs = stmt.executeQuery(sql); while (rs.next()) { System.out.println(rs.getInt("empno")+",「 +rs.getString("ename") ); }
查詢的結果存放在ResultSet對象的一系列行中,指針的最初位置在行首,使用next()方法用來在行間移動,getXXX()方法用來取得字段的內容。sql
ResultSet表明DQL查詢結果,是2維結果. 其內部維護了一個讀取數據的遊標,默認狀況在,遊標在第一行數據以前, 當調用next() 方法時候, 遊標會向下移動,並將返回結果集中是否包含數據, 若是包含數據就返回true. 結果集還提供了很好getXXX方法用於獲取結果集遊標指向當前行數據.數據庫
原理:oracle
案例:工具
/** * 執行DQL 語句 */ public class Demo03 { public static void main(String[] args) throws Exception{ //註冊驅動 String driver="oracle.jdbc.OracleDriver";; Class.forName(driver); //鏈接數據庫 String url="jdbc:oracle:thin:@192.168.201.227:1521:orcl"; String user="openlab"; String pwd="open123"; Connection conn=DriverManager.getConnection( url, user, pwd); //建立Statement Statement st=conn.createStatement(); //執行SQL(dql) String sql="select id, name " + "from robin_demo "; ResultSet rs=st.executeQuery(sql); //處理結果 ... //rs結果集中包含一個遊標,遊標默認在結果集 //的第一行以前 //rs.next():移動結果集遊標到下一行 //檢查是否有數據, 若是有返回true, 不然false while(rs.next()){ //getXXX(列名): 返回結果集當前行中 // 指定列名的數據. int id = rs.getInt("id"); String name=rs.getString("name"); //輸出查詢結果 System.out.println(id+","+name); } //關閉鏈接 conn.close(); } }
Properties 是Java中專門用於讀取配置文件的API.url
Properties 經常使用API方法:spa
使用步驟:設計
案例, 讀取配置文件:指針
在resource 文件夾中添加配置文件 db.properties:
# db.properties jdbc.driver=oracle.jdbc.OracleDriver jdbc.url=jdbc:oracle:thin:@192.168.201.227:1521:orcl jdbc.username=openlab jdbc.password=open123
使用Properties讀取配置文件內容:
public class Demo05 { public static void main(String[] args) throws IOException{ // Properties 就是爲了讀取 // *.properties 文件而設計的API // 其底層就是文本文件IO // Properties 自己 實現 Map接口 // 內部是散列表, 限定了key和Value都是 // String 類型. //方法: load(流) 將文件就讀取爲散列表 //String getProperty(key) 查詢value //使用步驟 //1 建立 Properties 對象 Properties cfg = new Properties(); System.out.println(cfg); System.out.println(cfg.size()); System.out.println(cfg.isEmpty()); //2\. 利用load方法讀取文件 InputStream in= Demo05.class.getClassLoader() .getResourceAsStream("db.properties"); //執行之後,將文件內容讀取到散列表中了 cfg.load(in); System.out.println(cfg); System.out.println(cfg.size()); //3\. 查找文件內容, 就是讀取文件內容 String s= cfg.getProperty("jdbc.driver"); System.out.println(s); } }
利用配置文件能夠將程序中的參數保存到配置文件中, 修改程序參數只須要修改配置文件便可.
在軟件中數據庫鏈接使用很是頻繁, 若是每次都建立鏈接, 就會形成代碼的大量冗餘, 常規的作法是創建數據庫鏈接工具類, 封裝數據庫鏈接過程, 統一數據庫鏈接過程, 使用時候就能夠簡化代碼.
實現步驟:
建立DbUtils.java 封裝數據庫鏈接方法
# db.properties jdbc.driver=oracle.jdbc.OracleDriver jdbc.url=jdbc:oracle:thin:@192.168.201.227:1521:orcl jdbc.username=openlab jdbc.password=open123
public class DbUtils { static String driver; static String url; static String username; static String password; //讀取文件中的數據庫鏈接參數 static{ //初始化靜態屬性 //1\. 利用Properties 讀取配置文件 //2\. 從配置文件中查找 相應參數值 try{ Properties cfg=new Properties(); InputStream in= DbUtils.class.getClassLoader() .getResourceAsStream("db.properties"); cfg.load(in); System.out.println(cfg); //初始化 鏈接參數 driver=cfg.getProperty("jdbc.driver"); url=cfg.getProperty("jdbc.url"); username=cfg.getProperty("jdbc.username"); password=cfg.getProperty("jdbc.password"); in.close(); }catch(Exception e){ e.printStackTrace(); throw new RuntimeException(e); } } /** * 封裝建立數據庫鏈接的過程 * 簡化數據庫鏈接 */ public static Connection getConnection(){ try{ Class.forName(driver); Connection conn= DriverManager.getConnection( url, username, password); return conn; }catch(Exception e){ e.printStackTrace(); throw new RuntimeException(e); } } //DbUtils.java /* * 關閉數據庫的鏈接方法, 封裝複雜的關閉過程 */ public static void close(Connection conn){ if(conn!=null){ try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
說明:
public class Demo06 { public static void main(String[] args) { Connection conn=null; try{ conn=DbUtils.getConnection(); Statement st=conn.createStatement(); String sql="select * from robin_demo"; ResultSet rs=st.executeQuery(sql); while(rs.next()){ int id=rs.getInt("id"); String name=rs.getString("name"); System.out.println(id+","+name); } rs.close();//釋放查詢結果 st.close();//釋放語句對象 }catch(Exception e){ e.printStackTrace(); }finally { DbUtils.close(conn); } } }
顯然: 使用DbUtils能夠簡化JDBC代碼的書寫.
這個代碼中在finally中關閉數據庫鏈接, 其好處是可靠關閉鏈接.
最後,若是你們對這些內容感興趣的話能夠持續關注我,天天都有更新喔~
固然,須要以往的內容也能夠找我閱讀哦,我這裏都整合起來了方便你們閱讀,詳情點擊這裏!!!