事务、连接池和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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章