欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2022年12月13日 11:45:57   作者:Java Fans  
這篇文章主要介紹了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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Struts2實現(xiàn)單文件或多文件上傳功能

    Struts2實現(xiàn)單文件或多文件上傳功能

    這篇文章主要為大家詳細介紹了Struts2實現(xiàn)單文件或多文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Java單例模式下的MongoDB數(shù)據(jù)庫操作工具類

    Java單例模式下的MongoDB數(shù)據(jù)庫操作工具類

    這篇文章主要介紹了Java單例模式下的MongoDB數(shù)據(jù)庫操作工具類,結合實例形式分析了java基于單例模式下操作MongoDB數(shù)據(jù)庫相關連接、查詢、插入、刪除等操作封裝技巧,需要的朋友可以參考下
    2018-01-01
  • Socket與ServerSocket類構造方法與API

    Socket與ServerSocket類構造方法與API

    今天小編為大家整理了Socket與ServerSocket類構造方法與API,對大家的學習或工作具有一定的參考借鑒價值。需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-12-12
  • 使用SpringBoot整合Activiti6工作流的操作方法

    使用SpringBoot整合Activiti6工作流的操作方法

    這篇文章主要介紹了使用SpringBoot整合Activiti6工作流,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • RocketMQ中的NameServer詳細解析

    RocketMQ中的NameServer詳細解析

    這篇文章主要介紹了RocketMQ中的NameServer詳細解析,NameServer是一個非常簡單的Topic路由注冊中心,支持Broker的動態(tài)注冊與發(fā)現(xiàn),因此不能保證NameServer的一致性,需要的朋友可以參考下
    2024-01-01
  • Spring中的@ControllerAdvice和ResponseBodyAdvice詳解

    Spring中的@ControllerAdvice和ResponseBodyAdvice詳解

    這篇文章主要介紹了Spring中的@ControllerAdvice和ResponseBodyAdvice詳解,@ControllerAdvice作用于@Controller修飾的類里面的所有方法,ResponseBodyAdvice作用于@ResponseBody注解修飾的方法,它可以對這些方法的返回值進行修改,需要的朋友可以參考下
    2024-01-01
  • Java詳解Swing中的幾種常用按鈕的使用

    Java詳解Swing中的幾種常用按鈕的使用

    這篇文章主要介紹了怎么用Java來創(chuàng)建和使用Swing中的幾種常用按鈕,按鈕是我們經(jīng)常要用的工具,但是你有想過自己怎么去實現(xiàn)它嗎,感興趣的朋友跟隨文章往下看看吧
    2022-04-04
  • 淺談springMVC中controller的幾種返回類型

    淺談springMVC中controller的幾種返回類型

    這篇文章主要介紹了淺談springMVC中controller的幾種返回類型,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • SpringBoot 配置文件中配置的中文,程序讀取出來是亂碼的解決

    SpringBoot 配置文件中配置的中文,程序讀取出來是亂碼的解決

    這篇文章主要介紹了SpringBoot 配置文件中配置的中文,程序讀取出來是亂碼的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 一文帶你搞懂什么是BIO

    一文帶你搞懂什么是BIO

    BIO英文全名是 blocking IO,也叫做 阻塞IO,是最容易理解、最容易實現(xiàn)的IO工作方式,本文就來通過一些簡單的示例為大家講講什么是BIO吧
    2023-06-06

最新評論