TxQueryRunner类是common-dbutils下QueryRunner类的子类,用来简化JDBC操作。TxQueryRunner类内部使用了JdbcUtils.getConnection()类来获取连接对象,以及使用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,在test数据库下创建person表:
表person:
测试代码:
测试update方法
public class TxQueryRunnerTest { /** * 测试update方法 * @throws SQLException */ @Test public void testUpdate() throws SQLException { String sql="insert into person(pid, pname, age) values(?,?,?)"; Object[] params = {"1","p1", "18"};//给sql中对应的参数 QueryRunner qr = new TxQueryRunner();//没有给对象提供连接池 qr.update(sql, params); } //使用事务 @Test public void testUpade2() throws Exception{ try { JdbcUtils.beginTransaction(); String sql="insert into person(pid, pname, age) values(?,?,?)"; QueryRunner qr = new TxQueryRunner(); Object[] params = {"2","p2", "18"}; qr.update(sql,params);//执行 /*取消注释,演示抛出异常时,事件回滚情况 if(true){ throw new Exception(); } */ params = new Object[]{"3","p3", "18"}; qr.update(sql, params);//执行 JdbcUtils.commitTransaction();//提交事务 } catch (Exception e) { try { JdbcUtils.rollbackTransaction();//回滚事件 } catch (SQLException e1) { } /*throw e;*/ } } }
执行结果
测试query方法
public class TxQueryRunnerTest { /** * 测试查询方法 * 我们知道jdbc查询的结果是ResultSet * 而QueryRunner查询的结果是通过ResultSet映射后的数据。 * QueryRunner第一步是执行select,得到ResultSet * 把ResultSet转换成其他类型 * 通过转换结果: * JavaBean:把结果集封装到JavaBean中 * Map:把结果集封装到Object中(结果集是当行单列) * @throws SQLException * */ //单行结果集映射到javaBean中 @Test public void testQuery1() throws SQLException{ String sql = "select * from person where pid=?"; QueryRunner qr = new TxQueryRunner(); /* * 第二个参数类型为ResultSetHandler,它是一个接口,表示映射的结果类型 * BeanHandler → 它是ResultSetHandler的实现类,它的作用是把结果集封装到person对象中 * 注意:结果集的列名与person的属性名必须相同 */ Person p = qr.query(sql, new BeanHandler<Person>(Person.class),"1"); System.out.println(p); } /** * 使用BeanListhandler * 把多行结果集映射到List<Bean>,即多个JavaBean对象 * 一行结果集记录对应一个JavaBean对象,多行就对应List<Bean> * @throws SQLException */ @Test public void testQuery2() throws SQLException { String sql = "select * from person"; QueryRunner qr = new TxQueryRunner(); /* * 第二个参数类型为ResultSetHandler,它是一个接口,表示映射的结果类型 * BeanHandler → 它是ResultSetHandler的实现类, * 它的作用是把结果集封装到List<person>对象中 * 注意:结果集的列名与person的属性名必须相同 */ List<Person> list = qr.query(sql, new BeanListHandler<Person>(Person.class)); System.out.println(list); } }
testQuery1()
testQuery2()
public class TxQueryRunnerTest { /** * 使用BeanListhandler * 把单行结果集映射到Map对象中 * @throws SQLException */ @Test public void testQuery3() throws SQLException { String sql = "select * from person where pid=?"; QueryRunner qr = new TxQueryRunner(); Map<String,Object> map = qr.query(sql, new MapHandler(),"1"); System.out.println(map); } /** * 使用BeanListhandler * 把多行结果集封装到List<Map>,即多个Map对象 * 一行对应一个Map对象,多行就对应List<Map> * @throws SQLException */ @Test public void testQuery4() throws SQLException { String sql = "select * from person"; QueryRunner qr = new TxQueryRunner(); List<Map<String, Object>> maplist = qr.query(sql, new MapListHandler()); System.out.println(maplist); } /** * 使用ScalarHandler * 把单行单列的结果集封装到Object中 * @throws SQLException */ @Test public void testQuery5() throws SQLException { String sql = "select count(*) from person";//结果集是单行单列 QueryRunner qr = new TxQueryRunner(); Object obj = qr.query(sql, new ScalarHandler()); /* * 我们知道select count(*),结果一定是个整数! * >Integer * >Long * >BigInteger * * 不同的驱动,结果不同! * 无论是哪种类型,它都是Number类型,强转化成Number一定不出错 */ Number number = (Number)obj; long cnt = number.longValue(); System.out.println(cnt); } }
testQuery3()
testQuery4()
testQuery5()