一、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. ElasticSearch6.5.0 【Java客户端之REST Client】

    说明 High Level Client 是基于 Low Level Client 的.官方文档如下: * https://www.elastic.co/guide/en/elasticsearch/ ...

  2. 使用InternalsVisibleTo给assembly添加“友元assembly”

    C#的internal关键字可以使标记的方法,字段或者属性等等只能在当前assembly内部使用,那么如果其他的assembly需要使用这个internal的方法的时候怎么办呢?.NET提供了一种类似 ...

  3. 设置redis服务开机自启动

    今天周一,一大早来公司开完会,就听到开发的同学说本地项目起不来了,叫我查下原因.想了下,他们本地项目只跟我们公司的一台内网服务器有关,那台服务器他们要用到的呢,也就只有mysql和redis这两个服务 ...

  4. JMX的l理解

    一.JMX的一些定义与用途 Java Management Extensions:Java管理扩展,是管理系统和资源之间的一个接口,它定义了管理系统和资源之间交互的标准. 1.专门管理,监控jvm的一 ...

  5. 版本控制工具 - TortoiseSVN

    版本控制工具 - TortoiseSVN 使用SVN需要安装三个软件,Visual SVN Server是用于存储项目仓库的中央服务器,Tortoise SVN是管理版本控制的软件,Visual SV ...

  6. conda安装cv2库

    conda install opencv-python或者 pip install opencv-python(不过好像是这个比较有效)

  7. Easyui datalist 使用记录

    仅简单记录下,资料相对比较少 官方给了一个很简单的例子,没啥用处,文档:http://www.jeasyui.com/documentation/datalist.php 学习要点: 1.追加行 $( ...

  8. 【原创】大叔经验分享(8)创建hive表时用内部表还是外部表

    内部表和外部表最主要的一个差别就是删除表或者删除分区时,底层的文件是否自动删除,内部表会自动删除,外部表不会自动删除,所以基础数据表一定要用外部表,即使误删表或分区之后,还可以很容易的恢复回来. 虽然 ...

  9. 小程序引入百度api天气预报

    先看下最终的效果(默认可以获得未来三天数据): 第一:首先准备条件(必须): 1.小程序已认证,有appID 2.必须把https://api.map.baidu.com 添加到小程序的合法域名列表中 ...

  10. redis 资料

    redis是什么: Redis is an open source, BSD licensed, advanced key-value store. It is often referred to a ...