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