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;输入数…

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系数的…

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

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

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

雷锋网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;也可计算选定区域内分析对象的一系列几何…

【urllib】url编码问题简述

对url编解码总结 需要用到urllib库中的parse模块 import urllib.parse # Python3 url编码 print(urllib.parse.quote("天天")) # Python3 url解码 print(urllib.parse.unquote("%E5%A4%E5%A4%")) urlparse() # urllib.parse.urlparse(urlstring,scheme,…

独家| ChinaLedger白硕:区块链中的隐私保护

隐私问题一直是区块链应用落地的障碍问题之一&#xff0c;如何既能满足监管&#xff0c;又能不侵害数据隐私&#xff0c;是行业都在攻克的问题。那么&#xff0c;到底隐私问题为何难&#xff1f;有什么解决思路&#xff0c;以及实践创新呢&#xff1f;零知识证明、同态加密等技…

手机处理器排行榜2019_手机处理器AI性能排行榜出炉,高通骁龙第一,华为排在第十名...

↑↑↑击上方"蓝字"关注&#xff0c;每天推送最新科技新闻安兔兔在近日公布了今年四月份Android手机处理器AI性能排行榜&#xff0c;榜单显示高通骁龙865处理器的AI性能在Android阵营中排在第一名——该处理器的AI性能得分接近46万分&#xff0c;今年的小米10、三星G…

芯片支持的且会被用到的H.264特性 预测编码基本原理

视频压缩&#xff1a; 1.H.264基本档次和主要档次&#xff1b;2.CAVLC熵编码&#xff0c;即基于上下文的自适应变长编码&#xff1b;&#xff08;不支持CABAC&#xff0c;即基于上下文的自适应算术编码&#xff09;分辨率&#xff1a;仅用到1080p60&#xff0c;即分辨率为1920*…

MongoDB 数据库 【总结笔记】

一、MongoDB 概念解析 什么是MongoDB&#xff1f; ​ 1、MongoDB是有C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统&#xff0c;在高负载的情况下&#xff0c;添加更多节点&#xff0c;可以保证服务器的性能 ​ 2、MongoDB为web应用提供了高性能的数据存储…

PHP 函数截图 哈哈哈

转载于:https://www.cnblogs.com/bootoo/p/6714676.html

2016年光伏电站交易和融资的十大猜想

1领跑者计划备受关注&#xff0c;竞价上网或从试点开始 领跑者计划规模大&#xff0c;上网条件好&#xff0c;又有政府背书&#xff0c;虽说价格也不便宜&#xff0c;但省去很多隐性成本&#xff0c;对于致力于规模化发展的大型企业来说仍是首要选择。同时&#xff0c;从能源管…

loading gif 透明_搞笑GIF:有这样的女朋友下班哪里都不想去

原标题&#xff1a;搞笑GIF&#xff1a;有这样的女朋友下班哪里都不想去这样的广场舞看着不凉快吗&#xff1f;大哥慢点&#xff0c;机器经受不住你这样的速度求孩子的心里阴影面积生孩子就是用来玩的。有这样的媳妇做饭&#xff0c;下班哪里也不想去1.领导在门外用门夹核桃&am…

eigen库安装_OpenCV+Eigen上位机程序移植(七十一)

1、给硬盘分区现在小伙伴们对于给电脑硬盘分区想必比较头疼&#xff0c;给电脑硬盘分区分为两种情况&#xff0c;一是在安装系统之前给系统硬盘分区&#xff0c;二是在安装系统之后给硬盘分区&#xff0c;我们现在购买的品牌机和笔记本的用户比较多&#xff0c;而且笔记本和品牌…