JDBC(数据库连接池&DBUtils)

一、数据库连接池

1.1 数据库连接池简介

  • 数据库连接池是个容器,负责分配、管理数据库连接(Connection)

  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;

  • 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏

  • 好处:

    • 程序启动时提前创建好连接,不用用户请求时创建,给服务器减轻压力

    • 连接关闭的时候不会直接销毁connection,这样能够重复利用

    • 如果超过设定的连接数量但是还没有达到最大值,那么可以再创建

    • 如果空闲了,会默认销毁(释放)一些连接,让系统性能达到最优

之前我们代码中使用连接是每次使用都创建一个Connection对象,使用完毕就会将其销毁。这样重复创建销毁的过程是特别耗费计算机的性能的及消耗时间的

1.2 数据库连接池实现

  • 标准接口:==DataSource== 数据源

    官方(SUN) 提供的数据库连接池标准接口,由第三方组织实现此接口。该接口提供了获取连接的功能:

    复制代码
    Connection getConnection()

    那么以后就不需要通过 DriverManager 对象获取 Connection 对象,而是通过连接池(DataSource)获取 Connection 对象。

  • 常见的数据库连接池

    • DBCP 是Apache提供的数据库连接池,速度相对c3p0较快,但因自身存在BUG,容易丢失连接, 不安全, Hibernate3已不再提供支持

    • C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以

    • Druid 是阿里提供的数据库连接池,替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。

    我们现在使用更多的是Druid,它的性能比其他两个会好一些。

  • Druid(德鲁伊)

    • Druid连接池是阿里巴巴开源的数据库连接池项目

    • 功能强大,性能优秀,是Java语言最好的数据库连接池之一

1.3 Driud使用

  • 导入jar包 druid-1.1.12.jar

  • 定义配置文件

  • 加载配置文件

  • 获取数据库连接池对象

  • 获取连接

二、JDBC练习

2.1 需求

完成商品品牌数据的增删改查操作

  • 查询:查询所有数据

  • 添加:添加品牌

  • 修改:根据id修改

  • 删除:根据id删除

2.2案列

  • 数据库表 tb_brand

    复制代码
    -- 删除tb_brand表
    drop table if exists tb_brand;
    -- 创建tb_brand表
    create table tb_brand (
        -- id 主键
        id int primary key auto_increment,
        -- 品牌名称
        brandName varchar(20),
        -- 企业名称
        companyName varchar(20),
        -- 排序字段
        ordered int,
        -- 描述信息
        description varchar(100),
        -- 状态:0:禁用  1:启用
        status int
    );
    -- 添加数据
    insert into tb_brand (brandName, companyName, ordered, description, status)
    values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
           ('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
           ('小米', '小米科技有限公司', 50, 'are you ok', 1);
  • 在pojo包下实体类 Brand

    复制代码
    /**
     * 品牌
     * alt + 鼠标左键:整列编辑
     * 在实体类中,基本数据类型建议使用其对应的包装类型
     */
    public class Brand {
        // id 主键
        private Integer id;
        // 品牌名称
        private String brandName;
        // 企业名称
        private String companyName;
        // 排序字段
        private Integer ordered;
        // 描述信息
        private String description;
        // 状态:0:禁用  1:启用
        private Integer status;
    ​
        public Brand() {
        }
    ​
        public Brand(Integer id, String brandName, String companyName, Integer ordered, String description, Integer status) {
            this.id = id;
            this.brandName = brandName;
            this.companyName = companyName;
            this.ordered = ordered;
            this.description = description;
            this.status = status;
        }
    ​
        public Integer getId() {
            return id;
        }
    ​
        public void setId(Integer id) {
            this.id = id;
        }
    ​
        public String getBrandName() {
            return brandName;
        }
    ​
        public void setBrandName(String brandName) {
            this.brandName = brandName;
        }
    ​
        public String getCompanyName() {
            return companyName;
        }
    ​
        public void setCompanyName(String companyName) {
            this.companyName = companyName;
        }
    ​
        public Integer getOrdered() {
            return ordered;
        }
    ​
        public void setOrdered(Integer ordered) {
            this.ordered = ordered;
        }
    ​
        public String getDescription() {
            return description;
        }
    ​
        public void setDescription(String description) {
            this.description = description;
        }
    ​
        public Integer getStatus() {
            return status;
        }
    ​
        public void setStatus(Integer status) {
            this.status = status;
        }
    ​
        @Override
        public String toString() {
            return "Brand{" +
                    "id=" + id +
                    ", brandName='" + brandName + '\'' +
                    ", companyName='" + companyName + '\'' +
                    ", ordered=" + ordered +
                    ", description='" + description + '\'' +
                    ", status=" + status +
                    '}';
        }
    }
2.2.2 查询所有
复制代码
 /**
   * 查询所有
   * 1. SQL:select * from tb_brand;
   * 2. 参数:不需要
   * 3. 结果:List<Brand>
   */
@Test
public void testSelectAll() throws Exception {
    //1. 获取Connection
    //3. 加载配置文件
    Properties prop = new Properties();
    prop.load(DruidTest.class.getResourceAsStream("/druid.properties"));
    //4. 获取连接池对象
    DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
​
    //5. 获取数据库连接 Connection
    Connection conn = dataSource.getConnection();
    //2. 定义SQL
    String sql = "select * from tb_brand;";
    //3. 获取pstmt对象
    PreparedStatement ps = conn.prepareStatement(sql);
    //4. 设置参数
    //5. 执行SQL
    ResultSet rs = ps.executeQuery();
    //6. 处理结果 List<Brand> 封装Brand对象,装载List集合
    List<Brand> brands = new ArrayList<>();
    while (rs.next()){
        //获取数据
        int id = rs.getInt("id");
        String brandName = rs.getString("brandName");
        String companyName = rs.getString("companyName");
        int ordered = rs.getInt("ordered");
        String description = rs.getString("description");
        int status = rs.getInt("status");
        //封装Brand对象
        Brand brand = new Brand();
        brand.setId(id);
        brand.setBrandName(brandName);
        brand.setCompanyName(companyName);
        brand.setOrdered(ordered);
        brand.setDescription(description);
        brand.setStatus(status);
​
        //装载集合
        brands.add(brand);
    }
    System.out.println(brands);
    //7. 释放资源
    rs.close();
    ps.close();
    conn.close();
}
2.2.3 添加数据
复制代码
/**
  * 添加
  * 1. SQL:insert into tb_brand(brand_name, company_name, ordered, description, status) values(?,?,?,?,?);
  * 2. 参数:需要,除了id之外的所有参数信息
  * 3. 结果:boolean
  */
@Test
public void testAdd() throws Exception {
    // 接收页面提交的参数
    String brandName = "香飘飘";
    String companyName = "香飘飘";
    int ordered = 1;
    String description = "绕地球一圈";
    int status = 1;
​
    //1. 获取Connection
    //3. 加载配置文件
    Properties prop = new Properties();
    prop.load(DruidTest.class.getResourceAsStream("/druid.properties"));
    //4. 获取连接池对象
    DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
    //5. 获取数据库连接 Connection
    Connection conn = dataSource.getConnection();
    //2. 定义SQL
    String sql = "insert into tb_brand(brandName, companyName, ordered, description, status) values(?,?,?,?,?);";
    //3. 获取pstmt对象
    PreparedStatement ps = conn.prepareStatement(sql);
    //4. 设置参数
    ps.setString(1,brandName);
    ps.setString(2,companyName);
    ps.setInt(3,ordered);
    ps.setString(4,description);
    ps.setInt(5,status);
​
    //5. 执行SQL
    int count = ps.executeUpdate(); // 影响的行数
    //6. 处理结果
    System.out.println(count > 0);
​
    //7. 释放资源
    ps.close();
    conn.close();
}
2.2.4 修改数据
复制代码
/**
  * 修改
  * 1. SQL:
​
     update tb_brand
         set brand_name  = ?,
         company_name= ?,
         ordered     = ?,
         description = ?,
         status      = ?
     where id = ?
​
   * 2. 参数:需要,所有数据
   * 3. 结果:boolean
   */
@Test
public void testUpdate() throws Exception {
    // 接收页面提交的参数
    String brandName = "香飘飘";
    String companyName = "香飘飘";
    int ordered = 1000;
    String description = "绕地球三圈";
    int status = 1;
    int id = 4;
​
    //1. 获取Connection
    //3. 加载配置文件
    Properties prop = new Properties();
    prop.load(DruidTest.class.getResourceAsStream("/druid.properties"));
    //4. 获取连接池对象
    DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
    //5. 获取数据库连接 Connection
    Connection conn = dataSource.getConnection();
    //2. 定义SQL
    String sql = " update tb_brand\n" +
        "         set brandName  = ?,\n" +
        "         companyName= ?,\n" +
        "         ordered     = ?,\n" +
        "         description = ?,\n" +
        "         status      = ?\n" +
        "     where id = ?";
​
    //3. 获取pstmt对象
    PreparedStatement ps = conn.prepareStatement(sql);
​
    //4. 设置参数
    ps.setString(1,brandName);
    ps.setString(2,companyName);
    ps.setInt(3,ordered);
    ps.setString(4,description);
    ps.setInt(5,status);
    ps.setInt(6,id);
​
    //5. 执行SQL
    int count = ps.executeUpdate(); // 影响的行数
    //6. 处理结果
    System.out.println(count > 0);
​
    //7. 释放资源
    ps.close();
    conn.close();
}
2.2.5 删除数据
复制代码
/**
  * 删除
  * 1. SQL:
            delete from tb_brand where id = ?
  * 2. 参数:需要,id
  * 3. 结果:boolean
  */
@Test
public void testDeleteById() throws Exception {
    // 接收页面提交的参数
    int id = 4;
    //1. 获取Connection
    //3. 加载配置文件
    Properties prop = new Properties();
    prop.load(DruidTest.class.getResourceAsStream("/druid.properties"));
    //4. 获取连接池对象
    DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
    //5. 获取数据库连接 Connection
    Connection conn = dataSource.getConnection();
    //2. 定义SQL
    String sql = " delete from tb_brand where id = ?";
    //3. 获取pstmt对象
    PreparedStatement ps = conn.prepareStatement(sql);
    //4. 设置参数
    ps.setInt(1,id);
    //5. 执行SQL
    int count = ps.executeUpdate(); // 影响的行数
    //6. 处理结果
    System.out.println(count > 0);
​
    //7. 释放资源
    ps.close();
    conn.close();
}
相关推荐
标书畅畅行1 小时前
深度解析钛投标AI标书工具:全流程企业级AI投标解决方案,重构投标数字化生产力
大数据·数据库·人工智能
Wait....1 小时前
MySQL底层知识总结
数据库·mysql
Chengbei111 小时前
CTF & 红队专用 AI 求解AI 引擎 Cairn 系统,化轻量化部署,红队、CTF、漏洞研究一站式解决方案
java·人工智能·安全·web安全·网络安全·系统安全
墨白曦煜1 小时前
算法实战笔记:空间换时间的黑魔法——单调栈全景解析(十一)
java·笔记·算法
AI玫瑰助手1 小时前
Python函数:函数的文档字符串(docstring)编写
android·java·python
闪电悠米1 小时前
黑马点评-Redis 消息队列-04_stream_seckill_order
数据库·redis·分布式·缓存·oracle·junit·lua
周末也要写八哥1 小时前
线程的生命周期之“守护“线程
java·开发语言·jvm
乐之者v1 小时前
地图技术后端开发的知识点
java
SeaTunnel1 小时前
87 个 PR 迭代复盘|Apache SeaTunnel 5 月版本重点更新解读
大数据·数据库·开源·apache·seatunnel