简化jdbc操作,不用提供连接池或连接对象而操作数据库(JdbcUtils+TxQueryRunner)

JdbcUtils用来获取Connection对象,以及开启和关闭事务。

  1. Connection getConnection():从c3p0连接池获取Connection对象,所以需要提供c3p0-config.xml配置文件;
  2. beginTransaction():为当前线程开启事务;
  3. commitTransaction():提交当前线程的事务;
  4. rollbackTransaction():回滚当前线程的事务;
  5. releaseConnection(Connection):如果参数连接对象不是当前事务的连接对象,那么关闭它,否则什么都不做;

TxQueryRunner类是common-dbutils下QueryRunner类的子类,用来简化JDBC操作。TxQueryRunner类内部使用了JdbcUtils.getConnection()类来获取连接对象(即TxQueryRunner类需要JdbcUtils类配合使用),以及使用JdbcUtils.releaseConnection()关闭连接。

  1. int[] batch(String sql, Object[][] params):执行批处理,参数sql是SQL语句模板,params为参数;
  2. T query(String sql, ResultSetHandler<T> rh):执行查询,执行查询,参数sql为要执行的查询语句模板,rh是结果集处理,用来把结果集映射成你想要的结果;
  3. T query(String sql, ResultSetHandler<T> rh, Object… params):执行查询,参数sql为要执行的查询语句模板,rh是结果集处理,用来把结果集映射成你想要的结果,params是sql语句的参数;
  4. int update(String sql):执行增、删、改语句,参数sql是要执行的SQL语句;
  5. int update(Stringsql, Object param):执行增、删、改语句,参数sql是要执行的SQL语句,参数param是参数(一个参数);
  6. 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();//提交事务
	}
}
发布了247 篇原创文章 · 获赞 53 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_42391248/article/details/103915391
今日推荐