一、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. django系列5:视图

    在Django中,网页和其他内容由视图提供.每个视图都由一个简单的Python函数(或基于类的视图的方法)表示.Django将通过检查所请求的URL(确切地说,是域名后面的URL部分)来选择视图. 在 ...

  2. CMDB资产管理系统开发【day26】:实现资产自动更新

    1.需求分析 1.比对分析 比对的时候以那个数据源为主? old [1,2,3 ] db数据库 new [2,3,4 ] 客户端汇报过来的 当然以客户端汇报过来的数据为主 2.更新分析 不同的表到底拿 ...

  3. 图解 CMS 垃圾回收机制原理,-阿里面试题

    最近在整理JVM相关的PPT,把CMS算法又过了一遍,每次阅读源码都能多了解一点,继续坚持. 什么是CMS CMS全称 ConcurrentMarkSweep,是一款并发的.使用标记-清除算法的垃圾回 ...

  4. Vue Material

    Material Design是什么? https://www.zhihu.com/topic/20005114/top-answers 我们挑战自我,为用户创造了崭新的视觉设计语言.与此同时,新的设 ...

  5. 调用腾讯、百度翻译API,实现游戏机翻通用程序

    最近玩了款steam独立游戏,没中文,只能自己汉化了,用腾讯跟百度的API实现了一个通用的机翻程序(只需要导入JSON文本), 同样,比较懒,还没写,先占坑

  6. C# mvc 前端调用 redis 缓存的信息

    新手 这几天网上学习下redis ,自己总结下过程,怕之后忘记了,基本会用最简单的,有的还是不懂,先记下来,自己摸索的. 没有安装redis的先安装,教程:http://www.cnblogs.com ...

  7. Contest1874 - noip基础知识五:动态规划(背包、树dp、记忆化、递推、区间、序列dp、dp优化)

    传送门 T1  dp[n][m]=dp[n-1][m-1]+dp[n-m][m] T2  ans=cat(n)*(n!)2  卡特兰数 T3  dp[i][j]=sigma(dp[i-1][j-a[i ...

  8. Java并发之Thread类的使用

    一.线程的几种状态 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以下这几个状态:创建(new).就绪(runnable).运行(running).阻塞(blocked).time wa ...

  9. 【译】索引进阶(一):SQL SERVER索引介绍

      [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正]  原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/7 ...

  10. Lua中的模块与包

    [前言] 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个 ...