JavaWeb基础—dbutils的简单入门

  简明入门教程,参考: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();//处理多线程的并发访问问题,使用ThreadLocalprivate static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();public static Connection getConnection() throws SQLException{//不为Null说明开启了事务,返回连接//先获取自己线程的ConnectionConnection 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不再为nullcon = 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 {@Testpublic 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 {@Overridepublic int[] batch(String sql, Object[][] params) throws SQLException {/** 得到连接* 执行父类方法* 释放连接* 返回值*/Connection con = JdbcUtils.getConnection();int[] results = super.batch(con,sql, params);JdbcUtils.releaseConnection(con);return results;}@Overridepublic <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;}@Overridepublic <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;}@Overridepublic <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;}@Overridepublic <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;}@Overridepublic int update(String sql, Object... params) throws SQLException {Connection con = JdbcUtils.getConnection();int results = super.update(con,sql,params);JdbcUtils.releaseConnection(con);return results;}@Overridepublic int update(String sql, Object param) throws SQLException {Connection con = JdbcUtils.getConnection();int results = super.update(con,sql,param);JdbcUtils.releaseConnection(con);return results;}@Overridepublic 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();//处理多线程的并发访问问题,使用ThreadLocalprivate static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();public static Connection getConnection() throws SQLException{//不为Null说明开启了事务,返回连接//先获取自己线程的ConnectionConnection 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不再为nullcon = 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();}
}

 

转载于:https://www.cnblogs.com/jiangbei/p/6704643.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macos安装vscode_VS Code 代码编辑器入门指南:核心组件与概念

作者&#xff1a;思考问题的熊写在前面如果当电脑只能装一个软件还需要尽量不影响日常学习工作时&#xff0c;不知道你的选择会是什么。我把这个看似「荒诞」的问题理解为「All-in-One」的升级版拷问。这个问题陪伴了我很久&#xff0c;每用一个软件我都会想想它对我究竟有多不…

环路滤波一些概念

熵编码需要编码的数据如下&#xff1a; 熵编码需要编码的数据如下&#xff1a;

【深度学习】TensorFlow之卷积神经网络

卷积神经网络的概念 在多层感知器&#xff08;Multilayer Perceptrons&#xff0c;简称MLP&#xff09;中&#xff0c;每一层的神经元都连接到下一层的所有神经元。一般称这种类型的层为完全连接。 多层感知器示例 反向传播 几个人站成一排第一个人看一幅画&#xff08;输入数…

python中的zip模块

zip压缩 引入模块&#xff1a; import zipfilezip文件格式是通用的文档压缩标准&#xff0c;在ziplib模块中&#xff0c;使用ZipFile类来操作zip文件&#xff0c;下面具体介绍一下&#xff1a; zipfile.ZipFile(file[, mode[, compression[, allowZip64]]]) 功能&#xff1a;…

[LeetCode] 35. Search Insert Position

Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order. You may assume no duplicates in the array. Here are few examples.[1,3,5,6], 5 → 2[1,3,5,6], 2 → 1[1…

golang 的交叉编译

为什么80%的码农都做不了架构师&#xff1f;>>> Go是一门编译型语言&#xff0c;所以在不同平台上&#xff0c;需要编译生成不同格式的二进制包。 由于Go 1.5对跨平台编译有了一些改进&#xff0c;包括统一了编译器、链接器等。 编译时候只需要指定两个参数&#x…

【深度学习】Cifar-10-探究不同的改进策略对分类准确率提高

cifar10数据集上进行图片分类&#xff0c;基于tensorflow框架&#xff0c; 旨在探究不同的改进策略对分类准确率的影响&#xff0c;如何一步步得提高准确率 一、问题描述 当我们在处理图像识别或者图像分类或者其他机器学习任务的时候&#xff0c;我们总是迷茫于做出哪些改进…

Acer 4750 安装黑苹果_黑苹果 MacOS 10.15 Catalina安装教程

一、准备工作一个8G以上的U盘(安装 10.15 Catalina 必须要16G及以上的U盘 )&#xff1b;Mac OS镜像、TransMac(刻录工具)、DiskGenius(分区工具)、EasyUEFI(引导工区)、EFI驱动文件。安装工具获取方式&#xff1a;关注公众号【远景论坛】&#xff0c;回复&#xff1a;黑苹果二、…

帧内16*16模式的宏块数据传输顺序

如果宏块以16*16帧内模式编码&#xff0c;那么块-1首先被传输&#xff0c;携带的信息是每个4*4亮度块的DC系数。然后&#xff0c;亮度残差块0-15被传输&#xff08;此时&#xff0c;16*16帧内宏块的DC系数为零&#xff09;。对于亮度分量Cb和Cr&#xff0c;16和17块携带DC系数的…

ceph中查看一个rbd的image的真实存储位置

1、新建一个image存储 rbd create hzb-mysql --size 2048 2、查看hzb-mysql的所有对象 一个rbd image实际上包含了多个对象&#xff08;默认情况下是image_size/4M&#xff09; [rootcc ~]# rbd info hzb-mysql rbd image hzb-mysql:size 2048 MB in 512 objectsorder 22 (4096…

python中的shutil模块

shutil模块 引入&#xff1a; import shutil copy() 功能&#xff1a;复制文件 格式&#xff1a;shutil.copy(来源文件,目标地址) 返回值&#xff1a;复制之后的路径copy2() 功能&#xff1a;复制文件&#xff0c;保留元数据 格式&#xff1a;shutil.copy2(来源文件,目标地址…

亚马逊低调收购Biba 或下月发布视频消息服务

北京时间11月24日消息&#xff0c;据外媒报道&#xff0c;收购Twitch和Elemental Technologies似乎只是亚马逊通过收购深耕视频服务市场战略的两个元素。去年&#xff0c;亚马逊还低调收购了创业公司Biba Systems&#xff0c;后者开发和运营面向企业用户的视频消息应用。消息人…

【tensorflow】static_rnn与dynamic_rnn的区别

static_rnn和dynamic_rnn的区别主要在于实现不同。 static_rnn会把RNN展平&#xff0c;用空间换时间。 gpu会吃不消&#xff08;个人测试结果&#xff09; dynamic_rnn则是使用for或者while循环。 调用static_rnn实际上是生成了rnn按时间序列展开之后的图。打开tensorboard你…

pcie1 4 速度_太阳系行星们谁转得最快?八大行星自转速度排行榜,地球排第五...

不知道大家有没有玩儿过陀螺呢&#xff1f;玩儿陀螺的技术如果很好的话&#xff0c;它可以在地上飞快地旋转并且能够旋转很长的时间。有趣的是&#xff0c;宇宙中的很多星球就像陀螺一样绕着一个中心轴旋转着。这就是星球的自转。在太阳系中有八颗大行星&#xff0c;它们都在自…

python中时间模块

时间日期相关的模块 calendar 日历模块time   时间模块datetime 日期时间模块timeit   时间检测模块 日历模块 calendar() 功能&#xff1a;获取指定年份的日历字符串 格式&#xff1a;calendar.calendar&#xff08;年份,w2,l1&#xff0c;c6,m3&#xff09; 返回值&…

硬盘接口详细解释

硬盘是电脑主要的存储媒介之一&#xff0c;由一个或者多个铝制或者玻璃制的碟片组成。碟片外覆盖有铁磁性材料。硬盘有固态硬盘&#xff08;SSD 盘&#xff0c;新式硬盘&#xff09;、机械硬盘&#xff08;HDD 传统硬盘&#xff09;、混合硬盘&#xff08;HHD 一块基于传统机械…

【Keras】30 秒上手 Keras+实例对mnist手写数字进行识别准确率达99%以上

本文我们将学习使用Keras一步一步搭建一个卷积神经网络。具体来说&#xff0c;我们将使用卷积神经网络对手写数字(MNIST数据集)进行识别&#xff0c;并达到99%以上的正确率。 为什么选择Keras呢&#xff1f; 主要是因为简单方便。更多细节请看&#xff1a;https://keras.io/ …

分布式资本沈波:未来区块链杀手级应用将出现在“+区块链”

雷锋网5月22日报道&#xff0c;日前“区块链技术和应用峰会”在杭州国际博览中心举行。会上&#xff0c;分布式资本创始管理人沈波作了《区块链的投资现状与发展趋势》演讲。 沈波表示&#xff0c;由于区块链的共识机制和无法篡改两大特点&#xff0c;它在各行各业皆有应用潜力…

帧间预测小记

帧间预测后&#xff0c;在比特流中会有相应的信息&#xff1a;残差信息&#xff0c;运动矢量信息&#xff0c;所选的模式。 宏块的色度分量分辨率是亮度分辨率的一半&#xff08;Cr和Cb&#xff09;&#xff0c;水平和垂直均一半。色度块采用和亮度块一致的分割模式&#xff0…

ImageJ Nikon_科研论文作图之ImageJ

各位读者朋友们又见面了&#xff0c;今天给大家介绍一款图片处理软件——ImageJ&#xff0c;这是一款免费的科学图像分析工具&#xff0c;广泛应用于生物学研究领域。ImageJ软件能够对图像进行缩放、旋转、扭曲、模糊等处理&#xff0c;也可计算选定区域内分析对象的一系列几何…