JDBC加強拓展

JDBC加強拓展

預編譯SQL語句對象

PreparedStatement
概念

(1) Statement:靜態的sql對象

  1. 字符串拼接

  2. sql注入,安全問題

  3. sql執行的時候才發送到數據庫

(2) PreparedStatement:sql預編譯對象
4. 創建PreparedStatement:就會把sql發送到mysql[效率更高]

  1. 解決Sql注入問題

(3) PreparedStatement:是Statement的一個子接口

  1. 繼承關係:也會有Statement,方法和特點

  2. 子接口可以拓展父接口,有自己的特性…特有方法!

(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 初始化連接池時連接數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章