TxQueryRunner类的使用

一、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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值