DbUtils + Druid 实现 JDBC 操作 --- 附BaseDao

news2024/12/25 15:36:56

文章目录

  • Apache-DBUtils实现CRUD操作
    • 1 Apache-DBUtils简介
    • 2 主要API的使用
      • 2.1 DbUtils
      • 2.2 QueryRunner类
      • 2.3 ResultSetHandler接口及实现类
    • 3 JDBCUtil 工具类编写
      • 3.1 导包
      • 3.2 编写配置文件
      • 3.3 编写代码
    • 4 BaseDao 编写

Apache-DBUtils实现CRUD操作

1 Apache-DBUtils简介

  • commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。

  • API介绍:

    • org.apache.commons.dbutils.QueryRunner
    • org.apache.commons.dbutils.ResultSetHandler
    • 工具类:org.apache.commons.dbutils.DbUtils
  • API包说明:

  • 在这里插入图片描述
    在这里插入图片描述

2 主要API的使用

2.1 DbUtils

  • DbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:
    • public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。
    • public static void closeQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。
    • public static void commitAndClose(Connection conn)throws SQLException: 用来提交连接的事务,然后关闭连接
    • public static void commitAndCloseQuietly(Connection conn): 用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。
    • public static void rollback(Connection conn)throws SQLException:允许conn为null,因为方法内部做了判断
    • public static void rollbackAndClose(Connection conn)throws SQLException
    • rollbackAndCloseQuietly(Connection)
    • public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。

2.2 QueryRunner类

  • 该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。

  • QueryRunner类提供了两个构造器:

    • 默认的构造器
    • 需要一个 javax.sql.DataSource 来作参数的构造器
  • QueryRunner类的主要方法:

    • 更新
      • public int update(Connection conn, String sql, Object… params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。
    • 插入
      • public T insert(Connection conn,String sql,ResultSetHandler rsh, Object… params) throws SQLException:只支持INSERT语句,其中 rsh - The handler used to create the result object from the ResultSet of auto-generated keys. 返回值: An object generated by the handler.即自动生成的键值
    • 批处理
      • public int[] batch(Connection conn,String sql,Object[][] params)throws SQLException: INSERT, UPDATE, or DELETE语句
      • public T insertBatch(Connection conn,String sql,ResultSetHandler rsh,Object[][] params)throws SQLException:只支持INSERT语句
    • 查询
      • public Object query(Connection conn, String sql, ResultSetHandler rsh,Object… params) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。

2.3 ResultSetHandler接口及实现类

  • 该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。

  • ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。

  • 接口的主要实现类:

    • ArrayHandler:把结果集中的第一行数据转成对象数组。
    • ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
    • **BeanHandler:**将结果集中的第一行数据封装到一个对应的JavaBean实例中。
    • **BeanListHandler:**将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
    • ColumnListHandler:将结果集中某一列的数据存放到List中。
    • KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
    • **MapHandler:**将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
    • **MapListHandler:**将结果集中的每一行数据都封装到一个Map里,然后再存放到List
    • **ScalarHandler:**查询单个值对象

3 JDBCUtil 工具类编写

3.1 导包

在这里插入图片描述
在这里插入图片描述

3.2 编写配置文件

创建 druid.properties 文件, 注意文件名字不能改。

username=root
password=root
url=jdbc:mysql://localhost:3306/jdbc_learn?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
driverClassName=com.mysql.cj.jdbc.Driver

initialSize=10
maxActive=10

3.3 编写代码

创建 JDBCUtil.java 文件


/**
 * ClassName: JDBCUtil
 * Description: 操作数据库的工具类
 *      Druid 数据库获取数据库的连接
 *      DbUtils 关闭数据库资源
 *
 * @Create 2023/10/29 14:35
 * @Version 1.0
 */
public class JDBCUtil {

    /**
     * 使用 Druid 数据库连接池的配置文件的方式,获取数据库的连接:推荐
     *
     * @return
     * @throws Exception
     */
    // 创建一个 Druid 数据库连接池
    private static DataSource source = null;

    static {
        try {
            Properties pros = new Properties();
            // 读取配置文件
            InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
            pros.load(is);
            source = DruidDataSourceFactory.createDataSource(pros);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static Connection getConnection() throws Exception {
        Connection conn = source.getConnection();
        return conn;
    }


    /**
     * 关闭资源操作,增删改时使用
     * 使用 DbUtils 关闭资源
     * DbUtils.closeQuietly();
     * or
     * DbUtils.close();
     *
     * @param conn
     * @param ps
     */
    public static void closeResource(Connection conn, Statement ps) {
        try {
            DbUtils.close(conn);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        try {
            DbUtils.close(ps);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

    /**
     * 关闭资源的操作,查询时使用
     * 使用 DbUtils 关闭资源
     * DbUtils.closeQuietly();
     * or
     * DbUtils.close();
     *
     * @param conn
     * @param ps
     * @param rs
     */
    public static void closeResource(Connection conn, Statement ps, ResultSet rs) {
        // 7 资源关闭
        DbUtils.closeQuietly(conn);
        DbUtils.closeQuietly(ps);
        DbUtils.closeQuietly(rs);
    }
}

4 BaseDao 编写

/**
 * ClassName: BaseDao
 * Description:
 *		利用 DbUtils 工具类实现 BaseDao
 * @Create 2023/11/3 13:58
 * @Version 1.0
 */
public abstract class BaseDao<T> {

    private QueryRunner queryRunner = new QueryRunner();

    // 定义一个变量来接收泛型的类型
    private Class<T> type;

    // 获取T的Class对象,获取泛型的类型,泛型是在被子类继承时才确定
    public BaseDao() {
        // 获取子类类型
        Class clazz = this.getClass();
        // 获取父类的类型
        // getGenericSuperclass()用来获取当前类的父类的类型
        // ParameterizedType表示的是带泛型的类型
        ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass();
        // 获取具体的泛型类型 getActualTypeArguments获取具体的泛型的类型
        // 这个方法会返回一个Type的数组
        Type[] types = parameterizedType.getActualTypeArguments();
        // 获取具体的泛型的类型
        this.type = (Class<T>) types[0];
    }


    /**
     * 通用的增删改操作
     *
     * @param sql
     * @param params
     * @return
     */
    public int update(Connection conn, String sql, Object... params) {
        int count = 0;
        try {
            count = queryRunner.update(conn, sql, params);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return count;
    }

    /**
     * 获取一个对象
     *
     * @param sql
     * @param params
     * @return
     */
    public T getBean(Connection conn, String sql, Object... params) {
        T t = null;
        try {
            t = queryRunner.query(conn, sql, new BeanHandler<T>(type), params);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return t;
    }

    /**
     * 获取所有对象
     *
     * @param sql
     * @param params
     * @return
     */
    public List<T> getBeanList(Connection conn, String sql, Object... params) {
        List<T> tList = null;
        try {
            tList = queryRunner.query(conn, sql, new BeanListHandler<>(type), params);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return tList;
    }

    /**
     * 获取特殊值,专门用来执行像 select count(*)...这样的sql语句
     *
     * @param sql
     * @param params
     * @return
     */
    public Object getValue(Connection conn, String sql, Object... params) {
        Object count = null;
        try {
            count = queryRunner.query(conn, sql, new ScalarHandler(), params);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return count;
    }
}

附文章学习内容出自尚硅谷。

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

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

相关文章

2-爬虫-代理池搭建、代理池使用(搭建django后端测试)、爬取某视频网站、爬取某视频网站、bs4介绍和遍历文档树

1 代理池搭建 2 代理池使用 2.1 搭建django后端测试 3 爬取某视频网站 4爬取某视频网站 5 bs4介绍和遍历文档树 1 代理池搭建 # ip代理-每个设备都会有自己的IP地址-电脑有ip地址---》访问一个网站---》访问太频繁---》封ip-收费&#xff1a;靠谱稳定--提供api-免费&#xff…

NOIP2023模拟10联测31 涂鸦

题目大意 有一面由 n m n\times m nm个格子组成的墙&#xff0c;每个格子要么是黑色&#xff0c;要么是白色。你每次将会进行这样的操作&#xff1a;等概率随机选择一个位置 ( x , y ) (x,y) (x,y)和一个颜色 c c c&#xff08;黑色或白色&#xff09;&#xff0c;&#xff0…

Portraiture4.1.2最新中文汉化版

提起PS后期修图人像美白磨皮&#xff0c;大家会想到各种磨皮工具&#xff0c;其中Portraiture这款磨皮效率超高&#xff0c;是99%摄影师的必备插件&#xff0c;一秒磨皮&#xff0c;无卡顿&#xff0c;效果好&#xff01;人像摄影师人均一款&#xff0c;磨皮质感非常好&#xf…

ER图:改变你数据库设计流程的神器!

在现今数据驱动的世界中&#xff0c;数据库设计扮演了至关重要的角色。为了实现有效且准确的数据存储和检索&#xff0c;企业们开始倾向于采用实体关系图&#xff08;Entity-Relationship Diagram&#xff0c;简称ER图&#xff09;来优化他们的数据库设计流程。本文将带你走进E…

Rust编程基础之条件表达式和循环

1.if表达式 if 表达式允许根据条件执行不同的代码分支, 以下代码是一个典型的使用if表达式的例子: fn main() {let number 3; ​if number < 5 {println!("condition was true");} else {println!("condition was false");} } 所有的 if 表达式都以…

win10 + vs2017 + cmake3.17编译OSG-3.4.1

参考教程&#xff1a;https://blog.csdn.net/bailang_zhizun/article/details/120992244 1. 下载与解压 2. 修改configure 1&#xff09;Ungrouped Entries -- 》ACTUAL_3RDPARTY_DIR: 设置为&#xff1a; D:/Depend_3rd_party/OSG341/3rdParty 2&#xff09; Ungrouped E…

免费的 AI 视频生成工具 Moonvalley 厉害了!Moonvalley 怎么用(保姆级教程)

一、Moonvalley 介绍 Moonvalley&#xff0c;号称地表最强的 AI 视频生成工具&#xff0c;到底有多厉害&#xff1f;今天一起来看一下~ 这是 Moonvalley 官网的介绍&#xff1a; Moonvalley 是一个开创性的新型文本到视频的生成式 AI 模型。用简单的文本即可创建出惊人的电影和…

分享一个自己写的免费的微信聊天记录提取软件 2023.11.03

有什么办法可以导出与某个人的微信聊天记录&#xff1f; 只想导出与某个微信好友的聊天记录&#xff0c;有办法做到吗&#xff1f;导出所有的话&#xff0c;文件太大了&#xff0c;只想导出与其中一个人的&#xff0c;求大神教。 我的需求和上面这个人的比较类似&#xff0c;因…

2023辽宁省数学建模竞赛选题建议及AB题思路

大家好呀&#xff0c;今天早上2023年辽宁省大学生数学建模竞赛开赛&#xff0c;在这里给大家带来初步的选题建议及思路。 注意&#xff0c;本文只是比较简略的图文版讲解&#xff0c;完整的视频版讲解请移步&#xff1a; 2023辽宁省数学建模竞赛选题建议及初步思路_哔哩哔哩_…

【面经】讲一下synchronized锁升级的过程

synchronized锁升级是指从偏向锁到轻量级锁&#xff0c;再到重量级锁的过程。 当线程获取synchronized对象时&#xff0c;首先会进行偏向锁的尝试。 如果偏向锁没有竞争&#xff0c;线程将永远不需要同步。 但是&#xff0c;如果偏向锁竞争失败&#xff0c;将升级到轻量级锁。…

python自动化测试模板

1:准备html模版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>接口自动化…

数据库管理-第114期 Exadata 05-ESS-上(202301103)

数据库管理-第114期 Exadata 05-ESS-上&#xff08;202301103&#xff09; 之前提到过&#xff0c;Exadata通过ESS将存储转换为了智能存储&#xff0c;其实相较于纸面参数非常牛逼但性能还是比不过Exadata的国产一体机&#xff0c;最大的差距也就是在ESS上&#xff0c;从数据库…

自动化测试如何准备测试数据

其实大部分类型的测试都需要去准备测试数据。 手工测试&#xff1a;一些基础数据&#xff0c;比如配置数据等等是需要去准备的&#xff1b;自动化测试&#xff1a;基础需要准备&#xff0c;现有数据&#xff0c;动态运行时产生的数据是需要准备的&#xff1b;性能测试&#xf…

华为云API Explorer伙伴招募火热进行中~

API编排新特性助力伙伴 零代码构建API工作流 实现快速集成场景编排能力 面向三大核心场景&#xff1a; API调用逻辑频繁改动 API间高耦合不便管理 复杂API解决方案难构建 伙伴加入可立享四大限时福利&#xff1a; 免费试用、专家咨询、技术指导、生态支持 点此报名>&…

XSpirit 2智能边缘计算机使用测评

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录 拆箱过程介绍视频使用感受 我之前就参加过 Spirit 1 第一代智能边缘计…

Web自动化测试 —— PageObject设计模式!

一、page object 模式简介 1.1、传统 UI 自动化的问题 无法适应 UI 频繁变化无法清晰表达业务用例场景大量的样板代码 driver/find/click 二、page object 设计原则 2.1、POM 模式的优势 降低 UI 变化导致的测试用例脆弱性问题让用例清晰明朗&#xff0c;与具体实现无关 2.…

人工智能AI创作系统ChatGPT网站系统源码+AI绘画系统支持GPT4.0/支持Midjourney局部重绘

一、前言 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建…

压缩软件 7-Zip VS WinZips

7-zip在联想应用商店给强烈推荐&#xff1f; 要说它好用还行&#xff0c;但每次压缩都显示网络连接失败等异常广告信息。 相反好用的7-ZIP必须鼠标点击右键点击更多才能够看到&#xff0c;这次更新体验也太差了吧&#xff1f; 用户放在第一位&#xff1f; 要不是更新后一直推…

【技术分享】RK356X Android 使用 libgpiod 测试gpio

前言 libgpiod 是用于与 Linux GPIO 字符设备交互的 C 库和工具库&#xff1b;此项目包含六种命令行工具&#xff08;gpiodetect、gpioinfo、gpioset、gpioget、gpiomon&#xff09;&#xff0c;使用这些工具可以在命令行设置和获取GPIO的状态信息&#xff1b;在程序开发中也可…

Python库学习(十二):数据分析Pandas[下篇]

接着上篇《Python库学习(十一):数据分析Pandas[上篇]》,继续学习Pandas 1.数据过滤 在数据处理中&#xff0c;我们经常会对数据进行过滤&#xff0c;为此Pandas中提供mask()和where()两个函数&#xff1b; mask(): 在 满足条件的情况下替换数据&#xff0c;而不满足条件的部分…