简明入门教程,参考https://www.cnblogs.com/CQY1183344265/p/5854418.html

进行此章节之前,介绍一个JdbcUtils的再次的简单封装

  (例如后面需要构造QueryRunner时得到数据源等的简便的操作)

package cn.itcast.jdbcutils;

import java.sql.Connection;
import java.sql.SQLException; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JdbcUtils {
//使用的是默认的配置信息,注意给出c3p0-config.xml配置文件
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//处理多线程的并发访问问题,使用ThreadLocal
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
public static Connection getConnection() throws SQLException{
//不为Null说明开启了事务,返回连接
//先获取自己线程的Connection
Connection con = tl.get();
if(con != null) return con;
return dataSource.getConnection();
}
/**
* 大方一点,给出连接池对象给你
*/
public static ComboPooledDataSource getDataSource(){
return dataSource;
}
//给出三个方法
/**
* 开启事务
* 创建一个Connection,设置为手动提交
* 保证DAO使用的就是这个事务的连接
* 同时还需要保证下面两个提交与回滚是同一个连接
* 通过创建一个本类的连接成员
* @throws SQLException
*/
public static void startTransaction() throws SQLException{
Connection con = tl.get();
//开启事务后con不再为null
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 SQLException("事务未开启,请勿提交!");
con.commit();
con.close();
//清空连接
con = null;
//移除事务
tl.remove();
}
/**
* 回滚事务
* @throws SQLException
*/
public static void rollbackTransaction() throws SQLException {
Connection con = tl.get();
if(con == null) throw new SQLException("事务未开启,请勿回滚!");
con.rollback();
con.close();
con = null;
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(); }
}

一、简易的入门:

    common-dbutils是Apache对Jdbc的一个简单的封装,其中主要涉及的类有:

      QueryRunner

      ResultSetHandler

      DbUtils

    使用的依赖如下:

    

  1.

  重要类 QueryRunner (构造时提供数据源)
  重要方法:int update(String sql,Object...params);增删改
  重载版本 int update(Connection con,String sql,Object...params);本方法不再管理con,由外部提供(保证是同一个)
  T query(String sql,ResultSetHandler rsh,Object...params);查询
  重载版本类同上

  给出一个使用的小例子:

  

package cn.itcast.demo;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test; import cn.itcast.jdbcutils.JdbcUtils; /**
* 测试commons-dbutils
* @author jiangbei01
*
*/
public class Demo02 {
@Test
public void testfun1() throws SQLException{
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "INSERT INTO ab VALUES(?,?)";
Object[] params = {8,"肖恩"};
qr.update(sql, params);
}
}

  2.

  给一张表对应一个类,字段与属性对应起来

  他会先得到ResultSet,然后调用handler方法转换成需要的类型
  接口ResultSetHandler,我们学习的实现类:
  BeanHandler 构造器需要一个class参数,返回指定类型的javabean对象  一行记录
  BeanListHandler 构造器同上,由名称知为多行,转换成list对象,多个javabean  多行记录
  MapHandler 把一行记录转换成一个map (如{name:zhangsan,age:20})  一行记录
  MapListHandler 同上对比,多个map的多行记录,返回List<Map>,返回的也是一个List  多行记录
  ScalarHandler 单行单列,通常与select count(*) from stu; 单行单列

  这里使用装饰者模式加上开头改造的工具类,将QueryRunner稍加改造

  

package cn.itcast.jdbcutils;

import java.sql.Connection;
import java.sql.SQLException; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
/**
* 这个类可以自身自己处理连接问题,可以通过jdbcUtils释放连接(类方法会处理是否关闭)
* @author jiangbei01
*
*/
public class TxQueryRunner extends QueryRunner { @Override
public int[] batch(String sql, Object[][] params) throws SQLException {
/*
* 得到连接
* 执行父类方法
* 释放连接
* 返回值
*/
Connection con = JdbcUtils.getConnection();
int[] results = super.batch(con,sql, params);
JdbcUtils.releaseConnection(con);
return results;
} @Override
public <T> T query(String sql, Object param, ResultSetHandler<T> rsh) throws SQLException {
/*
* 得到连接
* 执行父类方法
* 释放连接
* 返回值
*/
Connection con = JdbcUtils.getConnection();
T results = super.query(con,sql, param,rsh);
JdbcUtils.releaseConnection(con);
return results;
} @Override
public <T> T query(String sql, Object[] params, ResultSetHandler<T> rsh) throws SQLException {
Connection con = JdbcUtils.getConnection();
T results = super.query(con,sql, params,rsh);
JdbcUtils.releaseConnection(con);
return results;
} @Override
public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
Connection con = JdbcUtils.getConnection();
T results = super.query(con,sql, rsh,params);
JdbcUtils.releaseConnection(con);
return results;
} @Override
public <T> T query(String sql, ResultSetHandler<T> rsh) throws SQLException {
Connection con = JdbcUtils.getConnection();
T results = super.query(con,sql, rsh);
JdbcUtils.releaseConnection(con);
return results;
} @Override
public int update(String sql, Object... params) throws SQLException {
Connection con = JdbcUtils.getConnection();
int results = super.update(con,sql,params);
JdbcUtils.releaseConnection(con);
return results;
} @Override
public int update(String sql, Object param) throws SQLException {
Connection con = JdbcUtils.getConnection();
int results = super.update(con,sql,param);
JdbcUtils.releaseConnection(con);
return results;
} @Override
public int update(String sql) throws SQLException {
Connection con = JdbcUtils.getConnection();
int results = super.update(con,sql);
JdbcUtils.releaseConnection(con);
return results;
} }

给出一个使用改造类的小例子:

package cn.itcast.jdbcutils;

import java.sql.Connection;
import java.sql.SQLException; import org.apache.commons.dbutils.QueryRunner; public class AccountDAO {
/**
* 不能使用连接池
* 要自己提供连接才能保证是同一个连接
* @param name
* @param money
* @throws SQLException
*/
public static void update(String name, double money) throws SQLException{
QueryRunner qr = new TxQueryRunner();
String sql = "update account set balaence=balaence+? where name=?";
Object[] params = {money,name};
//给出参数并执行 qr.update(sql,params);
/*
* 以下代码新写的Tx类已经完成,无需处理
* Connection con = JdbcUtils.getConnection();
* //释放连接
JdbcUtils.releaseConnection(con); */ }
}

  并发访问时产生的问题,可以使用ThreadLocal类(待更新详细)进行解决,示例如下:

package cn.itcast.jdbcutils;

import java.sql.Connection;
import java.sql.SQLException; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JdbcUtils {
//使用的是默认的配置信息,注意给出c3p0-config.xml配置文件
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//处理多线程的并发访问问题,使用ThreadLocal
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
public static Connection getConnection() throws SQLException{
//不为Null说明开启了事务,返回连接
//先获取自己线程的Connection
Connection con = tl.get();
if(con != null) return con;
return dataSource.getConnection();
}
/**
* 大方一点,给出连接池对象给你
*/
public static ComboPooledDataSource getDataSource(){
return dataSource;
}
//给出三个方法
/**
* 开启事务
* 创建一个Connection,设置为手动提交
* 保证DAO使用的就是这个事务的连接
* 同时还需要保证下面两个提交与回滚是同一个连接
* 通过创建一个本类的连接成员
* @throws SQLException
*/
public static void startTransaction() throws SQLException{
Connection con = tl.get();
//开启事务后con不再为null
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 SQLException("事务未开启,请勿提交!");
con.commit();
con.close();
//清空连接
con = null;
//移除事务
tl.remove();
}
/**
* 回滚事务
* @throws SQLException
*/
public static void rollbackTransaction() throws SQLException {
Connection con = tl.get();
if(con == null) throw new SQLException("事务未开启,请勿回滚!");
con.rollback();
con.close();
con = null;
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(); }
}

JavaWeb基础—dbutils的简单入门的更多相关文章

  1. JavaWeb基础之Servlet简单实现用户登陆

    学习javaweb遇到了一些坑,一些问题总结下来,记个笔记. 学习servlet遇到的一些坑: servlet实现用户登陆遇到的坑解决办法: https://www.cnblogs.com/swxj/ ...

  2. JavaWeb基础—JSP自定义标签入门

    自定义标签的作用:替换JSP页面的java代码 步骤:1.标签处理类(标签是一个对象,那也就需要先有类) 2.tld文件 它是一个xml(可以向c标签里借),一般放到WEB-INF下,不让客户端浏览器 ...

  3. javaweb基础(32)_jdbc学习入门

    一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...

  4. JavaWeb基础知识总结

    JavaWeb基础知识总结.   1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供 ...

  5. 【VB超简单入门】一、写在前面

    每本书的前面总得写点什么,到我这里也自然不能免俗,前言这东西“存在即合理”,所以就随便写一点咯~ 首先这本书是给从未接触过编程的童鞋准备的,由于我学识疏浅,对VB也只是一知半解所以也只能讲一点点最基础 ...

  6. web前端基础知识及快速入门指南

    web前端基础知识及快速入门指南 做前端开发有几个月了,虽然说是几个月,但是中间断断续续的上课.考试以及其它杂七杂八的事情,到现在居然一直感觉自己虽然很多前端的知识很眼熟,却也感觉自己貌似也知识在门口 ...

  7. Web Service简单入门示例

    Web Service简单入门示例     我们一般实现Web Service的方法有非常多种.当中我主要使用了CXF Apache插件和Axis 2两种. Web Service是应用服务商为了解决 ...

  8. 运维自动化之SALTSTACK简单入门

    运维自动化之SaltStack简单入门 饱食终日而无所事事,是颓也,废也.但看昨日,费九牛二虎之力除一BUG便流连于新番之中,不知东方之既黑,实乃颓颓然而荒废矣.故今日来缀一文以忏昨日之悔. Salt ...

  9. Python 简单入门指北(二)

    Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...

随机推荐

  1. python函数 变量 递归

    1 语法 #语法 def 函数名(参数1,参数2,参数3,...): '''注释''' 函数体 return 返回的值 #函数名要能反映其意义 返回值数=0:返回None放回值数=1:返回object ...

  2. 抓取远程master分支到本地,并与UI分支合并

    1.pull (1)UI:  git add . git commit -m   git checkout master (2)master:  git pull origin master  git ...

  3. 回归JavaScript基础(八)

    主题:引用类型包装类.单体内置对象的介绍. 对于我们开发人员来说,JavaScript有种引用类型一定很陌生!那就是基本包装类型:Boolean.Number和String.这也不是我们的错,主要这些 ...

  4. spring boot(17)-@Async异步

    验证码的异步机制 上一篇讲过可以用邮件发验证码,通常我们在某网站发验证码时,首先会提示验证码已发送,请检查邮箱或者短信,这就是图中的1和3.然而此时查看邮箱或短信可能并没有收到验证码,往往要过几秒种才 ...

  5. 使用 Azure CLI 管理 Azure 虚拟网络和 Linux 虚拟机

    Azure 虚拟机使用 Azure 网络进行内部和外部网络通信. 本教程将指导读者部署两个虚拟机,并为这些 VM 配置 Azure 网络. 本教程中的示例假设 VM 将要托管包含数据库后端的 Web ...

  6. SQL Server ->> 数据类型不一致比较时的隐式转换

    当使用操作符进行比较的时候,两边数据类型不一致的情况下,数据类型优先级别低的会往优先级别高的发生隐式转换.下面的参考链接是优先级别列表. 参考: Data Type Precedence (Trans ...

  7. SqlServer触发器实现表的级联插入、级联更新

    首先建立两张表,分别为test1与test2,期望在更改test1的时候,test2的相关记录能够同时做出更改.假定test1与test2的表结构相同,如下表所示 name age     触发器实现 ...

  8. asp.net MVC4 框架揭秘 读书笔记系列2

    1.2 MVC 变体 MVC 是一种Pattern 另外一种说法是ParaDigm 范例 模式和范例的区别在于前者可以应用到具体的应用上,而后者则仅仅提供一些指导方针 1.2.1 MVP Model ...

  9. [UI] Pull menu interaction concept - 下拉菜单交互

    Pull menu interaction concept - 下拉菜单交互 http://freebiesbug.com/code-stuff/pull-menu-interaction-conce ...

  10. [控件] 创建出条形间隔效果的背景LineBackgroundView

    创建出条形间隔效果的背景LineBackgroundView 效果: 使用: // // ViewController.m // LineBackgroundView // // Created by ...