TxQueryRunner类的使用

tech2022-12-11  94

一、TxQueryRunner简介

TxQueryRunner类是common-dbutils.jar下QueryRunner类的子类,用来简化JDBC操作。TxQueryRunner与其父类相比支持事务,底层使用了JdbcUtils来获取连接。

二、QueryRunner的三个方法

2.1 update()

(1)int update(String sql):执行增、删、改语句,参数sql是要执行的SQL语句;

(2)int update(Stringsql, Object param):执行增、删、改语句,参数sql是要执行的SQL语句,参数param是参数(一个参数);

(3)int update(String sql, Object… params):执行增、删、改语句,参数sql是要执行的SQL语句,参数params是参数(多个参数);

package cn.baldprogrammer.test; import java.sql.SQLException; import org.apache.commons.dbutils.QueryRunner; import org.junit.Test; import cn.jdbc.TxQueryRunner; public class TxQueryRunnerTest { //QueryRunner的update方法 @Test public void testUpdate() throws SQLException{ String sql="insert into t_person(pid,pname,age,sex) values(?,?,?,?)"; Object[] params={"p_002","bill",23,"男"};//给出sql语句中对应的参数 QueryRunner qr=new TxQueryRunner();//没有给对象提供连接池 qr.update(sql,params);//内部使用jdbcUtils来获取连接 } }

 

package cn.baldprogrammer.test; import java.sql.SQLException; import org.apache.commons.dbutils.QueryRunner; import org.junit.Test; import cn.itcast.jdbc.JdbcUtils; import cn.jdbc.TxQueryRunner; public class TxQueryRunnerTest { @Test public void testUpdate2() throws Exception{ try{ JdbcUtils.beginTransaction();//开启事务 //可对数据库进行多次操作 String sql="insert into t_person(pid,pname,age,sex) values(?,?,?,?)"; QueryRunner qr=new TxQueryRunner();//没有给对象提供连接池 Object[] params={"p_003","lisa",56,"女"}; qr.update(sql,params); if(false){ throw new Exception(); } params=new Object[]{"p_004","lusi",18,"女"}; qr.update(sql,params); JdbcUtils.commitTransaction();//提交事务 }catch(Exception e){ try { JdbcUtils.rollbackTransaction();//回滚事务 } catch (SQLException e1) { } throw e; } } }

2.2query()

query(String sql, ResultSetHandler<T> rh, Object… params):执行查询,参数sql为要执行的查询语句模板,rh是结果集处理,用来把结果集映射成你想要的结果,params是sql语句的参数;

package cn.baldprogrammer.test; import java.sql.SQLException; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.junit.Test; public class TxQueryRunnerTest { //测试查询方法,JDBC查询的结果是ResultSet,QueryRunner查询的结果是ResultSet映射后的结果 //QueryRunner第一步执行seslect,得到ResultSet,第二步把ResultSet转换成其他结果(JavaBean/Map/Object) @Test //单行结果集映射到JavaBean中 public void testQuery1() throws SQLException{ String sql="select * from t_person where pid=?"; QueryRunner qr=new TxQueryRunner(); Person p=qr.query(sql, new BeanHandler<Person>(Person.class),1); System.out.println(p); } }

2.3batch() 

package cn.baldprogrammer.test; import java.sql.Connection; import java.sql.PreparedStatement; import org.junit.Test; import com.util.JDBCUtils; /** * 批处理 情况: * 一、多条sql语句的批量处理 适用于 sql语句各不一样,使用Statement命令对象执行 * 二、一条sql语句的批量传参 * 适用于sql语句一样,仅仅是参数不同,使用PreparedStatement命令对象指向 * 相关API * addBatch:添加命令到批处理包 * executeBatch:提交批处理包 * clearBatch:清空批处理包 * * 好处: 减少和数据库服务器连接的次数,减少执行的次数,提高效率 */ public class TestConnection09 { //使用批处理 @Test public void test02() throws Exception{ // 1.获取连接 Connection connection = JDBCUtils.getConnection(); // 2.访问数据库 String sql="insert into admin values(1,?,?)"; PreparedStatement statement = connection.prepareStatement(sql); for (int i = 1; i < 50000; i++) { statement.setString(1, "小花" + i); statement.setString(2, "8888"); // 批处理 statement.addBatch();// 将要执行的sql语句添加到批处理包(装篮子的操作) if (i % 1000 == 0) { statement.executeBatch();// 提交批处理的命令们(上楼运篮子的操作) statement.clearBatch();// 清空批处理包(卸篮子的操作) } else if (i > 49000) { statement.executeBatch();// 提交批处理的命令们(上楼运篮子的操作) statement.clearBatch();// 清空批处理包(卸篮子的操作) } } // 3.关闭 JDBCUtils.closeConnection(null, statement, connection); } }

 

最新回复(0)