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

在程序初始化时,提前创建好指定数量的数据库连接对象存储在“池子”中(这个池子称为“连接池”),当需要连接数据库的时候,从这个“池子”中取出一个连接对象使用,使用完毕后,不会将这个连接对象关闭,而是将这个连接对象放回“池子”中,实现复用,节省资源。
在lib文件夹中引入druid-1.1.5.jar文件和mysql-connector-java-5.1.0-bin.jar文件,并将两个jar文件配置到项目中。
# 连接设置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdatabase
username=root
password=123456# 初始化连接,连接池连接对象数量
initialSize=10#最大连接数
maxActive=30#最小空闲连接
maxIdle=5#超时等待时间(毫秒为单位)
maxWait=3000
声明一个连接池对象
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;public class DBUtils {// 声明一个连接池对象private static DruidDataSource druidDataSource;static {// 实例化配置文件对象Properties properties = new Properties();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();}}// 获取连接对象public static Connection getConnection() {try {// 通过连接池获得连接对象return druidDataSource.getConnection();} catch (SQLException e) {e.printStackTrace();}return null;}// 释放资源,将连接对象放入连接池中public static void closeAll(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();}}}
package com.cxyzxc.www.utils;import java.sql.Connection;public class Test {public static void main(String[] args) {// 获取20个连接对象,输出连接对象,地址值不同for (int i = 1; i <= 20; i++) {Connection connection = DBUtils.getConnection();System.out.println(connection);// 调用关闭连接对象的方法后,发现获取的20个连接对象地址值是同一个,说明每次从连接池中取出的连接对象是同一个// DBUtils.closeAll(connection, null, null);}}
}
前面的DBUtils工具类是我们经过千难万阻自己封装的,也有一些组织给我们封装DBUtils工具类,比如Apache组织提供了一个对JDBC进行简单封装的开源工具类库Commons DbUtils类,使用它能够简化JDBC应用程序的开发,同时也不影响程序的性能。
# 连接设置
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;public class DBUtils {// 声明一个连接池对象private static DruidDataSource druidDataSource;static {// 实例化配置文件对象Properties properties = new Properties();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();}}//返回一个数据源public static DataSource getDataSource(){return druidDataSource;}}
CREATE TABLE IF NOT EXISTS `product` (
`pid` INT PRIMARY KEY AUTO_INCREMENT COMMENT '产品编号',
`pname` VARCHAR(20) NOT NULL COMMENT '产品名称',
`price` DOUBLE NOT NULL COMMENT '产品价格',
`birthday` DATE NOT NULL COMMENT '产品生产日期'
);
INSERT INTO `product`(`pid`,`pname`,`price`,`birthday`)VALUES(1001,'虎皮凤爪',20.5,'2022-06-12');INSERT INTO `product`(`pid`,`pname`,`price`,`birthday`)VALUES(1002,'卧龙锅巴',18.5,'2022-09-22');
package com.cxyzxc.www.entity;import java.util.Date;public class Product {private int pid;private String pname;private double price;private Date birthday;public Product() {super();}public Product(String pname, double price, Date birthday) {super();this.pname = pname;this.price = price;this.birthday = birthday;}public Product(int pid, String pname, double price, Date birthday) {super();this.pid = pid;this.pname = pname;this.price = price;this.birthday = birthday;}public int getPid() {return pid;}public void setPid(int pid) {this.pid = pid;}public String getPname() {return pname;}public void setPname(String pname) {this.pname = pname;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "Product [pid=" + pid + ", pname=" + pname + ", price=" + price+ ", birthday=" + birthday + "]";}}
创建ProductDao接口,实现增删改查方法名的统一。
package com.cxyzxc.www.dao;import java.util.List;import com.cxyzxc.www.entity.Product;public interface ProductDao {//添加int insert(Product product);//删除int delete(int pid);//修改int update(Product product);//查询单个Product selectOne(int pid);//查询所有List selectAll();}
创建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;public class ProductDaoImpl implements ProductDao {// 创建QueryRunner对象,并传递一个数据源对象private QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());@Overridepublic int insert(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();}return 0;}@Overridepublic int delete(int pid) {String sql = "DELETE FROM `product` WHERE `pid` = ?;";try {return queryRunner.update(sql, pid);} catch (SQLException e) {e.printStackTrace();}return 0;}@Overridepublic int update(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();}return 0;}@Overridepublic Product selectOne(int pid) {// 查询一个数据,使用BeanHandler将记录转换为对象BeanHandler product = new BeanHandler(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 selectAll() {// 查询一个数据,使用BeanHandler将记录转换为对象BeanListHandler productList = new BeanListHandler(Product.class);String sql = "SELECT * FROM `product`;";try {return queryRunner.query(sql, productList);} catch (SQLException e) {e.printStackTrace();}return null;}}
创建ProductService接口来实现业务层增删改查方法名的统一。
package com.cxyzxc.service;import java.util.List;import com.cxyzxc.www.entity.Product;public interface ProductService {//增加int addProduct(Product product);//删除int deleteProduct(int pid);//修改int updateProduct(Product product);//查询单个Product selectOneProduct(int pid);//查询所有List selectAllProduct();}
创建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;public class ProductServiceImpl implements ProductService {ProductDao productDao = new ProductDaoImpl();@Overridepublic int addProduct(Product product) {// 查询添加的商品是否存在Product pd = productDao.selectOne(product.getPid());if (pd == null) {return productDao.insert(product);} else {System.out.println("商品已经存在,不能重复添加");}return 0;}@Overridepublic int deleteProduct(int pid) {// 查询添加的商品是否存在Product pd = productDao.selectOne(pid);if (pd != null) {return productDao.delete(pid);} else {System.out.println("商品不存在,不能删除");}return 0;}@Overridepublic int updateProduct(Product product) {// 查询添加的商品是否存在Product pd = productDao.selectOne(product.getPid());if (pd!= null) {return productDao.update(product);} else {System.out.println("商品不存在,不能修改");}return 0;}@Overridepublic Product selectOneProduct(int pid) {Product product =productDao.selectOne(pid);if(product!=null){return product;}else{System.out.println("没有你要查找产品,查找失败");}return null;}@Overridepublic List selectAllProduct() {List productList = productDao.selectAll();if(productList.size()!=0){return productList;}else{System.out.println("数据库为空,没有产品");}return null;}}
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;public class Test01InsertProduct {public static void main(String[] args) {//创建ProductService引用,指向ProductServiceImpl实现类ProductService productService = new ProductServiceImpl();//增加产品Product product = new Product(1003,"流心威化饼干", 13.5, DateUtils.strDateToUtilDate("2022-11-10"));int result = productService.addProduct(product);String str = result==1?"商品添加成功":"商品添加失败";System.out.println(str);}}
package com.cxyzxc.www.view;import com.cxyzxc.service.ProductService;
import com.cxyzxc.service.impl.ProductServiceImpl;public class Test02DeleteProduct {public static void main(String[] args) {// 创建ProductService引用,指向ProductServiceImpl实现类ProductService productService = new ProductServiceImpl();int result = productService.deleteProduct(1003);String str = result == 1 ? "删除成功" : "删除失败";System.out.println(str);}}
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;public class Test03UpdateProduct {public static void main(String[] args) {// 创建ProductService引用,指向ProductServiceImpl实现类ProductService productService = new ProductServiceImpl();// 增加产品Product product = new Product(1002, "流心威化饼干", 13.5,DateUtils.strDateToUtilDate("2022-11-10"));int result = productService.updateProduct(product);String str = result == 1 ? "修改成功" : "修改失败";System.out.println(str);}}
package com.cxyzxc.www.view;import com.cxyzxc.service.ProductService;
import com.cxyzxc.service.impl.ProductServiceImpl;
import com.cxyzxc.www.entity.Product;public class Test04SelectOneProduct {public static void main(String[] args) {// 创建ProductService引用,指向ProductServiceImpl实现类ProductService productService = new ProductServiceImpl();Product product = productService.selectOneProduct(1003);if (product != null) {System.out.println(product);} else {System.out.println("你要查询的商品不存在");}}}
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;public class Test05SelectAllProduct {public static void main(String[] args) {// 创建ProductService引用,指向ProductServiceImpl实现类ProductService productService = new ProductServiceImpl();List productList = productService.selectAllProduct();for (int i = 0; i < productList.size(); i++) {System.out.println(productList.get(i));}}
}
