JdbcUtils用来获取Connection对象,以及开启和关闭事务。
- Connection getConnection():从c3p0连接池获取Connection对象,所以需要提供c3p0-config.xml配置文件;
- beginTransaction():为当前线程开启事务;
- commitTransaction():提交当前线程的事务;
- rollbackTransaction():回滚当前线程的事务;
- releaseConnection(Connection):如果参数连接对象不是当前事务的连接对象,那么关闭它,否则什么都不做;
TxQueryRunner类是common-dbutils下QueryRunner类的子类,用来简化JDBC操作。TxQueryRunner类内部使用了JdbcUtils.getConnection()类来获取连接对象(即TxQueryRunner类需要JdbcUtils类配合使用),以及使用JdbcUtils.releaseConnection()关闭连接。
- int[] batch(String sql, Object[][] params):执行批处理,参数sql是SQL语句模板,params为参数;
- T query(String sql, ResultSetHandler<T> rh):执行查询,执行查询,参数sql为要执行的查询语句模板,rh是结果集处理,用来把结果集映射成你想要的结果;
- T query(String sql, ResultSetHandler<T> rh, Object… params):执行查询,参数sql为要执行的查询语句模板,rh是结果集处理,用来把结果集映射成你想要的结果,params是sql语句的参数;
- int update(String sql):执行增、删、改语句,参数sql是要执行的SQL语句;
- int update(Stringsql, Object param):执行增、删、改语句,参数sql是要执行的SQL语句,参数param是参数(一个参数);
- int update(String sql, Object… params):执行增、删、改语句,参数sql是要执行的SQL语句,参数params是参数(多个参数);
配合使用的效果:
处理事务更简单,操作数据库更简单。
/**
* 测试TxQueryRunner
* TxQueryRunner它是QueryRunner的子类!(commons-dbutils.jar)
* 可以起来与QueryRunner相似的!
* 我们的类支持事务!它底层使用了JdbcUtils来获取连接!
*
* 简化jdbc操作
* QueryRunner的三个方法:
**update() --> insert、update、delete
**query() --> select
**batch() -->批处理
*
*/
public class PersonDao {
private QueryRunner qr = new TxQueryRunner();
public void add(Person person) throws SQLException {
String sql = "insert into t_person values(?,?,?,?)";
Object[] params = {person.getPid(),
person.getName(),
person.getAge(),
new java.sql.Date(person.getBirthday().getTime())};//给sql中对应的参数
qr.update(sql, params);//我们没有给对象提供提供连接池,执行sql,也不提供连接,它内部会使用JdbcUtils来获取连接
}
public void edit(Person person) throws SQLException {
String sql = "update t_person set name=?,age=?,birthday=? where pid=?";
Object[] params = {
person.getName(),
person.getAge(),
new java.sql.Date(person.getBirthday().getTime()),
person.getPid()};
qr.update(sql, params);
}
public void delete(String pid) throws SQLException {
String sql = "delete from t_person where pid=?";
qr.update(sql, pid);
}
public Person load(String pid) throws SQLException {
String sql = "select * from t_person where pid=?";
return qr.query(sql, new BeanHandler<Person>(Person.class), pid);
}
public List<Person> findAll() throws SQLException {
String sql = "select * from t_person";
return qr.query(sql, new BeanListHandler<Person>(Person.class));
}
}
/**
* 测试JdbcUtils类
* @author qdmmy6
*
*/
public class JdbcUtilsTest {
/**
* 通过C3P0连接池获取连接对象
* @throws SQLException
*/
@Test
public void testGetConnection() throws SQLException {
Connection con = JdbcUtils.getConnection();//获取连接
System.out.println(con);
JdbcUtils.releaseConnection(con);//如果参数con不是当前线程的连接对象,那么关闭之
}
/**
* 当开始事务后,调用getConnection()会为当前线程创建Connection,而且多次调用getConnection()返回的是同一个对象
* @throws SQLException
*/
@Test
public void testTansaction() throws SQLException {
JdbcUtils.beginTransaction();//开启事务
Connection c1 = JdbcUtils.getConnection();//第一次获取当前线程的事务连接对象
Connection c2 = JdbcUtils.getConnection();//第二次获取当前线程的事务连接对象
Assert.assertEquals(true, c1 == c2);//比较两次是否相同
JdbcUtils.commitTransaction();//提交事务
}
}