一、QueryRunner使用

QueryRunner是dbutils包下一个为了增强JDBC的类,使用之前需要先导jar包,jar包下载地址为:http://commons.apache.org/proper/commons-dbutils/

简化了JDBC中数据操作,以及数据与对象之间的转化。有几个常用方法。

涉及到事务时创建QueryRunner对象时,不需要传入参数,但需要在方法里传入和其他层同一个Connection对象。

不涉及到事务时,创建QueryRunner对象,需要提供一个DateSource对象,QueryRunner内部从连接池获得连接

update()方法:

1.int update(String sql,Object...params)-->可执行增、删、改语句

2.int update(Connection conn,String sql,Object...params)-->同样支持增、删、改操作,但是方法不管理Connection了,支持事务。

    @Test
public void insert(){
try {

QueryRunner qr=new QueryRunner(C3p0Utils.getDateSource());
String sql="update bank set blance=blance+? where name=?";
Object[] o={200,"李四"};
qr.update(sql, o); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }

query()方法:

1.T query(String sql,ResultSetHandler rsh,Object...params)-->可执行查询

2.T query(Connection conn,String sql,ResultSetHandler rsh,Object...params)-->可执行查询,支持事务

update方法和query方法参数里面有一处不同,里面增加了一个ResultSetHandler接口,作用是为了把从数据库中查询出来的数据转化成对象,有五种实现

1.BeanHandler(单行) -->构造器需要一个Class类型参数,用来把一行结果转换成指定类型的javaBean对象,前提是JavaBean对象里面的参数名称和数据库里面的参数名称要相同

2.BeanListHandler(多行)-->构造器也需要一个Class类型的参数,用来把一行结果集转换成一个javaBean,那么多行就是转换成list.

3.MapHandler(单行)-->把一行结果集转换成Map对象

4.MapListHandler(多行)-->把一行记录转换成一个Map,多行就是多个Map,即List<Map>

5.ScalarHandler(单行单列)-->通常用与Select count(*) from table 语句,返回一个Object.

    @Test
public void query(){
try {
QueryRunner qr=new QueryRunner(C3p0Utils.getDateSource());
String sql="select * from bank";
Bank b=qr.query(sql, new BeanHandler(Bank.class));
System.out.println(b); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }

二、JdbcUtils自写工具类增加事务处理。

在项目框架搭建过程中,涉及到三个层面,数据层、业务层、网络层,这是在MVC模式基础上进一步的业务分离。Dao层是对数据库进行操作的,这里不涉及到任何的业务处理,所以事务不该出现在这里,Service层是进行业务处理的,事务应该在这里出现,事务的开始和结束都得依靠Connection对象,所以需要Connection对象,但是Connection只应该出现在Dao层中,不应该在Service中出现,所以要进行封装,在这里为了线程安全,使用ThreadLocal对象,并且业务逻辑进行判断,使通过一个事务中只使用同一个Connection对象。

import java.sql.Connection;
import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; /**
* @author WangXinwei
*从C3P0连接池获取连接
*getDateSource返回连接池对象
*/
public class C3p0Utils {
private static ComboPooledDataSource dataSource=new ComboPooledDataSource();
//为了并发安全,使用ThreadLocal对象
private static ThreadLocal<Connection> tl=new ThreadLocal<Connection>();
/**
*
* @return
* @throws SQLException
* 返回连接,首先判断线程是否含有连接,如果没有,则新建连接
*/
public static Connection getConnection() throws SQLException{
Connection con=tl.get();
if(con!=null) return con;
return dataSource.getConnection();
}
/**
* 开启事务
* @throws SQLException
*/
public static void beginTransaction() throws SQLException{
Connection con=tl.get();
if(con!=null) throw new RuntimeException("已经开启了事务");
con=getConnection();
con.setAutoCommit(false);
tl.set(con);
}
/**
* @throws SQLException
*提交事务
*/
public static void commitTransaction() throws SQLException{
Connection con=tl.get();
if(con==null) throw new RuntimeException("没有事务");
con.commit();
con.close();
tl.remove();
}
/**
* @throws SQLException
* 回滚事务
*/
public static void rollbackTransaction() throws SQLException{
Connection con=tl.get();
if(con==null) throw new RuntimeException("没有事务");
con.rollback();
con.close();
tl.remove();
}
/**
*
* @param connection
* @throws SQLException
* 判断是否能够关闭连接,如果不属于事务那么就关闭。
*/
public static void releaseConnection(Connection connection) throws SQLException{
Connection con=tl.get();
if(con==null) connection.close();
if(con!=connection) connection.close();
}
/**
*
* @return
* 返回连接池对象
*/
public static DataSource getDateSource(){
return dataSource; }
}

三、QueryRunner增强

    @Test
public void queryBank(){
try {
QueryRunner qr=new QueryRunner();
String sql="select * from bank";
Connection con=C3p0Utils.getConnection();
Bank b=qr.query(con,sql, new BeanHandler(Bank.class));
C3p0Utils.releaseConnection(con); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }

自己提供连接与判断是否可以关闭连接,导致代码臃肿,可以把这下方法哦QueryRunner中实现,写一个QueryRunner的继承类

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler; public class BasicQueryRunner extends QueryRunner { @Override
public int[] batch(String sql, Object[][] params) throws SQLException {
// TODO Auto-generated method stub
Connection con=C3p0Utils.getConnection();
int[] result=super.batch(con,sql, params);
C3p0Utils.releaseConnection(con);
return result;
} @Override
public int execute(String sql, Object... params) throws SQLException {
// TODO Auto-generated method stub
Connection con=C3p0Utils.getConnection();
int result=super.execute(con,sql, params);
C3p0Utils.releaseConnection(con);
return result; } @Override
public <T> List<T> execute(String sql, ResultSetHandler<T> rsh,
Object... params) throws SQLException {
// TODO Auto-generated method stub
Connection con=C3p0Utils.getConnection();
List<T> result=super.execute(con,sql, rsh, params);
C3p0Utils.releaseConnection(con);
return result; } @Override
public <T> T insert(String sql, ResultSetHandler<T> rsh, Object... params)
throws SQLException {
// TODO Auto-generated method stub
Connection con=C3p0Utils.getConnection();
T result=super.insert(con,sql, rsh, params);
C3p0Utils.releaseConnection(con);
return result; } @Override
public <T> T insert(String sql, ResultSetHandler<T> rsh)
throws SQLException {
// TODO Auto-generated method stub
Connection con=C3p0Utils.getConnection();
T result=super.insert(con,sql, rsh);
C3p0Utils.releaseConnection(con);
return result; } @Override
public <T> T insertBatch(String sql, ResultSetHandler<T> rsh,
Object[][] params) throws SQLException {
// TODO Auto-generated method stub
Connection con=C3p0Utils.getConnection();
T result=super.insertBatch(con,sql, rsh, params);
C3p0Utils.releaseConnection(con);
return result; } @Override
public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
throws SQLException {
// TODO Auto-generated method stub
Connection con=C3p0Utils.getConnection();
T result=super.query(con,sql, rsh, params);
C3p0Utils.releaseConnection(con);
return result; } @Override
public <T> T query(String sql, ResultSetHandler<T> rsh) throws SQLException {
// TODO Auto-generated method stub
Connection con=C3p0Utils.getConnection();
T result= super.query(con,sql, rsh);
C3p0Utils.releaseConnection(con);
return result; } @Override
public int update(String sql, Object... params) throws SQLException {
// TODO Auto-generated method stub
Connection con=C3p0Utils.getConnection();
int result= super.update(con,sql, params);
C3p0Utils.releaseConnection(con);
return result; } @Override
public int update(String sql, Object param) throws SQLException {
// TODO Auto-generated method stub
Connection con=C3p0Utils.getConnection();
int result= super.update(con,sql, param);
C3p0Utils.releaseConnection(con);
return result; } @Override
public int update(String sql) throws SQLException {
// TODO Auto-generated method stub
Connection con=C3p0Utils.getConnection();
int result=super.update(con,sql);
C3p0Utils.releaseConnection(con);
return result; } }

QueryRunner及其增强,以及JdbcUtils增加事务处理及多线程并发安全的更多相关文章

  1. DbHelperSQL 增加事务处理方法(2种)

    方法一: 1 public static bool ExecuteSqlByTrans(List<SqlAndPrams> list) { bool success = true; Ope ...

  2. Yii ExtendedActiveRecord 增强版 ActiveRecord 增加多数据库连接绑定功能

    ExtendedActiveRecord 继承自 CActiveRecord,因此基础功能与 CActiveRecord 无异 为添加对多数据库连接的支持,增加了对 connectionName() ...

  3. 踩坑系列《六》Spring增加事务处理遇到异常解决办法

    当在对数据进行增删改操作时,需要用到事务的处理,所以在业务层中加入@Transactional注解,但是在执行业务操作的前面遇到异常,因此对异常进行抛出,但是数据又诡异地成功保存到数据库了. 解决方法 ...

  4. Oracle12c(12.1)中性能优化&amp;功能增强之通过参数THREADED_EXECTION使用多线程模型

    1.   后台 UNIX/Linux系统上,oracle用多进程模型.例如:linux上一个常规安装的数据库会有如下进程列: $ ps -ef | grep [o]ra_ oracle  15356  ...

  5. JDBC&&c3p0、事务、批处理、多线程 于一体的经典秘方QueryRunner

    目录: 基础篇_功能各自回顾 JDBC基础代码回顾(使用JdbcUtils工具简化) c3p0数据库连接池的使用(使用JdbcUtils工具简化) 大数据的插入(使用c3p0+JdbcUtils工具简 ...

  6. 《JavaWeb从入门到改行》JDBC经典秘方QueryRunner

    目录: 基础篇_功能各自回顾 JDBC基础代码回顾(使用JdbcUtils工具简化) c3p0数据库连接池的使用(使用JdbcUtils工具简化) 大数据的插入(使用c3p0+JdbcUtils工具简 ...

  7. Spring 中AOP及前后置增强案例

    1.AOP面向切面编程 面向切面编程的本质:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来.  1主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等.  2主要意 ...

  8. Apache-dbutils 简介及事务处理

    一:commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...

  9. 终极事务处理(XTP,Hekaton)——万能大招?

    在SQL Server 2014里,微软引入了终极事务处理(Extreme Transaction Processing),即大家熟知的Hekaton.我在网上围观了一些文档,写这篇文章,希望可以让大 ...

随机推荐

  1. 老是上不了 google scholar...

    这段时间老是上不了 google scholar... 下载了最新的 host 也不行. 难道真是电脑有问题了? 网络有时也老是掉... 也好. 多休息休息. 人生难得几回清闲. 马上就要开学咯. 课 ...

  2. luogu P5287 [HNOI2019]JOJO

    传送门 神™这题暴力能A,这出题人都没造那种我考场就想到的数据,难怪我的垃圾做法有分 先考虑没有撤销操作怎么做,因为每次插入一段一样的字符,所以我们可以把\(x\)个字符\(c\)定义为\(cx\), ...

  3. uploadPreview上传图片前预览图片

    uploadPreview.js是一款图片上传前的预览插件.谷歌.火狐.IE都可以兼容,但是不支持safari. 相关的html代码: <!DOCTYPE html PUBLIC "- ...

  4. 2.解决虚拟机中centos联网的问题

    首先:打开虚拟机的编辑菜单,选择“虚拟机网络编辑器” 虚拟机网络编辑器 在虚拟机网络编辑器中选择还原默认设置 接下来开启CentOS7虚拟机 在这里需要注意的是必需以管理员身份来进行设置,所以要用管理 ...

  5. Spring系列(六) Spring Web MVC 应用构建分析

    DispatcherServlet DispatcherServlet 是Spring MVC的前端控制器名称, 用户的请求到达这里进行集中处理, 在Spring MVC中, 它的作用是为不同请求匹配 ...

  6. HT for Web框架使用心得

    一.简单介绍 在HT for Web的官网首页写着,构建先进2D和3D可视化所需要的一切. 是的,只要你看过官网,你就会知道,这是一个企业的.并非开源的且需要收费的框架. 因为公司的业务需要,且公司使 ...

  7. php7 + 新特性 部分

    三目运算符: 以前:$type = isset($_GET['type']) ? $_GET['type'] : '测试'; php7.0: $type = $_GET['type'] ?? '测试' ...

  8. 使用ob缓存实现真静态

    实现页面的真静态化可以通过php的ob缓存来实现: 1.ob缓存认识 Ob就是output_buffering:输出缓存. 如果ob(函数ob_start())缓存打开,则echo的数据首先放在ob缓 ...

  9. 前端 $.parseJson()

    $.parseJSON() 函数用于将符合标准格式的的JSON字符串转为与之对应的JavaScript对象. 例子: 这里首先给出JSON字符串集,字符串集如下: var data=" {  ...

  10. ROS-PCL点云库的安装

    网上各种说安装点云库还慢,中间出现一些没有依赖库的情况,但在我这里都是很顺利,难道是一开始安装了ROS的原因?不是很清楚,暂且将过程写下来. 一,下载PCL $ git clone https://g ...