一、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);
}
}