JDBC加強拓展
預編譯SQL語句對象
PreparedStatement
概念
(1) Statement:靜態的sql對象
-
字符串拼接
-
sql注入,安全問題
-
sql執行的時候才發送到數據庫
(2) PreparedStatement:sql預編譯對象
4. 創建PreparedStatement:就會把sql發送到mysql[效率更高]
- 解決Sql注入問題
(3) PreparedStatement:是Statement的一個子接口
-
繼承關係:也會有Statement,方法和特點
-
子接口可以拓展父接口,有自己的特性…特有方法!
(4) 使用PreparedStatement
① 添加事務
② mysql有個叫SQL_SAFE_UPDATES的變量,爲了數據庫更新操作的安全性
1) 設置安全參數:如果update語句,沒有加where限制條件,不許改!
a. SET SQL_SAFE_UPDATES=0; Mysql 設置[缺省session,當前查詢窗口生效]
b. set global sql_safe_updates = 1; Mysql 設置[MySql全局生效]
(5) 拿到主鍵
Connection conn = JDBCUtilDataSource.getIns().getConn();
try {
// RETURN_GENERATED_KEYS 該常量指示生成的鍵應該可用於獲取。
PreparedStatement ps = conn.prepareStatement("insert into account (name,money) values(?,?)",Statement.RETURN_GENERATED_KEYS);
ps.setString(1, a.getName());
ps.setDouble(2, a.getMoney());
ps.execute();
//得到返回的主鍵的集合
ResultSet rs = ps.getGeneratedKeys();
while(rs.next()){
System.out.println(rs.getLong(1));
}
JDBCUtilDataSource.getIns().close(null, ps, conn);
} catch (SQLException e) {
e.printStackTrace();
}
(6) PreparedStatement相較Statement使用上面的優勢
① 字符串不用拼接
② 預編譯:執行效率更高
③ 解決Sql注入的問題
事務
概念
在數據庫中,所謂事務是指一組邏輯操作單元,使數據從一種狀態變換到另一種狀態。
簡單理解:程序裏面的一組操作,要不都成功,要不都失敗;
innodb:支持事務 myisam:不支持事務
事務的操作:先定義開始一個事務,然後對數據作修改操作,這時如果提交(commit),這些修改就永久地保存下來,如果回退(rollback,rollback放在catch裏面前面代碼不成功時執行),數據庫管理系統將放棄所作的所有修改而回到開始事務時的狀態。
事務的ACID屬性
原子性:指整個事務是不可以分割的工作單元(一組操作不可分割)
一致性:指數據庫事務不能破壞關係數據的完整性以及業務邏輯上的一致性(數據前後需要一致)
隔離性:併發編程的時候,多個線程之間的操作不會相互影響
持久性:只要事務成功結束,就將內存中的數據持久化磁盤
處理事務兩個動作
提交(commit):當整個事務中,所有的邏輯單元都正常執行成功。(在JDBC中<事務是默認提交的,必須先設置事務爲手動提交(false))
---->提交事務。—數據已經提交,不能更改。
回滾(rollback):當整個事務中,有一個邏輯單元執行失敗。 (抓取異常時放在catch裏面)
---->回滾事務。撤銷該事務中的所有操作—>恢復到最初的狀態。
連接池
概念
連接池(connection)就是用來裝連接對象的容器,用來維護和管理連接對象
簡單理解:最開始的時候就創建一些連接對象放到連接池中,請求來了可以直接在連接池中獲取連接 操作數據庫,操作完成以後,釋放連接回到連接池,等待下一次被請求使用
初始的時候:創建了一些連接,最小連接數
請求併發的時候:創建更多的連接,最大連接
優點:節約內存資源,維護連接對象的生命週期
常見連接池
dbcp(spring集成) druid(常用) c3p0
獲取連接
//創建一個Properties對象
Properties prop = new Properties();
//讀取Properties配置文件
prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"))
//通過BasicDataSource實現類創建連接池(實現DataSource接口)
DataSource ds = BasicDataSourceFactory.createDataSource(prop);
//獲取Connection鏈接
Connection conn=ds.getConnection();
注:BasicDataSource類創建連接池,資源配置文件需嚴格按照相應命名規範書寫
分類 | 屬性 | 描述 |
---|---|---|
必須項 | driverClassName | 數據庫驅動名稱 |
必須項 | url | 數據庫地址 |
必須項 | username | 用戶名 |
必須項 | password | 密碼 |
擴展項 | maxActive | 連接池最大連接數 |
擴展項 | maxIdle | 連接池最大空閒數 |
擴展項 | minIdle | 連接池最小空閒數 |
擴展項 | initialSize | 初始化連接池時連接數 |