1、JDBC簡介
java
JDBC,Java Ddatabase Connection,Java數據庫鏈接。mysql
Sun公司爲了簡化、統一對數據庫的操做,定義了一套Java操做數據庫的規範,稱之爲JDBC。程序員
什麼是驅動?兩個設備要進行通訊,知足必定通訊數據格式,數據格式由設備提供商規定,設備提供商爲設備提供驅動軟件,經過軟件能夠與該設備進行通訊。sql
若是沒有JDBC,Java程序員須要面向各個數據庫驅動接口編程,開發複雜;sun公司提供一套統一JDBC接口規範,Java程序只須要使用JDBC就能夠操做任何數據庫,JDBC實現類由各個數據庫廠商提供。數據庫
1.組成JDBC的2個包:java.sql和javax.sql。編程
DriverManger驅動管理類、Connection鏈接接口、Statement(PreparedStatement、CallableStatement)數據庫操做、ResultSet結果集。併發
2.開發jdbc應用須要以上2個包外,還須要導入相應JDBC的數據庫實現。oracle
2、JDBC快速入門
ide
建立一個user表url
create table user( id int primary key auto_increment, username varchar(20) unique not null, password varchar(20) not null, email varchar(40) not null );
package cn.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import com.mysql.jdbc.Driver; public class Test1 { public static void main(String[] args) throws Exception { //加載數據庫驅動 DriverManager.registerDriver(new Driver()); //獲取鏈接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root"); //建立用於向數據庫發送SQL的Statement對象,併發送SQL Statement stat = conn.createStatement(); //從結果集中取出數據 String sql = " select * from user "; ResultSet rs = stat.executeQuery(sql); while(rs.next()){ System.out.println(rs.getInt(1)+","+rs.getString(2)+","+rs.getString(3)+","+rs.getString(4)); } //斷開數據庫的鏈接,並釋放相關資源 rs.close(); conn.close(); } }
3、JDBC編程步驟
4、JDBC訪問數據庫的流程
5、JDBC API詳解
5.1DriverManager類
jdbc程序中的DriverManager用於加載驅動,並建立和數據庫的鏈接,這個API的經常使用方法:
DriverManager.registerDriver(new Driver); DriverManager.getConnection(url,username,password);
注意,在實際開發中並不推薦採用registerDriver方法註冊驅動,緣由有二:
1)查看Driver的源代碼能夠看出,若是採用此種方式,會致使驅動程序註冊兩次,也就是在內存中會有兩個Driver對象。
package com.mysql.jdbc; import java.sql.DriverManager; import java.sql.SQLException; public class Driver extends NonRegisteringDriver implements java.sql.Driver { static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } }
2)程序依賴MySQL的API,脫離MySQL的jar包,程序將沒法編譯,未來程序切換底層數據庫將會很是麻煩。
推薦方式:class.forName("com.mysql.jdbc.Driver");
採用此種方式不會致使驅動對象在內存中重複出現,而且採用此種方式,程序僅僅只須要一個字符串,不須要依賴具體的驅動,使得程序的靈活性更高。
一樣,在開發中也不建議採用具體的驅動類型指向getConnection方法返回的Connection對象。
5.2數據庫URL
URL用於標識數據庫的位置,程序員經過URL地址告訴JDBC程序鏈接那個數據庫,URL的寫法爲:
經常使用數據庫URL的地址的寫法:
oracle jdbc:oracle:thin:@localhost:1521:sid mysql jdbc:mysql://localhost:3306/sid
經常使用屬性:useUnicode=true&characterEncoding=UTF-8
5.3Connection鏈接接口
應用一:獲取SQL的操做對象
Statement stat = conn.createSteatement() 該對象能夠將SQL發送給數據庫進行執行
PreparedStatement pstmt = conn.prepareStatement(String sql) 對SQL語句進行預編譯,防止SQL注入
CallableStatement cstmt = conn.prepareCall(String sql) 該對象能夠調用數據庫中存儲過程
應用二:對數據庫事務進行管理
conn.setAutoCommit(boolean flag) 設置事務是否自動提交
conn.commit() 提交數據庫事務
conn.rollback() 回滾數據庫事務
5.4Statement 用於將SQL發送給數據庫,獲取操做結果
jdbc程序中的Statement對象用於向數據庫發送SQL語句,Statement對象經常使用方法::
executeQuery(String sql) 用於向數據發送查詢語句
executeUpdate(String sql) 用於向數據庫發送insert、update或delete語句
execute(String sql) 用於向數據庫發送任意SQL語句
addBatch(String sql) 把多條SQL語句放到一個批處理中
executeBatch() 向數據庫發送批處理執行
5.5ResultSet
jdbc程序中採用的ResultSet用於表明SQL語句的執行結果。ResultSet封裝執行結果的時候,採用相似於表格的方式。ResultSet對象維護了一個指向表格數據行的遊標,初始化的時候,遊標在第一行以前,調用next()方法,可使得遊標指向具體的數據行,進而調用方法獲取該行數據。
resultSet既然用於封裝執行結果,因此該對象提供的大部分方法都是用獲取數據的get方法:
獲取任意類型的數據
getObject(int index) getObject(String columnName)
獲取指定類型的數據
getString(int index) getString(String columnName)
5.6釋放資源
jdbc程序運行完畢後,切記要釋放程序在運行過程當中,建立的那些與數據庫進行交互的對象,這些對象一般是ResultSet、Statement和Connection對象。
特別是Connection對象,它是很是稀有的資源,用完後必須立刻釋放,若是Connection不能及時、正確的關閉,極易致使系統宕機。Connection的使用原則是儘可能晚建立,儘可能早的釋放。
爲確保資源釋放代碼能運行,資源釋放代碼也必定要放在finally語句中。
6、JDBC完成CRUD示例
增長:
private static void create() throws Exception { //加載數據庫驅動 Class.forName("com.mysql.jdbc.Driver"); //獲取鏈接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root"); //建立用於向數據庫發送SQL的Statement對象,併發送SQL Statement stat = conn.createStatement(); String sql = " insert into user (username,password,email) values('哈哈','haha','hah@163.com') "; int rows = stat.executeUpdate(sql); if(rows > 0){ System.out.println("執行增長完畢"); } //斷開數據庫的鏈接,並釋放相關資源 conn.close(); }
刪除
private static void delete() throws Exception { //加載數據庫驅動 Class.forName("com.mysql.jdbc.Driver"); //獲取鏈接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root"); //建立用於向數據庫發送SQL的Statement對象,併發送SQL Statement stat = conn.createStatement(); String sql = " delete from user where username = '哈哈'; "; int rows = stat.executeUpdate(sql); if(rows > 0){ System.out.println("執行刪除完畢"); } //斷開數據庫的鏈接,並釋放相關資源 conn.close(); }
修改
private static void update() throws Exception { //加載數據庫驅動 Class.forName("com.mysql.jdbc.Driver"); //獲取鏈接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root"); //建立用於向數據庫發送SQL的Statement對象,併發送SQL Statement stat = conn.createStatement(); String sql = " update user set email = '123@163.com' where id = 1 "; int rows = stat.executeUpdate(sql); if(rows > 0){ System.out.println("執行修改完畢"); } //斷開數據庫的鏈接,並釋放相關資源 conn.close(); }
查詢
//加載數據庫驅動 Class.forName("com.mysql.jdbc.Driver"); //獲取鏈接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root"); //建立用於向數據庫發送SQL的Statement對象,併發送SQL Statement stat = conn.createStatement(); //從結果集中取出數據 String sql = " select * from user "; ResultSet rs = stat.executeQuery(sql); while(rs.next()){ System.out.println(rs.getInt(1)+","+rs.getString(2)+","+rs.getString(3)+","+rs.getString(4)); } //斷開數據庫的鏈接,並釋放相關資源 rs.close(); conn.close();
7、DAO模式
DAO模式(Data Access Object 數據庫訪問對象),在持久成經過DAO將數據源操做徹底封裝起來,業務層經過Java對象,完成對數據源操做。