0


【JAVA高级】——Druid连接池和Apache的DBUtils使用

在这里插入图片描述

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:JAVA开发者成长之路
✨特色专栏:国学周更-心性养成之路
🥭本文内容:Druid连接池和Apache的DBUtils使用
更多内容点击👇
       封装JDBC中的DaoUtils工具类(Object类型方法)

文章目录

在这里插入图片描述

💖 Druid连接池

【1】连接池思想

  在程序初始化时,提前创建好指定数量的数据库连接对象存储在“池子”中(这个池子称为“连接池”),当需要连接数据库的时候,从这个“池子”中取出一个连接对象使用,使用完毕后,不会将这个连接对象关闭,而是将这个连接对象放回“池子”中,实现复用,节省资源。

【2】Druid连接池使用步骤

2.1 引入相关jar包

  在lib文件夹中引入druid-1.1.5.jar文件和mysql-connector-java-5.1.0-bin.jar文件,并将两个jar文件配置到项目中。

2.2 创建database.properties配置文件

在src文件夹下创建database.properties配置文件,配置文件中内容如下:

连接设置

初始化连接,连接池连接对象数量

最大连接数

最小空闲连接

超时等待时间(毫秒为单位)

# 连接设置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdatabase
username=root
password=123456

# 初始化连接,连接池连接对象数量
initialSize=10

#最大连接数
maxActive=30

#最小空闲连接
maxIdle=5

#超时等待时间(毫秒为单位)
maxWait=3000

2.3 编写连接池工具类

声明一个连接池对象

实例化配置文件对象

加载配置文件内容

创建连接池

获取连接对象

通过连接池获得连接对象

释放资源,将连接对象放入连接池中

使用完连接对象后,将连接对象还给连接池,这里的close()方法是DruidPooledConnection实现类里的close()方法,将connection连接对象还给连接池

package com.cxyzxc.www.utils;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;import com.alibaba.druid.pool.DruidDataSource;import com.alibaba.druid.pool.DruidDataSourceFactory;publicclassDBUtils{// 声明一个连接池对象privatestatic DruidDataSource druidDataSource;static{// 实例化配置文件对象
        Properties properties =newProperties();try{// 加载配置文件内容
            InputStream is = DBUtils.class.getResourceAsStream("/database.properties");
            properties.load(is);// 创建连接池
            druidDataSource =(DruidDataSource) DruidDataSourceFactory
                    .createDataSource(properties);}catch(IOException e){
            e.printStackTrace();}catch(Exception e){
            e.printStackTrace();}}// 获取连接对象publicstatic Connection getConnection(){try{// 通过连接池获得连接对象return druidDataSource.getConnection();}catch(SQLException e){
            e.printStackTrace();}return null;}// 释放资源,将连接对象放入连接池中publicstaticvoidcloseAll(Connection connection, Statement statement,
            ResultSet resultSet){try{if(resultSet != null){
                resultSet.close();}if(statement != null){
                statement.close();}if(connection != null){// 使用完连接对象后,将连接对象还给连接池,这里的close()方法是DruidPooledConnection实现类里的close()方法,将connection连接对象还给连接池
                connection.close();}}catch(SQLException e){
            e.printStackTrace();}}}

【3】Druid连接池测试

package com.cxyzxc.www.utils;import java.sql.Connection;publicclassTest{publicstaticvoidmain(String[] args){// 获取20个连接对象,输出连接对象,地址值不同for(int i =1; i <=20; i++){
            Connection connection = DBUtils.getConnection();
            System.out.println(connection);// 调用关闭连接对象的方法后,发现获取的20个连接对象地址值是同一个,说明每次从连接池中取出的连接对象是同一个// DBUtils.closeAll(connection, null, null);}}}

💖 Apache的DBUtils使用

  前面的DBUtils工具类是我们经过千难万阻自己封装的,也有一些组织给我们封装DBUtils工具类,比如Apache组织提供了一个对JDBC进行简单封装的开源工具类库Commons DbUtils类,使用它能够简化JDBC应用程序的开发,同时也不影响程序的性能。

【1】Apache DBUtils介绍

1.1 Apache DBUtils特征

Apache DBUtils是java编程中的数据库操作实用工具,小巧简单实用,主要特征有:

1)对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作;

2)对于数据表的写操作,也变得很简单(只需写sql语句)

3)可以使用数据源,使用JNDI,数据库连接池等技术来优化性能–重用已经构建好的数据库连接对象,而不像php,asp那样,费时费力的不断重复的构建和析构这样的对象。

1.2 Apache DbUtils主要组成

1)ResultSetHandler接口:转换类型接口

BeanHandler类:实现类,把一条记录转换成对象。

BeanListHandler类:实现类,把多条记录转换成List集合。

ScalarHandler类:实现类,适合获取一行一列的数据。

2)QueryRunner类:执行SQL语句的类

update()方法:增、删、改

query()方法:查询

1.3 Apache DbUtils使用步骤

1)创建lib文件夹,导入需要的jar包,并将其配置到项目中

mysql-connector-java-5.1.0-bin.jar

druid-1.1.5.jar

commons-dbutils-1.7.jar

2)在src文件夹下创建database.properties配置文件,配置文件中内容如下:

连接设置

初始化连接,连接池连接对象数量

最大连接数

最小空闲连接

超时等待时间(毫秒为单位)

# 连接设置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdatabase
username=root
password=123456

# 初始化连接,连接池连接对象数量
initialSize=10

#最大连接数
maxActive=30

#最小空闲连接
maxIdle=5

#超时等待时间(毫秒为单位)
maxWait=3000

3)编写DBUtils连接池工具类

声明一个连接池对象

实例化配置文件对象

加载配置文件内容

创建连接池

返回一个数据源

package com.cxyzxc.www.utils;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid.pool.DruidDataSource;import com.alibaba.druid.pool.DruidDataSourceFactory;publicclassDBUtils{// 声明一个连接池对象privatestatic DruidDataSource druidDataSource;static{// 实例化配置文件对象
        Properties properties =newProperties();try{// 加载配置文件内容
            InputStream is = DBUtils.class.getResourceAsStream("/database.properties");
            properties.load(is);// 创建连接池
            druidDataSource =(DruidDataSource) DruidDataSourceFactory
                    .createDataSource(properties);}catch(IOException e){
            e.printStackTrace();}catch(Exception e){
            e.printStackTrace();}}//返回一个数据源publicstatic DataSource getDataSource(){return druidDataSource;}}

【2】综合案例

2.1 创建product表

CREATETABLEIFNOTEXISTS`product`(`pid`INTPRIMARYKEYAUTO_INCREMENTCOMMENT'产品编号',`pname`VARCHAR(20)NOTNULLCOMMENT'产品名称',`price`DOUBLENOTNULLCOMMENT'产品价格',`birthday`DATENOTNULLCOMMENT'产品生产日期');

2.2 向表中添加数据

INSERTINTO`product`(`pid`,`pname`,`price`,`birthday`)VALUES(1001,'虎皮凤爪',20.5,'2022-06-12');INSERTINTO`product`(`pid`,`pname`,`price`,`birthday`)VALUES(1002,'卧龙锅巴',18.5,'2022-09-22');

2.3 创建实体类Product

  • 添加实体类的私有变量
  • 添加有参无参构造方法
  • 添加get/set方法
  • 重写toString()方法
package com.cxyzxc.www.entity;import java.util.Date;publicclassProduct{privateint pid;private String pname;privatedouble price;private Date birthday;publicProduct(){super();}publicProduct(String pname,double price, Date birthday){super();this.pname = pname;this.price = price;this.birthday = birthday;}publicProduct(int pid, String pname,double price, Date birthday){super();this.pid = pid;this.pname = pname;this.price = price;this.birthday = birthday;}publicintgetPid(){return pid;}publicvoidsetPid(int pid){this.pid = pid;}public String getPname(){return pname;}publicvoidsetPname(String pname){this.pname = pname;}publicdoublegetPrice(){return price;}publicvoidsetPrice(double price){this.price = price;}public Date getBirthday(){return birthday;}publicvoidsetBirthday(Date birthday){this.birthday = birthday;}@Overridepublic String toString(){return"Product [pid="+ pid +", pname="+ pname +", price="+ price
                +", birthday="+ birthday +"]";}}

2.4 创建ProductDao接口

创建ProductDao接口,实现增删改查方法名的统一。

package com.cxyzxc.www.dao;import java.util.List;import com.cxyzxc.www.entity.Product;publicinterfaceProductDao{//添加intinsert(Product product);//删除intdelete(int pid);//修改intupdate(Product product);//查询单个
    Product selectOne(int pid);//查询所有
    List<Product>selectAll();}

2.5 创建ProductDaoImpl实现类

创建ProductDaoImpl实现类来实现ProductDao接口,在重新方法中编写具体的逻辑代码。

package com.cxyzxc.www.dao.impl;import java.sql.SQLException;import java.util.List;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanHandler;import org.apache.commons.dbutils.handlers.BeanListHandler;import com.cxyzxc.www.dao.ProductDao;import com.cxyzxc.www.entity.Product;import com.cxyzxc.www.utils.DBUtils;import com.cxyzxc.www.utils.DateUtils;publicclassProductDaoImplimplementsProductDao{// 创建QueryRunner对象,并传递一个数据源对象private QueryRunner queryRunner =newQueryRunner(DBUtils.getDataSource());@Overridepublicintinsert(Product product){

        String sql ="INSERT INTO `product`(`pname`,`price`,`birthday`)VALUES(?,?,?);";
        Object[] args ={ product.getPname(), product.getPrice(),
                DateUtils.utilDateToSqlDate(product.getBirthday())};try{return queryRunner.update(sql, args);}catch(SQLException e){
            e.printStackTrace();}return0;}@Overridepublicintdelete(int pid){
        String sql ="DELETE FROM `product` WHERE `pid` = ?;";try{return queryRunner.update(sql, pid);}catch(SQLException e){
            e.printStackTrace();}return0;}@Overridepublicintupdate(Product product){

        String sql ="UPDATE `product` SET `pname` = ?,`price`=?,`birthday`=? WHERE `pid`=?;";

        Object[] args ={ product.getPname(), product.getPrice(),
                DateUtils.utilDateToSqlDate(product.getBirthday()),
                product.getPid()};try{return queryRunner.update(sql, args);}catch(SQLException e){
            e.printStackTrace();}return0;}@Overridepublic Product selectOne(int pid){// 查询一个数据,使用BeanHandler将记录转换为对象
        BeanHandler<Product> product =newBeanHandler<Product>(Product.class);
        String sql ="SELECT * FROM `product` WHERE `pid`=?;";try{return queryRunner.query(sql, product, pid);}catch(SQLException e){
            e.printStackTrace();}return null;}@Overridepublic List<Product>selectAll(){// 查询一个数据,使用BeanHandler将记录转换为对象
        BeanListHandler<Product> productList =newBeanListHandler<Product>(Product.class);
        String sql ="SELECT * FROM `product`;";try{return queryRunner.query(sql, productList);}catch(SQLException e){
            e.printStackTrace();}return null;}}

2.6 创建ProductService接口

创建ProductService接口来实现业务层增删改查方法名的统一。

package com.cxyzxc.service;import java.util.List;import com.cxyzxc.www.entity.Product;publicinterfaceProductService{//增加intaddProduct(Product product);//删除intdeleteProduct(int pid);//修改intupdateProduct(Product product);//查询单个
    Product selectOneProduct(int pid);//查询所有
    List<Product>selectAllProduct();}

2.7 创建ProductServiceImpl实现类

创建ProductServiceImpl实现类来实现ProductService接口。

package com.cxyzxc.service.impl;import java.util.List;import com.cxyzxc.service.ProductService;import com.cxyzxc.www.dao.ProductDao;import com.cxyzxc.www.dao.impl.ProductDaoImpl;import com.cxyzxc.www.entity.Product;publicclassProductServiceImplimplementsProductService{
    ProductDao productDao =newProductDaoImpl();@OverridepublicintaddProduct(Product product){// 查询添加的商品是否存在
        Product pd = productDao.selectOne(product.getPid());if(pd == null){return productDao.insert(product);}else{
            System.out.println("商品已经存在,不能重复添加");}return0;}@OverridepublicintdeleteProduct(int pid){// 查询添加的商品是否存在
        Product pd = productDao.selectOne(pid);if(pd != null){return productDao.delete(pid);}else{
            System.out.println("商品不存在,不能删除");}return0;}@OverridepublicintupdateProduct(Product product){// 查询添加的商品是否存在
        Product pd = productDao.selectOne(product.getPid());if(pd!= null){return productDao.update(product);}else{
            System.out.println("商品不存在,不能修改");}return0;}@Overridepublic Product selectOneProduct(int pid){
        Product product =productDao.selectOne(pid);if(product!=null){return product;}else{
            System.out.println("没有你要查找产品,查找失败");}return null;}@Overridepublic List<Product>selectAllProduct(){
         List<Product> productList = productDao.selectAll();if(productList.size()!=0){return productList;}else{
             System.out.println("数据库为空,没有产品");}return null;}}

2.8 创建测试类

2.8.1 测试插入数据

package com.cxyzxc.www.view;import com.cxyzxc.service.ProductService;import com.cxyzxc.service.impl.ProductServiceImpl;import com.cxyzxc.www.entity.Product;import com.cxyzxc.www.utils.DateUtils;publicclassTest01InsertProduct{publicstaticvoidmain(String[] args){//创建ProductService引用,指向ProductServiceImpl实现类
        ProductService productService =newProductServiceImpl();//增加产品
         Product product =newProduct(1003,"流心威化饼干",13.5, DateUtils.strDateToUtilDate("2022-11-10"));int result = productService.addProduct(product);
         
         String str = result==1?"商品添加成功":"商品添加失败";
         System.out.println(str);}}

2.8.2 测试删除数据

package com.cxyzxc.www.view;import com.cxyzxc.service.ProductService;import com.cxyzxc.service.impl.ProductServiceImpl;publicclassTest02DeleteProduct{publicstaticvoidmain(String[] args){// 创建ProductService引用,指向ProductServiceImpl实现类
        ProductService productService =newProductServiceImpl();int result = productService.deleteProduct(1003);

        String str = result ==1?"删除成功":"删除失败";
        System.out.println(str);}}

2.8.3 测试修改数据

package com.cxyzxc.www.view;import com.cxyzxc.service.ProductService;import com.cxyzxc.service.impl.ProductServiceImpl;import com.cxyzxc.www.entity.Product;import com.cxyzxc.www.utils.DateUtils;publicclassTest03UpdateProduct{publicstaticvoidmain(String[] args){// 创建ProductService引用,指向ProductServiceImpl实现类
        ProductService productService =newProductServiceImpl();// 增加产品
        Product product =newProduct(1002,"流心威化饼干",13.5,
                DateUtils.strDateToUtilDate("2022-11-10"));int result = productService.updateProduct(product);
        String str = result ==1?"修改成功":"修改失败";
        System.out.println(str);}}

2.8.4 测试查询一条数据

package com.cxyzxc.www.view;import com.cxyzxc.service.ProductService;import com.cxyzxc.service.impl.ProductServiceImpl;import com.cxyzxc.www.entity.Product;publicclassTest04SelectOneProduct{publicstaticvoidmain(String[] args){// 创建ProductService引用,指向ProductServiceImpl实现类
        ProductService productService =newProductServiceImpl();

        Product product = productService.selectOneProduct(1003);if(product != null){
            System.out.println(product);}else{
            System.out.println("你要查询的商品不存在");}}}

2.8.5 测试查询所有数据

package com.cxyzxc.www.view;import java.util.List;import com.cxyzxc.service.ProductService;import com.cxyzxc.service.impl.ProductServiceImpl;import com.cxyzxc.www.entity.Product;publicclassTest05SelectAllProduct{publicstaticvoidmain(String[] args){// 创建ProductService引用,指向ProductServiceImpl实现类
        ProductService productService =newProductServiceImpl();

        List<Product> productList = productService.selectAllProduct();for(int i =0; i < productList.size(); i++){
            System.out.println(productList.get(i));}}}

💖 投票传送门

在这里插入图片描述

标签: java apache servlet

本文转载自: https://blog.csdn.net/hh867308122/article/details/128046816
版权归原作者 Java Fans 所有, 如有侵权,请联系我们删除。

“【JAVA高级】——Druid连接池和Apache的DBUtils使用”的评论:

还没有评论