事務、連接池和DBUtils

1.事務

1.1 事務的四大特性是:

 原子性(Atomicity):原子性。
 一致性(Consistency):事務執行後,數據庫狀態與其它業務規則保持一致。
 隔離性(Isolation):併發中的多個事務不會相互干擾。
 持久性(Durability):一旦事務提交成功,事務中所有的數據操作都必須被持久化到數據庫中。

1.2 jdbc事務

在jdbc中處理事務,都是通過Connection完成的!
同一事務中所有的操作,都在使用同一個Connection對象!

jdbc處理事務的代碼格式:
try {
  con.setAutoCommit(false);//開啓事務…(true:設置爲自動提交事務).
  con.commit();//try的最後提交事務
} catch() {
  con.rollback();//回滾事務
}

2.數據庫連接池

在這裏插入圖片描述

2.1 DBCP連接池

commons-pool.jar
commons-dbcp.jar

import org.apache.commons.dbcp.BasicDataSource;

...
BasicDataSource ds = new BasicDataSource();
ds.setUsername("root");
ds.setPassword("123");
ds.setUrl("jdbc:mysql://localhost:3306/mydb1");
ds.setDriverClassName("com.mysql.jdbc.Driver");

ds.setMaxActive(20); 
ds.setMaxIdle(10); 
ds.setInitialSize(10) ;

// 使用
Connection con = ds.getConnection();

2.2 C3P0 連接池

c3p0-0.9.2-pre1.jar
mchange-commons-0.2.jar
(1)手動配置

ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1");
ds.setUser("root");
ds.setPassword("123");
ds.setDriverClass("com.mysql.jdbc.Driver");
 		
ds.setAcquireIncrement(5) ;
ds.setInitialPoolSize(20) ;
ds.setMinPoolSize(2) ;
ds.setMaxPoolSize(50) ;
		
Connection con = ds.getConnection();

(2)配置文件
配置文件可以是properties,也可以是xml。(可用於提供多個配置信息)
配置文件要求:
 文件名稱:必須叫c3p0-config.xml
 文件位置:必須在src下
使用:

ComboPooledDataSource ds = new ComboPooledDataSource();
Connection con = ds.getConnection();

(3)Tomcat配置連接池
在server.xml中,或在conf/catalina/localhost/下創建xml文件

獲取Tomcat資源
Context cxt = new InitialContext(); 
DataSource ds = (DataSource)cxt.lookup("java:/comp/env/myc3p0");
Connection con = ds.getConnection();

3.ThreadLocal

ThreadLocal類只有三個方法:

  • void set(T value):保存值;
  • T get():獲取值;
  • void remove():移除值。

ThreadLocal內部其實是個Map來保存數據。雖然在使用ThreadLocal時只給出了值,沒有給出鍵,其實它內部使用了當前線程做爲鍵。

class MyThreadLocal<T> {
	private Map<Thread,T> map = new HashMap<Thread,T>();
	public void set(T value) {
		map.put(Thread.currentThread(), value);
	}
	
	public void remove() {
		map.remove(Thread.currentThread());
	}
	
	public T get() {
		return map.get(Thread.currentThread());
	}
}

在這裏插入圖片描述

4. DBUtils包

DBUtils是對JDBC的簡單封裝,Jar包:dbutils.jar

QueryRunner:

  • update():執行insert、update、delete;
int update(Connection con, String sql, Object… params)
int update(String sql, Object… params)
@Test
public void fun1() throws SQLException {
	QueryRunner qr = new QueryRunner();
	String sql = "insert into user values(?,?,?)";
	qr.update(JdbcUtils.getConnection(), sql, "u1", "zhangSan", "123");
}

@Test
public void fun2() throws SQLException {
	QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
	String sql = "insert into user values(?,?,?)";
	qr.update(sql, "u1", "zhangSan", "123");
}
  • ResultSetHandler:把ResultSet轉換成目標類型的接口
// 實現類
MapHandler:單行處理器!把結果集轉換成Map<String,Object>,其中列名爲鍵!
MapListHandler:多行處理器!把結果集轉換成List<Map<String,Object>>;
BeanHandler:單行處理器!把結果集轉換成Bean,該處理器需要Class參數,即Bean的類型;
BeanListHandler:多行處理器!把結果集轉換成List<Bean>;
ColumnListHandler:多行單列處理器!把結果集轉換成List<Object>,使用ColumnListHandler時需要指定某一列的名稱或編號,例如:new ColumListHandler(“name”)表示把name列的數據放到List中。
ScalarHandler:單行單列處理器!把結果集轉換成Object。一般用於聚集查詢,例如select count(*) from tab_student。
  • query():執行select語句;
public <T> T query(String sql, ResultSetHandler<T> rh, Object… params)
public <T> T query(Connection con, String sql, ResultSetHandler<T> rh, Object… params)
  • batch():執行批處理。
    更新一行記錄時需要指定一個Object[]爲參數,如果是批處理,那麼就要指定Object[][]爲參數了。即多個Object[]就是Object[][]了,其中每個Object[]對應一行記錄
@Test
public void fun10() throws SQLException {
	DataSource ds = JdbcUtils.getDataSource();
	QueryRunner qr = new QueryRunner(ds);
	String sql = "insert into tab_student values(?,?,?,?)";
	Object[][] params = new Object[10][];  //表示 要插入10行記錄
	for(int i = 0; i < params.length; i++) {
		params[i] = new Object[]{"S_300" + i, "name" + i, 30 + i, i%2==0?"男":"女"};
	} //參數值
	qr.batch(sql, params);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章