JAVA高级——Druid连接池和Apache的DBUtils使用
Posted Java Fans
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
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();
【3】Druid连接池测试
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);
💖 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;
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;
【2】综合案例
2.1 创建product表
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 '产品生产日期'
);
2.2 向表中添加数据
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');
2.3 创建实体类Product
- 添加实体类的私有变量
- 添加有参无参构造方法
- 添加get/set方法
- 重写toString()方法
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;
@Override
public 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;
public interface ProductDao
//添加
int insert(Product product);
//删除
int delete(int pid);
//修改
int update(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;
public class ProductDaoImpl implements ProductDao
// 创建QueryRunner对象,并传递一个数据源对象
private QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());
@Override
public 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;
@Override
public int delete(int pid)
String sql = "DELETE FROM `product` WHERE `pid` = ?;";
try
return queryRunner.update(sql, pid);
catch (SQLException e)
e.printStackTrace();
return 0;
@Override
public 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;
@Override
public Product selectOne(int pid)
// 查询一个数据,使用BeanHandler将记录转换为对象
BeanHandler<Product> product = new BeanHandler<Product>(Product.class);
String sql = "SELECT * FROM `product` WHERE `pid`=?;";
try
return queryRunner.query(sql, product, pid);
catch (SQLException e)
e.printStackTrace();
return null;
@Override
public List<Product> selectAll()
// 查询一个数据,使用BeanHandler将记录转换为对象
BeanListHandler<Product> productList = new BeanListHandler<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;
public interface ProductService
//增加
int addProduct(Product product);
//删除
int deleteProduct(int pid);
//修改
int updateProduct(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;
public class ProductServiceImpl implements ProductService
ProductDao productDao = new ProductDaoImpl();
@Override
public int addProduct(Product product)
// 查询添加的商品是否存在
Product pd = productDao.selectOne(product.getPid());
if (pd == null)
return productDao以上是关于JAVA高级——Druid连接池和Apache的DBUtils使用的主要内容,如果未能解决你的问题,请参考以下文章