1.通过JDBC使用C3P0连接池
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。
例如:
1.创建数据库表
create table t_user(
u_id int primary key auto_increment,
u_name varchar(20),
u_age int,
u_address varchar(30)
);
2.创建Java项目,导入依赖包
c3p0-0.9.5.2.jar
mchange-commons-java-0.2.15.jar
mysql-connector-java-5.1.38.jar
3.在src下创建c3p0的配置文件【c3p0-config.xml】
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- c3p0的默认配置项 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
<!-- 定义的数据库配置 -->
<named-config name="test">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="initialPoolSize">25</property>
<property name="maxPoolSize">200</property>
</named-config>
</c3p0-config>
4.创建javabean
5.创建数据库访问类
package com.wangxing.jdbcc3p0.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.wangxing.jdbcc3p0.bean.UserBean;
/**
* 用户信息的访问类
*
* @author Administrator
*
*/
public class UserBeanDaoClass {
// 定义保存c3p0数据源对象
private ComboPooledDataSource dataSource = null;
public UserBeanDaoClass() {
// 加载c3p0-config.xml文件中默认的config
// 初始化数据源
dataSource = new ComboPooledDataSource();
// 初始化数据源,加载的是自定义的数据库表配置项
// dataSource =new ComboPooledDataSource("my");
}
// 添加用户信息
public void insertUser(UserBean userBean) {
Connection conn = null;
PreparedStatement statement = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建添加数据的sql语句
String insert = "insert into t_user values(null,?,?,?);";
System.out.println(insert);
// 创建PreparedStatement对象
statement = conn.prepareStatement(insert);
// 传递“?”所需的数据值--PreparedStatement对象的setXXXX(位置,数据值)
statement.setString(1, userBean.getUname());
statement.setInt(2, userBean.getUage());
statement.setString(3, userBean.getUaddress());
// 执行添加sql
int temp = statement.executeUpdate();
if (temp > 0) {
System.out.println("添加信息成功");
}
} catch (Exception e) {
System.out.println("添加信息失败");
e.printStackTrace();
} finally {
if (statement != null && conn != null) {
try {
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
// 根据用户id修改用户信息
public void updateUser(UserBean userBean) {
Connection conn = null;
PreparedStatement statement = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建修改数据的sql语句
String update = "update t_user set u_name=?,u_age=?,u_address=? where u_id=?;";
System.out.println(update);
// 创建PreparedStatement对象
statement = conn.prepareStatement(update);
// 传递“?”所需的数据值--PreparedStatement对象的setXXXX(位置,数据值)
statement.setString(1, userBean.getUname());
statement.setInt(2, userBean.getUage());
statement.setString(3, userBean.getUaddress());
statement.setInt(4, userBean.getUid());
// 执行修改sql
int temp = statement.executeUpdate();
if (temp > 0) {
System.out.println("修改信息成功");
}
} catch (Exception e) {
System.out.println("修改信息失败");
e.printStackTrace();
} finally {
if (statement != null && conn != null) {
try {
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
// 根据用户id查询用户信息
public UserBean selectUserById(int userid) {
UserBean userbean = null;
Connection conn = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建根据用户id查询用户信息sql语句
String select = "select * from t_user where u_id=?;";
System.out.println(select);
// 创建PreparedStatement对象
statement = conn.prepareStatement(select);
statement.setInt(1, userid);
// 执行查询sql
resultSet = statement.executeQuery();
if (resultSet.next()) {
int id = resultSet.getInt("u_id");
String name = resultSet.getString("u_name");
int age = resultSet.getInt("u_age");
String address = resultSet.getString("u_address");
userbean = new UserBean();
userbean.setUid(id);
userbean.setUname(name);
userbean.setUage(age);
userbean.setUaddress(address);
}
} catch (Exception e) {
System.out.println("查询信息失败");
e.printStackTrace();
} finally {
if (resultSet != null && statement != null && conn != null) {
try {
resultSet.close();
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return userbean;
}
// 查询所有用户信息
public List<UserBean> selectUser() {
List<UserBean> userlist = new ArrayList<UserBean>();
Connection conn = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建查询所有用户信息sql语句
String select = "select * from t_user;";
System.out.println(select);
// 创建PreparedStatement对象
statement = conn.prepareStatement(select);
// 执行查询sql
resultSet = statement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt("u_id");
String name = resultSet.getString("u_name");
int age = resultSet.getInt("u_age");
String address = resultSet.getString("u_address");
UserBean userbean = new UserBean();
userbean.setUid(id);
userbean.setUname(name);
userbean.setUage(age);
userbean.setUaddress(address);
userlist.add(userbean);
}
} catch (Exception e) {
System.out.println("查询信息失败");
e.printStackTrace();
} finally {
if (resultSet != null && statement != null && conn != null) {
try {
resultSet.close();
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return userlist;
}
// 根据id删除用户信息
public void deleteUserById(int userid) {
Connection conn = null;
PreparedStatement statement = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建删除数据的sql语句
String delete = "delete from t_user where u_id=?;";
System.out.println(delete);
// 创建PreparedStatement对象
statement = conn.prepareStatement(delete);
statement.setInt(1, userid);
// 执行删除sql
int temp = statement.executeUpdate();
if (temp > 0) {
System.out.println("删除信息成功");
}
} catch (Exception e) {
System.out.println("删除信息失败");
e.printStackTrace();
} finally {
if (statement != null && conn != null) {
try {
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
信息类
package com.wangxing.jdbcc3p0.bean;
/**
* 保存用户信息的java类
* @author Administrator
*
*/
public class UserBean {
private int uid;
private String uname;
private int uage;
private String uaddress;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getUage() {
return uage;
}
public void setUage(int uage) {
this.uage = uage;
}
public String getUaddress() {
return uaddress;
}
public void setUaddress(String uaddress) {
this.uaddress = uaddress;
}
}
测试方法
package com.wangxing.jdbcc3p0.test;
import com.wangxing.jdbcc3p0.bean.UserBean;
import com.wangxing.jdbcc3p0.dao.UserBeanDaoClass;
public class TestMain {
public static void main(String[] args) {
//测试添加数据
UserBean userbean=new UserBean();
userbean.setUname("wangwu");
userbean.setUage(25);
userbean.setUaddress("西安");
UserBeanDaoClass userDao=new UserBeanDaoClass();
userDao.insertUser(userbean);
}
}
优点:不用手动编写创建数据库连接对象的操作,因为c3p0的数据库连接池的配置中已经配置初始化成功。提供程序的执行效率。 日后切换数据库的时候不需要修改源代码,只需要修改c3p0的数据库连接池的配置。
2.通过JDBC使用dbcp连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
实例:
1.创建数据库表
create table t_user(
u_id int primary key auto_increment,
u_name varchar(20),
u_age int,
u_address varchar(30)
);
2.创建java项目导入jar包
commons-dbcp-1.4.jar
commons-dbutils-1.6.jar
commons-pool-1.6.jar
3.在src下创建数据库连接配置文件【xxxxxxxx.properties】
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
username=root
password=123456
maxActive=50
maxIdle=20
maxWait=60000
4.创建javabean[同上]
5.创建数据库访问类
package com.wangxing.jdbcdbcp.dao;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import com.wangxing.jdbcdbcp.bean.UserBean;
/**
* 用户信息的访问类
*
* @author Administrator
*
*/
public class UserBeanDaoClass {
// 定义保存dbcp数据源对象
private DataSource dataSource = null;
public UserBeanDaoClass() {
try{
Properties pro=new Properties();
//getResourceAsStream("该参数名称应与上面配置文件名相同,后缀不能改动")
InputStream inStream=this.getClass().getResourceAsStream("/mydata.properties");
pro.load(inStream);
dataSource=BasicDataSourceFactory.createDataSource(pro);
}catch(Exception e){
e.printStackTrace();
}
}
// 添加用户信息
public void insertUser(UserBean userBean) {
Connection conn = null;
PreparedStatement statement = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建添加数据的sql语句
String insert = "insert into t_user values(null,?,?,?);";
System.out.println(insert);
// 创建PreparedStatement对象
statement = conn.prepareStatement(insert);
// 传递“?”所需的数据值--PreparedStatement对象的setXXXX(位置,数据值)
statement.setString(1, userBean.getUname());
statement.setInt(2, userBean.getUage());
statement.setString(3, userBean.getUaddress());
// 执行添加sql
int temp = statement.executeUpdate();
if (temp > 0) {
System.out.println("添加信息成功");
}
} catch (Exception e) {
System.out.println("添加信息失败");
e.printStackTrace();
} finally {
if (statement != null && conn != null) {
try {
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
// 根据用户id修改用户信息
public void updateUser(UserBean userBean) {
Connection conn = null;
PreparedStatement statement = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建修改数据的sql语句
String update = "update t_user set u_name=?,u_age=?,u_address=? where u_id=?;";
System.out.println(update);
// 创建PreparedStatement对象
statement = conn.prepareStatement(update);
// 传递“?”所需的数据值--PreparedStatement对象的setXXXX(位置,数据值)
statement.setString(1, userBean.getUname());
statement.setInt(2, userBean.getUage());
statement.setString(3, userBean.getUaddress());
statement.setInt(4, userBean.getUid());
// 执行修改sql
int temp = statement.executeUpdate();
if (temp > 0) {
System.out.println("修改信息成功");
}
} catch (Exception e) {
System.out.println("修改信息失败");
e.printStackTrace();
} finally {
if (statement != null && conn != null) {
try {
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
// 根据用户id查询用户信息
public UserBean selectUserById(int userid) {
UserBean userbean = null;
Connection conn = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建根据用户id查询用户信息sql语句
String select = "select * from t_user where u_id=?;";
System.out.println(select);
// 创建PreparedStatement对象
statement = conn.prepareStatement(select);
statement.setInt(1, userid);
// 执行查询sql
resultSet = statement.executeQuery();
if (resultSet.next()) {
int id = resultSet.getInt("u_id");
String name = resultSet.getString("u_name");
int age = resultSet.getInt("u_age");
String address = resultSet.getString("u_address");
userbean = new UserBean();
userbean.setUid(id);
userbean.setUname(name);
userbean.setUage(age);
userbean.setUaddress(address);
}
} catch (Exception e) {
System.out.println("查询信息失败");
e.printStackTrace();
} finally {
if (resultSet != null && statement != null && conn != null) {
try {
resultSet.close();
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return userbean;
}
// 查询所有用户信息
public List<UserBean> selectUser() {
List<UserBean> userlist = new ArrayList<UserBean>();
Connection conn = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建查询所有用户信息sql语句
String select = "select * from t_user;";
System.out.println(select);
// 创建PreparedStatement对象
statement = conn.prepareStatement(select);
// 执行查询sql
resultSet = statement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt("u_id");
String name = resultSet.getString("u_name");
int age = resultSet.getInt("u_age");
String address = resultSet.getString("u_address");
UserBean userbean = new UserBean();
userbean.setUid(id);
userbean.setUname(name);
userbean.setUage(age);
userbean.setUaddress(address);
userlist.add(userbean);
}
} catch (Exception e) {
System.out.println("查询信息失败");
e.printStackTrace();
} finally {
if (resultSet != null && statement != null && conn != null) {
try {
resultSet.close();
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return userlist;
}
// 根据id删除用户信息
public void deleteUserById(int userid) {
Connection conn = null;
PreparedStatement statement = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建删除数据的sql语句
String delete = "delete from t_user where u_id=?;";
System.out.println(delete);
// 创建PreparedStatement对象
statement = conn.prepareStatement(delete);
statement.setInt(1, userid);
// 执行删除sql
int temp = statement.executeUpdate();
if (temp > 0) {
System.out.println("删除信息成功");
}
} catch (Exception e) {
System.out.println("删除信息失败");
e.printStackTrace();
} finally {
if (statement != null && conn != null) {
try {
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
测试
package com.wangxing.jdbcdbcp.test;
import com.wangxing.jdbcdbcp.bean.UserBean;
import com.wangxing.jdbcdbcp.dao.UserBeanDaoClass;
public class TestMain {
public static void main(String[] args) {
//测试修改数据
UserBean userbean=new UserBean();
userbean.setUid(3);
userbean.setUname("王五");
userbean.setUage(25);
userbean.setUaddress("西安");
UserBeanDaoClass userDao=new UserBeanDaoClass();
userDao.updateUser(userbean);
}
}
3.JDBC访问Druid
Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。Druid是阿里巴巴开发的号称为监控而生的数据库连接池!
同时Druid不仅仅是一个数据库连接池,它包括四个部分:
Druid是一个JDBC组件,它包括三个部分:
基于Filter-Chain模式的插件体系。
DruidDataSource 高效可管理的数据库连接池。
SQLParser
Druid的功能
1、替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
2、可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
3、数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
4、SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
5、扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。
所以Druid可以:
1、充当数据库连接池。
2、可以监控数据库访问性能
3、获得SQL执行日志
例如:
1.创建数据库表
2.创建java项目,导入jar包【druid-1.1.10.jar】
3.在src下创建数据库连接配置文件【xxxxxxxx.properties】
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
initialSize=100
maxActive=300
maxWait=60000
Druid配置详解
https://blog.csdn.net/zhangjinwei417/article/details/92823438
4.创建javabean[同上]
5.创建数据库访问类
package com.wangxing.jdbcdruid.dao;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.wangxing.jdbcdruid.bean.UserBean;
/**
* 用户信息的访问类
*
* @author Administrator
*
*/
public class UserBeanDaoClass {
// 定义保存druid数据源对象
private DataSource dataSource = null;
public UserBeanDaoClass() {
try {
Properties pro=new Properties();
//getResourceAsStream("该参数名称应与上面配置文件名相同,后缀不能改动")
InputStream inStream=this.getClass().getResourceAsStream("/mydata.properties");
pro.load(inStream);
dataSource=DruidDataSourceFactory.createDataSource(pro);
}catch(Exception e) {
e.printStackTrace();
}
}
// 添加用户信息
public void insertUser(UserBean userBean) {
Connection conn = null;
PreparedStatement statement = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建添加数据的sql语句
String insert = "insert into t_user values(null,?,?,?);";
System.out.println(insert);
// 创建PreparedStatement对象
statement = conn.prepareStatement(insert);
// 传递“?”所需的数据值--PreparedStatement对象的setXXXX(位置,数据值)
statement.setString(1, userBean.getUname());
statement.setInt(2, userBean.getUage());
statement.setString(3, userBean.getUaddress());
// 执行添加sql
int temp = statement.executeUpdate();
if (temp > 0) {
System.out.println("添加信息成功");
}
} catch (Exception e) {
System.out.println("添加信息失败");
e.printStackTrace();
} finally {
if (statement != null && conn != null) {
try {
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
// 根据用户id修改用户信息
public void updateUser(UserBean userBean) {
Connection conn = null;
PreparedStatement statement = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建修改数据的sql语句
String update = "update t_user set u_name=?,u_age=?,u_address=? where u_id=?;";
System.out.println(update);
// 创建PreparedStatement对象
statement = conn.prepareStatement(update);
// 传递“?”所需的数据值--PreparedStatement对象的setXXXX(位置,数据值)
statement.setString(1, userBean.getUname());
statement.setInt(2, userBean.getUage());
statement.setString(3, userBean.getUaddress());
statement.setInt(4, userBean.getUid());
// 执行修改sql
int temp = statement.executeUpdate();
if (temp > 0) {
System.out.println("修改信息成功");
}
} catch (Exception e) {
System.out.println("修改信息失败");
e.printStackTrace();
} finally {
if (statement != null && conn != null) {
try {
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
// 根据用户id查询用户信息
public UserBean selectUserById(int userid) {
UserBean userbean = null;
Connection conn = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建根据用户id查询用户信息sql语句
String select = "select * from t_user where u_id=?;";
System.out.println(select);
// 创建PreparedStatement对象
statement = conn.prepareStatement(select);
statement.setInt(1, userid);
// 执行查询sql
resultSet = statement.executeQuery();
if (resultSet.next()) {
int id = resultSet.getInt("u_id");
String name = resultSet.getString("u_name");
int age = resultSet.getInt("u_age");
String address = resultSet.getString("u_address");
userbean = new UserBean();
userbean.setUid(id);
userbean.setUname(name);
userbean.setUage(age);
userbean.setUaddress(address);
}
} catch (Exception e) {
System.out.println("查询信息失败");
e.printStackTrace();
} finally {
if (resultSet != null && statement != null && conn != null) {
try {
resultSet.close();
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return userbean;
}
// 查询所有用户信息
public List<UserBean> selectUser() {
List<UserBean> userlist = new ArrayList<UserBean>();
Connection conn = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建查询所有用户信息sql语句
String select = "select * from t_user;";
System.out.println(select);
// 创建PreparedStatement对象
statement = conn.prepareStatement(select);
// 执行查询sql
resultSet = statement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt("u_id");
String name = resultSet.getString("u_name");
int age = resultSet.getInt("u_age");
String address = resultSet.getString("u_address");
UserBean userbean = new UserBean();
userbean.setUid(id);
userbean.setUname(name);
userbean.setUage(age);
userbean.setUaddress(address);
userlist.add(userbean);
}
} catch (Exception e) {
System.out.println("查询信息失败");
e.printStackTrace();
} finally {
if (resultSet != null && statement != null && conn != null) {
try {
resultSet.close();
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return userlist;
}
// 根据id删除用户信息
public void deleteUserById(int userid) {
Connection conn = null;
PreparedStatement statement = null;
try {
// 得到数据库连接
conn = dataSource.getConnection();
// 创建删除数据的sql语句
String delete = "delete from t_user where u_id=?;";
System.out.println(delete);
// 创建PreparedStatement对象
statement = conn.prepareStatement(delete);
statement.setInt(1, userid);
// 执行删除sql
int temp = statement.executeUpdate();
if (temp > 0) {
System.out.println("删除信息成功");
}
} catch (Exception e) {
System.out.println("删除信息失败");
e.printStackTrace();
} finally {
if (statement != null && conn != null) {
try {
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
测试
package com.wangxing.jdbcdruid.test;
import com.wangxing.jdbcdruid.dao.UserBeanDaoClass;
public class TestMain {
public static void main(String[] args) {
//测试删除数据
UserBeanDaoClass userDao=new UserBeanDaoClass();
userDao.deleteUserById(3);
}
}