代碼重構DBUtils工具類
1)連接管理起來(static方法)
2)資源關閉
how:
1.註冊驅動 三種方式(a. DriverManager.registerDriver(new com.mysql.jdbc.Driver())
b. Class.ForName("com.mysql.jdbc.Driver") 常用這一種
c. java -Djdbc.drivers=com.mysql.jdbc.Driver.FirstJDBC)
三種方式的區別
Class.ForName("..");是通過字節碼文件 .class (在硬盤)在JVM上創建類對象
DriverManager.registerDriver(new com.mysql.jdbc.Driver())的對象是 new 出來的
2.獲取數據庫連接
Connection conn = DriverManager.getConnection(url, username, password);
3.創建Statement對象
Statement stmt = conn.createStatement();
預編譯語句 PreparedStatement pstmt = conn.createPreparedStatement(); 優點 提高效率?sql語句可以重複利用?結構相同 可以批量地處理數據,使用 ?作佔位符,在執行sql語句之前必須輸入參數
pstmt.setString(1,"..");
.....
pstmt.executeUpdate();
pstmt.clearParameter();
CallableStatement
調用存儲過程(部署在數據庫)真正的批處理
procedure
begin
....
end
缺點: 可移植性比較差
4.執行(發送)sql語句
select : ResultSet rs = stmt.executeQuerry(sql);
ResultSet rs = pstmt.execute();
update/insert into/ delete : 返回一個整數 (smst.executeUpdate(sql))
5.處理結果集
select : while(rs.next()){....}
6.關閉JDBC資源
逆序關閉 rs stmt/pstmt conn
處理結果集
select : ResultSet rs = stmt.executeQuerry(sql) 一個Statement對象在某一時刻只能有一個ResultSet對象,意味着必須處理上一次查詢結果後才能做下一個查詢
update/insert into/ delete : int n = stmt.executeUpdate(sql) 如果執行的是DDL,則返回0
ResultSet接口
重載的兩個方法:
1)String getString(int columnIndex)
2)String getString(String columnIndex)
在不知道sql語句類型的情況下 boolean execute(String sql) 返回布爾值
如果第一結果是ResultSet對象,返回true
如果是更新計數或不存在任何結果,返回false
CallableStatement
作用:執行存儲過程 (效率高,可移植性差)
設置OUT和IN參數: in:參數從Java程序傳到數據庫的存儲過程
out:參數從數據庫傳到JAVA程序的存儲過程
存儲過程
不同數據庫管理系統有各自定義的存儲過程的方式
--mysql
delimiter //
drop procedure procedure_name;// --刪除已有的存儲過程
create procedure procedure_name(in p_字段, ...)
begin
insert into table_name(字段, ...)values(p_字段, ...)
commit;
select count(*) into total from table_name where 字段 = p_字段 and ... and ...
end;//
delimiter;
java程序調用存儲過程
java數據類型和DBMS數據類型相互對應
3NF
List隊列和泛型的結合使用
List<類型> list = new ArrayList<類型>();
把數據添加到List隊列中 list.add(數組名);
構造器(無參和有參)的作用?
初始化