Java Druid連接池與Apache的DBUtils使用教程

Druid連接池
連接池思想
在程序初始化時(shí),提前創(chuàng)建好指定數(shù)量的數(shù)據(jù)庫(kù)連接對(duì)象存儲(chǔ)在“池子”中(這個(gè)池子稱為“連接池”),當(dāng)需要連接數(shù)據(jù)庫(kù)的時(shí)候,從這個(gè)“池子”中取出一個(gè)連接對(duì)象使用,使用完畢后,不會(huì)將這個(gè)連接對(duì)象關(guān)閉,而是將這個(gè)連接對(duì)象放回“池子”中,實(shí)現(xiàn)復(fù)用,節(jié)省資源。
Druid連接池使用步驟
引入相關(guān)jar包
在lib文件夾中引入druid-1.1.5.jar文件和mysql-connector-java-5.1.0-bin.jar文件,并將兩個(gè)jar文件配置到項(xiàng)目中。
創(chuàng)建database.properties配置文件
在src文件夾下創(chuàng)建database.properties配置文件,配置文件中內(nèi)容如下: 連接設(shè)置
初始化連接,連接池連接對(duì)象數(shù)量
最大連接數(shù)
最小空閑連接
超時(shí)等待時(shí)間(毫秒為單位)
# 連接設(shè)置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdatabase
username=root
password=123456# 初始化連接,連接池連接對(duì)象數(shù)量
initialSize=10#最大連接數(shù)
maxActive=30#最小空閑連接
maxIdle=5#超時(shí)等待時(shí)間(毫秒為單位)
maxWait=3000
編寫(xiě)連接池工具類
聲明一個(gè)連接池對(duì)象
實(shí)例化配置文件對(duì)象
- 加載配置文件內(nèi)容
- 創(chuàng)建連接池
獲取連接對(duì)象
- 通過(guò)連接池獲得連接對(duì)象
釋放資源,將連接對(duì)象放入連接池中
- 使用完連接對(duì)象后,將連接對(duì)象還給連接池,這里的close()方法是DruidPooledConnection
- 實(shí)現(xiàn)類里的close()方法,將connection連接對(duì)象還給連接池
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 {
// 聲明一個(gè)連接池對(duì)象
private static DruidDataSource druidDataSource;
static {
// 實(shí)例化配置文件對(duì)象
Properties properties = new Properties();
try {
// 加載配置文件內(nèi)容
InputStream is = DBUtils.class
.getResourceAsStream("/database.properties");
properties.load(is);
// 創(chuàng)建連接池
druidDataSource = (DruidDataSource) DruidDataSourceFactory
.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// 獲取連接對(duì)象
public static Connection getConnection() {
try {
// 通過(guò)連接池獲得連接對(duì)象
return druidDataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
// 釋放資源,將連接對(duì)象放入連接池中
public static void closeAll(Connection connection, Statement statement,
ResultSet resultSet) {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
// 使用完連接對(duì)象后,將連接對(duì)象還給連接池,這里的close()方法是DruidPooledConnection實(shí)現(xiàn)類里的close()方法,將connection連接對(duì)象還給連接池
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}Druid連接池測(cè)試
package com.cxyzxc.www.utils;
import java.sql.Connection;
public class Test {
public static void main(String[] args) {
// 獲取20個(gè)連接對(duì)象,輸出連接對(duì)象,地址值不同
for (int i = 1; i <= 20; i++) {
Connection connection = DBUtils.getConnection();
System.out.println(connection);
// 調(diào)用關(guān)閉連接對(duì)象的方法后,發(fā)現(xiàn)獲取的20個(gè)連接對(duì)象地址值是同一個(gè),說(shuō)明每次從連接池中取出的連接對(duì)象是同一個(gè)
// DBUtils.closeAll(connection, null, null);
}
}
}
Apache的DBUtils使用
前面的DBUtils工具類是我們經(jīng)過(guò)千難萬(wàn)阻自己封裝的,也有一些組織給我們封裝DBUtils工具類,比如Apache組織提供了一個(gè)對(duì)JDBC進(jìn)行簡(jiǎn)單封裝的開(kāi)源工具類庫(kù)Commons DbUtils類,使用它能夠簡(jiǎn)化JDBC應(yīng)用程序的開(kāi)發(fā),同時(shí)也不影響程序的性能。
Apache DBUtils介紹
Apache DBUtils特征
Apache DBUtils是java編程中的數(shù)據(jù)庫(kù)操作實(shí)用工具,小巧簡(jiǎn)單實(shí)用,主要特征有:
1)對(duì)于數(shù)據(jù)表的讀操作,他可以把結(jié)果轉(zhuǎn)換成List,Array,Set等java集合,便于程序員操作;
2)對(duì)于數(shù)據(jù)表的寫(xiě)操作,也變得很簡(jiǎn)單(只需寫(xiě)sql語(yǔ)句)
3)可以使用數(shù)據(jù)源,使用JNDI,數(shù)據(jù)庫(kù)連接池等技術(shù)來(lái)優(yōu)化性能–重用已經(jīng)構(gòu)建好的數(shù)據(jù)庫(kù)連接對(duì)象,而不像php,asp那樣,費(fèi)時(shí)費(fèi)力的不斷重復(fù)的構(gòu)建和析構(gòu)這樣的對(duì)象。
Apache DbUtils主要組成
1)ResultSetHandler接口:轉(zhuǎn)換類型接口
- BeanHandler類:實(shí)現(xiàn)類,把一條記錄轉(zhuǎn)換成對(duì)象。
- BeanListHandler類:實(shí)現(xiàn)類,把多條記錄轉(zhuǎn)換成List集合。
- ScalarHandler類:實(shí)現(xiàn)類,適合獲取一行一列的數(shù)據(jù)。
2)QueryRunner類:執(zhí)行SQL語(yǔ)句的類
- update()方法:增、刪、改
- query()方法:查詢
Apache DbUtils使用步驟
1)創(chuàng)建lib文件夾,導(dǎo)入需要的jar包,并將其配置到項(xiàng)目中
- mysql-connector-java-5.1.0-bin.jar
- druid-1.1.5.jar
- commons-dbutils-1.7.jar
2)在src文件夾下創(chuàng)建database.properties配置文件,配置文件中內(nèi)容如下:
- 連接設(shè)置
- 初始化連接,連接池連接對(duì)象數(shù)量
- 最大連接數(shù)
- 最小空閑連接
- 超時(shí)等待時(shí)間(毫秒為單位)
# 連接設(shè)置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdatabase
username=root
password=123456# 初始化連接,連接池連接對(duì)象數(shù)量
initialSize=10#最大連接數(shù)
maxActive=30#最小空閑連接
maxIdle=5#超時(shí)等待時(shí)間(毫秒為單位)
maxWait=3000
3)編寫(xiě)DBUtils連接池工具類
聲明一個(gè)連接池對(duì)象
實(shí)例化配置文件對(duì)象
- 加載配置文件內(nèi)容
- 創(chuàng)建連接池
返回一個(gè)數(shù)據(jù)源
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 {
// 聲明一個(gè)連接池對(duì)象
private static DruidDataSource druidDataSource;
static {
// 實(shí)例化配置文件對(duì)象
Properties properties = new Properties();
try {
// 加載配置文件內(nèi)容
InputStream is = DBUtils.class
.getResourceAsStream("/database.properties");
properties.load(is);
// 創(chuàng)建連接池
druidDataSource = (DruidDataSource) DruidDataSourceFactory
.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//返回一個(gè)數(shù)據(jù)源
public static DataSource getDataSource(){
return druidDataSource;
}
}
綜合案例
創(chuàng)建product表
CREATE TABLE IF NOT EXISTS `product` ( `pid` INT PRIMARY KEY AUTO_INCREMENT COMMENT '產(chǎn)品編號(hào)', `pname` VARCHAR(20) NOT NULL COMMENT '產(chǎn)品名稱', `price` DOUBLE NOT NULL COMMENT '產(chǎn)品價(jià)格', `birthday` DATE NOT NULL COMMENT '產(chǎn)品生產(chǎn)日期' );
向表中添加數(shù)據(jù)
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');
創(chuàng)建實(shí)體類Product
- 添加實(shí)體類的私有變量
- 添加有參無(wú)參構(gòu)造方法
- 添加get/set方法
- 重寫(xiě)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 + "]";
}
}創(chuàng)建ProductDao接口
創(chuàng)建ProductDao接口,實(shí)現(xiàn)增刪改查方法名的統(tǒng)一。
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);
//查詢單個(gè)
Product selectOne(int pid);
//查詢所有
List<Product> selectAll();
}創(chuàng)建ProductDaoImpl實(shí)現(xiàn)類
創(chuàng)建ProductDaoImpl實(shí)現(xiàn)類來(lái)實(shí)現(xiàn)ProductDao接口,在重新方法中編寫(xiě)具體的邏輯代碼。
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 {
// 創(chuàng)建QueryRunner對(duì)象,并傳遞一個(gè)數(shù)據(jù)源對(duì)象
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) {
// 查詢一個(gè)數(shù)據(jù),使用BeanHandler將記錄轉(zhuǎn)換為對(duì)象
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() {
// 查詢一個(gè)數(shù)據(jù),使用BeanHandler將記錄轉(zhuǎn)換為對(duì)象
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;
}
}創(chuàng)建ProductService接口
創(chuàng)建ProductService接口來(lái)實(shí)現(xiàn)業(yè)務(wù)層增刪改查方法名的統(tǒng)一。
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);
//查詢單個(gè)
Product selectOneProduct(int pid);
//查詢所有
List<Product> selectAllProduct();
}創(chuàng)建ProductServiceImpl實(shí)現(xiàn)類
創(chuàng)建ProductServiceImpl實(shí)現(xiàn)類來(lái)實(shí)現(xiàn)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.insert(product);
} else {
System.out.println("商品已經(jīng)存在,不能重復(fù)添加");
}
return 0;
}
@Override
public int deleteProduct(int pid) {
// 查詢添加的商品是否存在
Product pd = productDao.selectOne(pid);
if (pd != null) {
return productDao.delete(pid);
} else {
System.out.println("商品不存在,不能刪除");
}
return 0;
}
@Override
public int updateProduct(Product product) {
// 查詢添加的商品是否存在
Product pd = productDao.selectOne(product.getPid());
if (pd!= null) {
return productDao.update(product);
} else {
System.out.println("商品不存在,不能修改");
}
return 0;
}
@Override
public Product selectOneProduct(int pid) {
Product product =productDao.selectOne(pid);
if(product!=null){
return product;
}else{
System.out.println("沒(méi)有你要查找產(chǎn)品,查找失敗");
}
return null;
}
@Override
public List<Product> selectAllProduct() {
List<Product> productList = productDao.selectAll();
if(productList.size()!=0){
return productList;
}else{
System.out.println("數(shù)據(jù)庫(kù)為空,沒(méi)有產(chǎn)品");
}
return null;
}
}創(chuàng)建測(cè)試類
測(cè)試插入數(shù)據(jù)
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) {
//創(chuàng)建ProductService引用,指向ProductServiceImpl實(shí)現(xiàn)類
ProductService productService = new ProductServiceImpl();
//增加產(chǎn)品
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);
}
}測(cè)試刪除數(shù)據(jù)
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) {
// 創(chuàng)建ProductService引用,指向ProductServiceImpl實(shí)現(xiàn)類
ProductService productService = new ProductServiceImpl();
int result = productService.deleteProduct(1003);
String str = result == 1 ? "刪除成功" : "刪除失敗";
System.out.println(str);
}
}測(cè)試修改數(shù)據(jù)
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) {
// 創(chuàng)建ProductService引用,指向ProductServiceImpl實(shí)現(xiàn)類
ProductService productService = new ProductServiceImpl();
// 增加產(chǎn)品
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);
}
}測(cè)試查詢一條數(shù)據(jù)
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) {
// 創(chuàng)建ProductService引用,指向ProductServiceImpl實(shí)現(xiàn)類
ProductService productService = new ProductServiceImpl();
Product product = productService.selectOneProduct(1003);
if (product != null) {
System.out.println(product);
} else {
System.out.println("你要查詢的商品不存在");
}
}
}測(cè)試查詢所有數(shù)據(jù)
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) {
// 創(chuàng)建ProductService引用,指向ProductServiceImpl實(shí)現(xiàn)類
ProductService productService = new ProductServiceImpl();
List<Product> productList = productService.selectAllProduct();
for (int i = 0; i < productList.size(); i++) {
System.out.println(productList.get(i));
}
}
}到此這篇關(guān)于Java Druid連接池與Apache的DBUtils使用教程的文章就介紹到這了,更多相關(guān)Java Druid連接池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Struts2實(shí)現(xiàn)單文件或多文件上傳功能
這篇文章主要為大家詳細(xì)介紹了Struts2實(shí)現(xiàn)單文件或多文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Java單例模式下的MongoDB數(shù)據(jù)庫(kù)操作工具類
這篇文章主要介紹了Java單例模式下的MongoDB數(shù)據(jù)庫(kù)操作工具類,結(jié)合實(shí)例形式分析了java基于單例模式下操作MongoDB數(shù)據(jù)庫(kù)相關(guān)連接、查詢、插入、刪除等操作封裝技巧,需要的朋友可以參考下2018-01-01
Socket與ServerSocket類構(gòu)造方法與API
今天小編為大家整理了Socket與ServerSocket類構(gòu)造方法與API,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值。需要的朋友可以收藏下,方便下次瀏覽觀看2021-12-12
使用SpringBoot整合Activiti6工作流的操作方法
這篇文章主要介紹了使用SpringBoot整合Activiti6工作流,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
Spring中的@ControllerAdvice和ResponseBodyAdvice詳解
這篇文章主要介紹了Spring中的@ControllerAdvice和ResponseBodyAdvice詳解,@ControllerAdvice作用于@Controller修飾的類里面的所有方法,ResponseBodyAdvice作用于@ResponseBody注解修飾的方法,它可以對(duì)這些方法的返回值進(jìn)行修改,需要的朋友可以參考下2024-01-01
SpringBoot 配置文件中配置的中文,程序讀取出來(lái)是亂碼的解決
這篇文章主要介紹了SpringBoot 配置文件中配置的中文,程序讀取出來(lái)是亂碼的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09

