数据库连接池
目的:解决建立数据库连接耗费资源和时间很多的问题,提高性能
第一种 DBCP
① 需要添加jar包:
commons-dbcp-1.4.jar
commons-pool-1.5.6.jar
② 添加属性资源文件
dbcpconfig.properties
③ 编写数据源工具类
package com.qianfeng.DBCP;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
/*
* 1.导入三方架包
* 2.编写配置文件:配置文件的类型必须是properties,名字随意,位置随意
* 3.创建DBCPUtil工具类
*/
public class DBCPUtil {
//1.创建数据源
private static DataSource dataSource;
//2.连接配置文件
static{
Properties properties = new Properties();
try {
//获取配置信息,将内容保存到properties对象里面
properties.load(DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//得到连接池对象,将配置信息指定给连接池对象
try {
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//3.获取连接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
//4.释放连接
public static void release(Connection conn,PreparedStatement statement,ResultSet set) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (set != null) {
try {
set.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
第二种 C3P0
① 需要添加jar包:
c3p0-0.9.1.2.jar
commons-dbutils-1.4.jar
② 添加属性资源文件
c3p0-config.xml
③ 编写数据源工具类
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/*
* 注意事项:
* 1.系统会自动读取c3p0-config.xml文件:a.文件的名字要固定- c3p0-config.xml b.文件的位置也是固定的--src下面
* 2.一般会自己创建xml配置文件,按照要求创建即可.
* 3.优势:又有不需要自己关联配置文件,所以使用更方便
*/
public class C3P0Util {
//1.创建池子(数据源)---创建了数据源之后,系统会自动添加连接
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//向池子中添加连接---系统会自动读取c3p0-config.xml文件:a.文件的名字要固定-c3p0-config.xml b.文件的位置也是固定的--src下面
//2.获取连接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
//3.释放连接
public static void release(Connection conn,PreparedStatement statement,ResultSet set) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (set != null) {
try {
set.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
DBUtils
什么是dbutils,它的作用
DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。
1.对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作;
2.对于数据表的写操作,也变得很简单(只需写sql语句)
3.可以使用数据源,使用JNDI,数据库连接池等技术来优化性能--重用已经构建好的数据库连接对象
Dbutils三个核心对象
一: QueryRunner类
QueryRunner中提供对sql语句操作的API.
它主要有三个方法
query() 用于执行select
update() 用于执行insert update delete,create
batch() 批处理
二: ResultSetHandler接口
用于定义select操作后,怎样封装结果集.
三: DBUtils类
它就是一个工具类,定义了关闭资源与事务处理的方法
① 导入jar包
commons-dbutils-1.4.jar与c3p0 和 mysql驱动jar
② 创建QueryRunner对象
③ 使用query或者update方法执行sql语句
③ 使用ResultSetHander封装结果集
通常通过实现ResultSetHander接口来实现
常用的接口的实现类
BeanHander //用模型封装,接收返回一个模型对象
BeanListHander //用模型封装,用list封装模型,返回一个模型类的list集合
具体实现:
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 Utils.C3P0Util;
import bean.DeptBean;
public class TestQueryRunner {
public static void main(String[] args) throws SQLException {
//insert();
//delete();
//addAll();
//selectAll();
select1();
}
public static void insert() throws SQLException {
QueryRunner qr=new QueryRunner(C3P0Util.getDataSource());
int num=qr.update("insert into dept values (?,?,?)",50,"xiaoming","american");
if(num>0) {
System.out.println("插入成功");
}else {
System.out.println("插入失败");
}
}
public static void delete() throws SQLException{
QueryRunner qRunner=new QueryRunner(C3P0Util.getDataSource());
int num=qRunner.update("delete from dept where deptno=?",50);
if(num>0) {
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}
//批量添加
public static void addAll() throws SQLException{
QueryRunner queryRunner=new QueryRunner(C3P0Util.getDataSource());
//创建一个二维数组组装数据
Object [][] params=new Object[3][];
for(int i=0;i<params.length;i++) {
params[i]=new Object[] {i+8,"bingbing"+i,"beijing"+i};
}
//写sql语句
String sql="insert into dept values(?,?,?)";
@SuppressWarnings("unused")
int[] nums=queryRunner.batch(sql, params);
}
//查询所有数据并将结果集封装到集合中
public static void selectAll() throws SQLException{
QueryRunner queryRunner=new QueryRunner(C3P0Util.getDataSource());
List<DeptBean> list=queryRunner.query("select * from dept", new BeanListHandler<>(DeptBean.class)); //DeptBean是一个模型类
System.out.println(list);
}
//查询一条数据返回模型
public static void select1() throws SQLException{
QueryRunner queryRunner=new QueryRunner(C3P0Util.getDataSource());
DeptBean deptBean=queryRunner.query("select * from dept where deptno=?", new BeanHandler<>(DeptBean.class),9)
System.out.println(deptBean);
}
}