数据库连接池和数据库工具类DBUtils

2023-11-11

连接池

连接池:其实就是一个容器,在这个容器当中存放着多个连接对象。

​ 当系统开始运行时,可以让系统提前创建多个连接对象,放到容器中(连接池),当客户端需要连接对象时,可以从连接池中申请一个连接,去访问数据库,当该连接使用完毕时,不再释放归还给系统,而是把这个连接对象归还给连接池。

好处:

  • 可以大大的节省系统开销
  • 可以提高访问的速度

实现操作

javax.sql 连接池

JNDI —> Java naming and Directory Interface Java命名和目录接口

使用JNDI 降低程序和数据库的耦合度,是你的程序更加方便配置,维护和部署

是JavaEE规范中的重要规范之一。是EJB的相关的知识

DataSource接口 它里面并不提供具体的实现,而是由驱动程序供应商(数据库厂商)实现。

c3p0:他是数据库连接池的一套技术

druid:也是一套数据库连接池的技术,由阿里巴巴提供的。

C3p0:数据库连接池技术

步骤

  1. 去网上下载两个jar包:c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar

  2. 植入到工程的classpath类路径下,不要忘了导入mysql驱动jar包:mysql-connector-java-5.1.37-bin.jar

  3. 定义配置文件

    • 文件类型:c3p0.properties和c3p0-config.xml

    • 路径:放到classpath类路径下 对于工程来说直接放到src下面即可

  4. 获取DataSource对象:数据库连接池对象 通过实例化ComboPooledDataSource来获取

  5. 从连接池中获取连接对象。getConnection()

Druid:德鲁伊连接池技术

步骤

  1. 去官网下载德鲁伊的jar包:druid-1.0.9.jar
  2. 植入工程路径下,同样导入mysq驱动jar包
  3. 定义配置文件:使用properties文件类型,名字随便起
  4. 手动加载配置文件:Properties集合
  5. 获取DataSource对象:通过工厂方式来实现的,DruidDataSoutceFactory
  6. 从连接池中获取连接对象:getCOnnection()

JDBC Template

Spring框架提供了对JDBC操作的简单封装,使用JDBCTemplate对象来简化JDBC开发流程。

步骤:

  1. 从官网下载对应的spring-jdbc相关的jar包,导入到工程的类路径下,放到lib文件夹下面即可
  2. 创建JDBCTemplate对象。依赖于DataSouce连接池(数据源)
  3. 使用JDBCTemplate对象中的api方法实现crud操作
    • DML操作(增删改):update()方法
    • DQL操作(查询):查询 不用select 使用query
      • query():将查询的结果集封装成JavaBean对象
      • queryForMap():将查询的结果集封装成Map集合,只能封装一条记录:键是字段名,值是字段值,结果集的记录数只能是1
      • queryForList() :将结果集封装成List集合,在List集合中有多条记录,每一条记录都是一个Map集合:List<Map<Object,Object>> list
      • queryForObject() :将结果集封装成一个对象,一般用于聚合函数,查询总记录数 int count()

DBUtils工具类

优化JDBC开发的流程,使开发者只注重业务需求,而不是关注繁琐的jdbc开发步骤

步骤:

  1. 先从官网下载DBUtils的jar包 放到cllasspath类路径下,也就是lib文件夹下面,依赖于数据源

  2. 还需要下载数据库连接池jar包 c3p0/druid,数据库的驱动jar包 和commts-logging.jar包

  3. 搭建数据源工具类 DruidDBUtil 可以获取数据源(使用的druid)

  4. 从数据源获取连接 -->DBUtils 来直接操作sql

  5. aqi常用方法

    • update():执行DML语句 增删改操作 insert delete update
    • query(): 执行DQL语句 查询 select
  6. 具体操作

    1. 构造QueryRunner类对象,依赖于数据源

    2. 根据操作的类型选择是update()还是query()

      • update(sql,Object… parameters)

      • query(sql,ResultSetHandler接口实现类<对应的字节码对象类型>,Object… parameters)

      • 对ResultSetHandle做了实现

        • BeanHandle -->装配一个Bean对象(返回一条数据)

        • BeanListHandle -->装配多个Bean对象(返回多条数据)

        • MapListHandle -->装配多个Beam对象,每个对象被装配到Map集合中

        • ScalarHandler -->返回值是long类型(查询表中的记录数)

    3. 代码

      public class DBUtilsDemo01 {
          //构建QueryRunner类对象 获取数据源
          private static QueryRunner runner = new QueryRunner(DruidDBUtil.getDataSource());
      
          public static void main(String[] args) throws SQLException {
              //添加一条数据
              //insertData();
              //修改
              //updateData();
              //删除
              //deleteData();
              //查询一条
              //System.out.println(queryOne());
              //查询总信息值
              //System.out.println(queryAll());
              //查询总记录数
              System.out.println(queryTotalNum());
          }
          //添加
          public static void insertData(){
              //往account表中添加一条数据
              String sql = "insert into account values(null,?,?)";
              try {
                  int count = runner.update(sql, "小花", 4000);
                  if (count > 0){
                      System.out.println("添加成功");
                  }else {
                      System.out.println("添加失败");
                  }
              } catch (SQLException e) {
                  e.printStackTrace();
              }
          }
          //修改
          public  static void updateData() throws SQLException {
              int count = runner.update("update account set balance = ? where username = ?", 10000, "小花");
              if (count > 0){
                  System.out.println("修改成功");
              }else {
                  System.out.println("修改失败");
              }
          }
          //删除
          public static void deleteData() throws SQLException {
              int count = runner.update("delete from account where username = ?", "小花");
              if (count > 0){
                  System.out.println("删除成功");
              }else {
                  System.out.println("删除失败");
              }
          }
      	//查询一条记录
          public static Account queryOne() throws SQLException {
              //BeanHandle 对ResultSetHandle做了实现
              //查询id = 3的记录
              return runner.query("select * from account where id = ?", new BeanHandler<Account>(Account.class), 3);//需要有Account类
          }
      	//查询总信息值
          public static List<Account> queryAll() throws SQLException {
              //BeanListHandle
              return runner.query("select * from account",new BeanListHandler<Account>(Account.class));
          }
          //查询总记录数
          public static long queryTotalNum() throws SQLException {
              //ScalarHandler
             return runner.query("select count(id) from account where id > ?",new ScalarHandler<>(),2);
          }
      }
      
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库连接池和数据库工具类DBUtils 的相关文章

  • 在 ASP.NET MVC 中使用 MySQL 的 AccountController

    在 Visual Studio 中创建默认的 ASP NET MVC 项目会设置一个可以在其中注册用户的基本项目 我将如何继续更改它以使用 MySQL 服务器而不是 SQLServer 现在可以使用了 安装最新的 Connector NET
  • 从多个表中选择 - 一对多关系

    我有这样的表 表产品 身份证 姓名 表格图像 产品 ID 网址 订单号 表价 产品 ID 组合 货币 价格 表数量 产品 ID 组合 数量 表 Product 与其他表是一对多关系 我需要查询表并得到类似这样的结果 伪数组 ProductI
  • SQL:比较不同表中的两个计数

    我有 3 张桌子 一张桌子上有世界上每个国家及其代币 NAME CODE Afghanistan AFG Albania AL Algeria DZ American Samoa AMSA Andorra AND Angola ANG An
  • mySQL 返回可能有重复项的随机行

    我正在尝试随机化一定数量的行 但假设数据库中只有 4 行 而我需要获得 6 个随机行 我希望有可能 即使表中有超过 6 行 产生重复的行行 这在 mySQL 中很容易实现吗 我当前的查询是这样的 SELECT FROM winners OR
  • PDO::commit 之后使用 PDOStatement::rowCount 结果?

    在 MySQL 文档中 有一个关于使用的注释mysql affected rows事务提交后 http php net manual en function mysql affected rows php http php net manu
  • MySQL:你能指定一个随机限制吗?

    有没有办法在 SQL MySQL 中随机化限制数字 我希望能够做的是在查询中获取随机数量的结果以在插入子查询中使用 而无需任何服务器端脚本 我希望能够作为假设说明运行的查询是 SELECT id FROM users ORDER BY RA
  • 使用 EXPLAIN 进行 MYSQL 存储过程调用

    如何分析和使用 EXPLAIN 来调用我的存储过程 我需要优化查询时间 但是似乎没有地方可以执行 EXPLAIN 调用 proc name 你可以试试 set profiling 1 call proc name show profiles
  • 如何在 Laravel 中编写联合查询?

    我正在使用 laravel 5 0 并且我有 mysql 查询 SELECT surat masuk id surat surat masuk nomor surat FROM surat masuk WHERE EXISTS SELECT
  • MySql 查询在选择中将 NULL 替换为空字符串

    如何用空字符串替换 select 中的 NULL 值 输出 NULL 值看起来不太专业 这是非常不寻常的 根据我的语法 我希望它能够工作 我希望能得到一个解释 为什么没有 select CASE prereq WHEN prereq IS
  • 如何使用 PHP 从 MySQL 查询中按升序对值进行排序?

    我使用以下 PHP 脚本从 MySQL 表中获取和更改数据 并将结果打印在 HTML 表中 我希望按升序对数据进行排序 utilization percentage变量 它是由创建的 total client time total avai
  • MySQL“选择更新”行为

    根据 MySql 文档 MySql 支持多粒度锁定 MGL case 1 开放航站楼 1 连接到mysql mysql gt start transaction Query OK 0 rows affected 0 00 sec mysql
  • 在 MySQL 中将行转置为列

    如何在 MySQL 查询中将行转换为列 您可以将行变成a列与GROUP CONCAT 但您无法以任何自动方式转置整个结果集 您可以编写手动生成每一列的查询 也可以在应用程序中执行此操作 以下是有关编写复杂查询来模拟转置的教程 http ww
  • PDO::commit() 成功或失败

    The PHP PDO 提交 http www php net manual en pdo commit php文档指出该方法成功时返回 TRUE 失败时返回 FALSE 这是指beginTransaction 和commit 之间的语句执
  • Laravel Sum 列数据库 Eloquent

    尝试获取我的一个表中 int 字段的总和应该非常容易 不幸的是 事实并非如此 因为无论我使用 Laravel MySQL 还是 Excel 我都会得到不同的结果 Laravel 5 4 给了我20506 Table sum field na
  • PHP/MySQL:如何在网站中创建评论部分[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我不会问 如何使用 PHP MySQ
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • SQL Server 相当于 MySQL 的 USING

    在 MySQL 中 当您连接不同表中具有相同名称的列时 可以在连接中使用关键字 USING 例如 这些查询产生相同的结果 SELECT FROM user INNER JOIN perm USING uid SELECT FROM user
  • 数据表 - 服务器端处理 - 数据库列合并

    我目前正在使用 DataTables 1 10 5 服务器端处理功能 http www datatables net examples data sources server side html http www datatables ne
  • 我可以在一个查询中更新/选择表吗?

    我需要在查看页面时选择数据并更新 视图 列 有没有一种方法可以在一个查询中执行此操作 或者我是否必须使用不同的查询 如果您不想 不需要使用事务 则可以创建一个存储过程 该过程首先更新视图计数 然后选择值并将其返回给用户
  • 让 Prometheus 发送 SQL 查询

    我正在尝试使用普罗米修斯 https prometheus io 监视我的 MySQL 数据库 但似乎找不到添加 SQL 查询的区域 例如 我想运行一个返回值的 SQL 查询 然后将该值添加到图表中 发送警报 有没有办法让 Promethe

随机推荐

  • 牛客-困难及极难难度python

    1 字符串最后一个单词的长度 计算字符串最后一个单词的长度 单词以空格隔开 字符串长度小于5000 def get length input str input str list input str strip split if len s
  • 高并发内存池项目(concurrent memory pool)

    一 高并内存池概念 内存池 Memory Pool 是一种动态内存分配与管理技术 通常情况下 程序员习惯直接使用 new delete malloc free 等API申请分配和释放内存 这样导致的后果是 当程序长时间运行时 由于所申请内存
  • Git使用方法笔记1——Git

    git 安装包 源 https npm taobao org mirrors git for windows v2 22 0 windows 1 一 Git基本操作 查看git安装路径 where git 1 设置本地系统用户名和邮箱 gi
  • 基于ArcGIS的nc(NETCDF)转tif格式

    软件版本 ArcMap10 4 1 nc NETCDF 是一组独立于机器的软件库支持创建 访问和共享面向阵列的数据格式科学数据 它也是共享科学数据的社区标准 摘自Unidata官网 被广泛应用于大气 海洋 水文等领域 是我们日常学习和工作中
  • LVM 磁盘结构

    复杂度3 5 机密度4 5 最后更新2021 05 17 VG由一堆PV组成 每个PV的头是ipl rec 无论这个PV能不能boot 只要是AIX的盘 曾经标记过PVID 都在最初0字节标记0xc9c2d4c1 这个是EBCIDIC编码的
  • c++ 代码连接激光雷达,使用 pybind11 得到python模块,可以直接在python中连接雷达,获取 numpy 格式激光数据

    注意 这个程序最后需要编译为 python 的一个模块 然后导入python中使用 底层原理是python调用c 程序连接激光雷达 然后把获取的数据转换为numpy格式 因为用python太慢了 C 函数 用于获取一个帧的数据并将其转换为P
  • 【leetcode】Java 力扣第一题(两数之和)简单

    废话不多说 直接上干货 Leetcode每日一题 2021 10 18开启 有的人夜里去看海 有的人力扣第一题就做不出来 犹记得那次在刘老师强推下开了力扣的刷题之旅 用打开力扣APP 第一题 选择简单模式 轻车熟路 啧啧啧 给定一个整数数组
  • 使用apifox前置数据base64编码并添加一个字段

    具体前置脚本如下 pm request body update 处理 body 参数里的变量 let bodyStr pm request body raw base64 编码数据 let bodyEncode btoa bodyStr c
  • 单片机学习笔记-如何计算数码管段码

    如何计算数码管段码 转自百度知道 https jingyan baidu com article 20b68a88f2c3bf796dec625f html 我们在使用数码管的时候 不可避免地要用到数码管的段码 没有段码那么我们就不能正确的
  • 2023数学建模国赛游记

    第一参加数学建模国赛 大概也是最后一次参加了 记录一下这几天的历程吧 我们队的情况是计算机 电气 数统 计算机负责编程 电气学院的负责论文部分 数统的同学负责建模 数据处理部分我们是共同承担 第一天下午6点发题 5点学校的所有队伍基本都到管
  • 产品经理修炼手册—上瘾

    现在的人们越来越喜欢用上瘾某款应用来形容一个人了 比如对游戏上瘾 对网上购物上瘾等 这次想来整理一下关于如何让用户喜欢也就是上瘾一款产品的步骤 当然 需要让大家理解一些前提 首先是 产品分为维生素和止痛药 顾名思义 维生素是吃下去但是并不知
  • QT 在信号草里面刷新控件立即生效的办法:qApp->processEvents();

    void setdid on lbt start set did clicked ui gt lln set did result gt setText ui gt lln apiLicence gt setText qApp gt pro
  • 单目标应用:基于麻雀搜索算法优化灰色神经网络(grey neural network)的数据预测(提供MATLAB代码)

    一 麻雀搜索算法 麻雀搜索算法 sparrow search algorithm SSA 由Jiankai Xue等人于2020年提出 该算法是根据麻雀觅食并逃避捕食者的行为而提出的群智能优化算法 SSA 主要是受麻雀的觅食行为和反捕食行为
  • flink 1.9.0 编译:flink-fs-hadoop-shaded 找不到

    1 编译 lcc lcc flink mvn clean install Dmaven test skip true Dhadoop version 2 8 3 Dmaven javadoc skip true Dcheckstyle sk
  • JSSE访问带有未验证证书的HTTPS

    摘 要JSSE是一个SSL和TLS的纯Java实现 通过JSSE可以很容易地编程实现对HTTPS站点的访问 但是 如果该站点的证书未经权威机构的验证 JSSE将拒绝信任该证书从而不能访问HTTPS站点 本文在简要介绍JSSE的基础上提出了两
  • Fastjson 1.2.80 及以下版本反序列化漏洞(FastJson ≤1.2.80) rce

    0x01简要描述 Fastjson 是阿里巴巴的开源 JSON 解析库 它可以解析 JSON 格式的字符串 支持将 Java Bean 序列化为 JSON字符串 也可以从 JSON 字符串反序列化到 JavaBean 在 Fastjson
  • 英特尔服务器新消息,英特尔10nm Ice Lake-SP服务器处理器或将延迟到2021年第一季度...

    10月6日消息 据报道 服务器品牌供应链表示 第四季度出货存在较大变数 出货量将有所疲软 主要是业界内称英特尔 10nm 的 Ice Lake SP 服务器处理器到明年第一季度才能出炉 导致大部分品牌出货推迟 报道指出 英特尔已通知其合作伙
  • 【算法基础】时间复杂度和空间复杂度

    目录 1 算法的评价 2 算法复杂度 2 1 时间复杂度 Time Complexity 2 1 1 如何计算时间复杂度 2 1 2 常见的时间复杂度类别与示例 2 2 空间复杂度 2 2 1 如何计算空间复杂度 2 2 2 常见的空间复杂
  • 以太坊控制台基本命令行操作

    创建账户 personal newAccount 123456 输入的参数是该账户对应的密码 账户地址保存在主目录下的keystore目录中 查询系统中的账户 personal listAccounts eth accounts 这个两个命
  • 数据库连接池和数据库工具类DBUtils

    连接池 连接池 其实就是一个容器 在这个容器当中存放着多个连接对象 当系统开始运行时 可以让系统提前创建多个连接对象 放到容器中 连接池 当客户端需要连接对象时 可以从连接池中申请一个连接 去访问数据库 当该连接使用完毕时 不再释放归还给系