標籤:.exe 沒有 lips creat 並且 分析 data row 釋放
程式是通過DriverManager註冊驅動,所以載入之後可以直接使用DriverMannager
mysql中的多態:
不僅是賦值的時候使用了多態,返回的時候都是返回的借口(不是返回的子類對象),所以如果不使用多態需要強轉通過Java代碼去操作資料庫
JDBC ----- Java 資料庫 串連JDBC是java提供的資料庫連接規範
J ----- Java
DB ----- DataBase
C ----- Connectivity
使用JDBC
A.JDK 本身沒有實現資料庫連接的功能
第三方實現了MySQL與Java的串連,並且打包成jar包
我們要下載jar包,並且將jar包匯入到當前項目
B.擷取串連 資料庫連接的原理就是一個Socket
在Eclipse的Java程式與MySQL之間建立一個管道
註冊驅動:Class.forName("com.mycql.jdbc.Driver") 最常用的方法
獲得串連:
Connection con = DriverManager.getConnection(url,"帳號","密碼")
這是個面向介面的編程,返回的是java中的父類Connection,建立的是mysql中實作類別的對象
url 作用:用來定位元據庫
jdbc:mysql://localhost:3306/database
jdbc:mysql: mysql資料庫協議
localhost IP地址,定位一台電腦
3306 連接埠號碼:定位MySQL程式
database 定位MySQL的一個資料庫
C.在串連上建立代理對象
Statement sta = con.createStatement();
編寫SQL語句並執行
sta.executeXxx("SQL語句")
處理執行結果
D.釋放資源 程式與外部互動都需要關閉資源,關閉資源之後資料庫的資料才能進行其它操作
關閉順序,後建立的先關閉
rs.close()
sta.close()
con.close()
載入驅動的方式將驅動類載入進記憶體
1.Class.forName("驅動名")
2.new Driver() 需要導包
3.DriverManager.registerDriver(new Driver()) 需要導包
4.System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver")
2.3兩種方式不常用
原因1:
類載入時,會自己使用方式3進行註冊(Driver類中的靜態代碼塊)
方式2額外建立了一個無用對象
方式3重複載入驅動
原因2:
常見的情況是,開發使用MySQL資料庫,部署使用Oracle資料庫
如果是方式2.3,需要頻繁改變匯入的包名
方式1可以將驅動名配置進設定檔//返回的都是java中本身的介面規範,所以不需要導包
Statement 執行代理對象的使用(用於代理固定了的SQL語句)
A.ResultSet rs = Statement.executeQuery("select * form ...") 執行查詢的語句,返回一個查詢到的結果集
ResultSet 封裝了查詢到的若干條資料
用法:
while(rs.next()){
rs.getObject("欄位名");
rs.getObject(int indext); 欄位索引,從第一行第一列開始
}
注意:Java中的索引一般從0開始,但是JDBC中的索引從1開始
B. int line = Statement.executeUpdate("insert into 表名 欄位=值 where...")
用於執行增刪改操作的SQL語句,返回的是此操作改變了多少條資料
C. execute方法可以區別是查詢還是修改語句
傳回值是true則是select語句,否則是修改語句
PrepareStatement是Statement的子類
SQL語句的預先處理對象
在SQL語句中可以用 ? 作為預留位置,之後補齊(站位符只能用於屬性值的地方,會逐個分析傳入字元,轉義非法字元,去掉最外層單引號)
1.擷取執行對象
PrepareStatement pst = con.prepareStatement(SQL語句)
2.補齊預留位置
pst.setObject(int indext, value)
Object的類型要和value的類型保持一致
3.執行SQL語句
pst.executeQuery()
pst.executeUpdate()
優點:
A.功能更強大,比如可以插入一些特殊字元
B.執行效率更高,因此稱之為預定義的Statement(在獲得串連的時候就已經準備執行了)
註冊驅動,獲得串連,關閉資原始碼重複,封裝
JDBCUtils
public class JDBCUtils {
//註冊驅動只需要註冊一次
static {
Class.forName("com.mysql.jdbc.Driver")
}
//封裝獲得串連
public static Connection getCon(){
Connection con = null;
try{
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/database",賬戶,密碼);
} catch (Exception e) {
//發生了異常一定讓程式停止,因為沒有獲得串連(拋運行時異常結束java虛擬機器)
e.printStackTrace();
throw new RuntimeException();
}
return con;
}
public static void close(ResultSet rs,Statement sta,Connection con){
//要列印自訂資訊,在異常的構造方法中的有參構造,建立異常對象的時候就給出資訊,catch到處理的時候列印
//判斷是不是不等於空,避免null 指標,沒有對象的時候不需要關閉,一定要釋放資源,不然會影響資料的操作
if(rs != null){
try{
rs.close();
} catch (Exception e) {
System.out.println(e.getMessage);
}
}
sta.close();
con.close(); //同理try\catch關閉資源
}
}
JDK 中的 JDBC 設計
A:JDBC 中大量的使用了多態
全是介面,就是定義了規則,供各種資料庫實現此規則,但都是介面層次,不用改源碼
Connection 使用
Statement 使用
ResultSet 使用
B:真正的實現全在各種資料庫自己封裝的jar包中
不使用多態的時候:
1.程式一樣運行
2.缺點:更換jar包是,所有對應的導包實現都得修改
多態體現在Jar包更換上,使用了多態,實現了一種可插拔設計
介面相當於是一種規範,jar包中類實現了介面,遵守規範完成某種操作
mysql的JDBC串連