/**
 *
 * JDBC工具类,基于C3P0数据库连接池的实现
 *
 * @author 周瑜
 * @2018年5月7日 下午2:13:20
 */
public final class JDBCUtils {
    /**
     * 使用C3P0-config中默认配置,创建数据库连接池对象
     */
    private static final DataSource dataSource = new ComboPooledDataSource();

/**
     * 返回数据库连接池对象
     *
     * @return
     */
    public static final DataSource getDataSource() {
        return dataSource;
    }

/**
     * 定义一个ThreadLocal对象,用来保存当前线程的连接对象
     */
    private static final ThreadLocal<Connection> LOCAL = new ThreadLocal<>();

/**
     * 返回数据库连接对象
     *
     * @throws SQLException
     */
    public static final Connection getConnection() throws SQLException {
        Connection conn = LOCAL.get();
        if (conn == null) {
            conn = dataSource.getConnection();
            LOCAL.set(conn);
        }
        return conn;
    }

/**
     * 用于定义需要在事务中执行的逻辑代码
     *
     * @param <T>:事务中业务逻辑执行完毕后要返回的数据的类型
     * @author 周瑜
     */
    public static interface TransactionHandler<T> {
        public T execute();
    }

/**
     * 处理事务操作
     * @param handler
     * @return
     */
    public static final <T> T executeTransaction(TransactionHandler<T> handler) {
        Connection conn = null;
        T t = null;
        try {
            conn = JDBCUtils.getConnection();
            conn.setAutoCommit(false);// 开启事务
            // 执行需要在事务中执行的业务逻辑代码
            t = handler.execute();
            conn.commit();// 提交事务
        } catch (Exception e) {
            e.printStackTrace();
            if (conn != null) {
                try {
                    conn.rollback();// 回滚事务
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            }
        } finally {
            // 将连接对象从ThreadLocal中移除
            LOCAL.remove();
        }
        return t;
    }
    /**
     * 关闭并释放JDBC中资源对象
     * @param closes
     */
    public static final void release(AutoCloseable... closes) {
        if(closes != null && closes.length > 0) {
            for (AutoCloseable autoCloseable : closes) {
                if(autoCloseable != null) {
                    try {
                        autoCloseable.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

转载于:https://www.cnblogs.com/zhou-yu/p/9293987.html

JDBC工具类,基于C3P0的数据库连接池,提供获取连接池、获取连接对象、释放资源和封装事务操作的方法...相关推荐

  1. 【工具类】JDBCUtils,数据库连接池

    JDBC 概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库 * JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即 ...

  2. java jdbc工具类抽取_JavaWeb入门(三):JDBC工具类的抽取

    一.通过上篇文章,我们已经可以使用JDBC对数据库中的表进行增删改查啦(JDBC的基本使用:https://www.cnblogs.com/Infancy/p/12499806.html),我们对上篇 ...

  3. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)...

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. 10.statement对象实例(executeUpdate方法以及executeQuery方法),JDBC工具类编写

    1.JDBC工具类: 2.增删改:executeUpdate() 删除指定数据: 插入一条数据: 更新数据: 3.查:executeQuery() statement对象:Statement 是 Ja ...

  5. 抽取JDBC工具类的方法

    抽取JDBC工具类的方法 抽取JDBC工具类 目的:简化书写 抽取JDBC工具类 目的:简化书写 分析: 1.注册驱动抽取 2.抽取一个方法获取连接对象 需求:不想传递参数(麻烦),还得保证工具类的通 ...

  6. JDBC 快速入门JDBC 抽取JDBC工具类:JDBCUtils

    文章目录 JDBC 快速入门JDBC 抽取JDBC工具类:JDBCUtils JDBC 概念:java database Connectivity java 数据库连接,java语言操作数据库 JDB ...

  7. 二、SQL注入使用占位符解决、JDBC工具类、封装

    一.SQL注入使用占位符解决 //使用jdbc发送sql语句, 到数据库tb_user 查询是否有该用户名和密码的用户Connection conn = null;PreparedStatement ...

  8. jdbc工具类 配置版本 20210412_222527.mp4

    jdbc工具类 配置版本 20210412_222527.mp4 编写jdbc工具类,要求,代码要灵活,可随时变更登陆用户与连接的数据库 分析: 可以使用基本的写法加上配置 让配置来提供变化的数据 避 ...

  9. Java JDBC工具类

    虽然现在都有框架封装 , 基本没人用这个了 . 但是如果经常在N个环境N个数据库之间查询数据  , 偶尔用下这个也是挺方便的~ package com.xbz;import com.alibaba.f ...

最新文章

  1. 算法试题 - 找出最小 k 个数
  2. Google Map API V3调用arcgis发布的瓦片地图服务
  3. python3+django写的个人笔记博客
  4. oss可用性_对象存储OSS详解
  5. Runtime底层原理--动态方法解析总结
  6. occ-backend-base-url 的相关代码,如何调试?
  7. Redis:12---有序集合对象
  8. JMS学习二(简单的ActiveMQ实例)
  9. 【网络安全面试题】—如何注入攻击Java Python PHP等主流语言
  10. Linux shell脚本详解及实战(一)——shell简介、shell变量及脚本规范
  11. 启动mysql显示FAILED_转mysql提示mysql daemon failed to start 启动不了的解决办法
  12. 价值连城 神经网络- 吴恩达Andrew Ng Coursera Neural Networks and Deep Learning
  13. 闭环系统的零极点图判定稳定性_零极点与系统稳定关系 拉氏变换的收敛域...
  14. shopnc怎么使用 php,ShopNC单用户版/安装php
  15. an error occurred while creating opening the c++ browsing database 解决办法
  16. Java项目中这样打印错误日志,排查问题更高效
  17. oracle数据库设计思维导图,Oracle
  18. pdf to word android,PDF to Word Converter
  19. PWM占空比,频率,周期之间关系
  20. 中国证券市场之[主板、中小板、创业板、科创板、新三板]

热门文章

  1. 开源安卓播放器:Dolphin Player 简单分析
  2. java制作纯字rpg小游戏_求java rpg小游戏源代码 最好是文字rpg 不需要很复杂 只是交作业用...
  3. linux 无损拆分分区 asm,利用UDEV SCSI Rules配置linux下的ASM
  4. mysql中log_mysql中log
  5. Cache 和 Buffer 有什么区别?
  6. web.xml中/和/*的区别
  7. DB2 exception: Cannot create PoolableConnectionFactory SQLCODE=-142
  8. php odbc 结果集处理,php常用ODBC函数集的简单示例
  9. python的数值类型和运算符_python学习笔记之数据类型---数字类型及运算符
  10. samba服务器_win10 更新导致无法连接samba服务器