1.在实际开发中,“获取连接”和“释放资源”是很消耗系统资源的两个过程,为了解决此问题,采用连接池技术,共享连接connection
2.连接池概念
3.Java的数据库连接池的公共接口:javax.sql.DataSource
常见的连接池:DBCP C3P0
4.C3P0
第一步:导入连个jar包 c3p0-0.9.1.2.jar mysql-connector-java-5.1.46.jar
第二步:配置文件
配置文件名称:c3p0-config.xml(固定)
配置文件位置:src下
配置文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///web_07</property>
<property name="user">root</property>
<property name="password">123</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
<named-config name="oracle">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///web_07</property>
<property name="user">root</property>
<property name="password">123</property>
</named-config>
</c3p0-config>
demo:
package com.c3p0.web10_c3p0;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.junit.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class Testc3p0 {
@Test
public void testAddUser(){
Connection conn=null;
PreparedStatement pst=null;
//创建连接池对象
DataSource datesource=new ComboPooledDataSource();//加载默认配置
//DataSource datesource1=new ComboPooledDataSource("oracle");//加载有名称的配置
//从池子中获取连接
try {
//从池子中获取连接
conn = datesource.getConnection();
String sql="INSERT into user VALUES(?,?,NULL)";
//创建预处理对象
pst = conn.prepareStatement(sql);
//给占位符设置参数
pst.setString(1, "张飞");
pst.setString(2, "11100");
//执行
int rows = pst.executeUpdate();
if (rows>0) {
System.out.println("添加成功");
} else {
System.out.println("添加失败");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
}
}
5.DBUtils
导包:commons-dbutils-1.4.jar
DBUtils就是JDBC的简化开发工具包(就是一个工具类,定义了关闭资源和事物处理的方法)
思想:JDBC中有很多代码重复的出现冗余,只有少部分是相同的地方,对于相同的地方使用传参的方式来解决
DBUtils三个核心功能:
(1)QueryRunner中提供了对sql语句的操作的API
QueryRunner(DataSoruce ds)提供数据源(连接池)DBUtils底层自动维护连接connection
update(String sql,Object[] params)执行更新数据 //进行增删改操作
query(String sql,RusultSetHandler<T> rsh,Object[] params) 执行查询
(2)RusultSetHandler接口,用于定义select操作后,怎样封装结果集
DBUtils提供了一个接口ResultSetHandler,它就是用来ResultSet转换成目标类型的工具。你可以自己去实现这个接 口,把ResultSet转换成你想要的类型。
DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不用自己去实现ResultSet接口了。
MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键!
MapListHandler:多行处理器!把结果集转换成List<Map<String,Object>>;
BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
BeanListHandler:多行处理器!把结果集转换成List<Bean>; //bean就是实体类相当于User类
ColumnListHandler:多行单列处理器!把结果集转换成List<Object>,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。
(3)DBUtils类就是一个工具类,定义了关闭资源和事物处理的方法
第一步:写JavaBean类(通常都写在domain包中) :提供私有字段,set get方法,无参构造
user类
package com.sh.domain;
public class User {
private String uname;
private String upassword;
private int uid;
public User() {}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpassword() {
return upassword;
}
public void setUpassword(String upassword) {
this.upassword = upassword;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
@Override
public String toString() {
return "User [uname=" + uname + ", upassword=" + upassword + ", uid=" + uid + "]";
}
}
第二步:写c3p0Utils类
package com.sh.utils;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
private static ComboPooledDataSource datesource=new ComboPooledDataSource();
public static DataSource getDateSource(){
return datesource;
}
public static Connection getConnection(){
try {
return datesource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
第三步:DBUtils测试类
package com.sh.Test;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import com.sh.domain.User;
import com.sh.utils.C3P0Utils;
public class TestDBUtils {
/* 添加操作 */
@Test
public void testAddUser() {
// 创建核心类QueryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDateSource());
// 编写sql语句
String sql = "INSERT into user VALUES(?,?,NULL)";
// 为占位符设置参数
Object[] params = { "曹操", "101" };
// 执行添加操作
try {
int rows = qr.update(sql, params);
if (rows > 0) {
System.out.println("添加成功");
} else {
System.out.println("添加失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/* 修改操作 */
@Test
public void testUpdateUserById() {
// 创建核心类QueryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDateSource());
// 编写sql语句
String sql = "UPDATE user SET uname=? WHERE uid=?";
// 为占位符设置参数
Object[] params = { "吕布1", 8 };
// 执行修改操作
try {
int rows = qr.update(sql, params);
if (rows > 0) {
System.out.println("修改成功");
} else {
System.out.println("修改失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/* 删除操作 */
@Test
public void testDeleteUserById() {
// 创建核心类QueryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDateSource());
// 编写sql语句
String sql = "DELETE FROM user WHERE uid=?";
// 为占位符设置参数
Object[] params = { 8 };
// 执行删除操作
try {
int rows = qr.update(sql, params);
if (rows > 0) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/* 查询所有信息 */
@Test
public void testQueryUser() {
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDateSource());
String sql = "select * from user";
// 执行查询操作
List<User> users = qr.query(sql, new BeanListHandler<User>(User.class));
// 遍历集合
for (User user : users) {
System.out.println(user);// 在User类中已重写toString方法
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/* 根据id查询信息 */
@Test
public void testQueryUserById() {
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDateSource());
String sql = "select * from user where uid=?";
// 为占位符设置参数
Object[] params = { 1 };
// 执行查询操作
User user = qr.query(sql, new BeanHandler<User>(User.class), params);
System.out.println(user);// 在User类中已重写toString方法
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/* 查询所有用户的总个数 */
@Test
public void testQueryCountAllUser() {
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDateSource());
String sql = "SELECT COUNT(*)FROM user";
// 执行查询操作
Object query = qr.query(sql,new ScalarHandler());
System.out.println(query);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}