JAVA使用C3P0操作数据库
先把结构图贴出来:
照抄,把文件全部建好,该导的包导了,如何导包参考这里。
两个包:cn.itclass.jdbc.test,cn.itclass.jdbc.utils
三个类:TestC3P0.java,C3P0Utils.java,JDBCUtils.java
两个配置文件:c3p0-config.xml,db.properties
在实际项目中,我们会有很多用户来访问我们的数据库,如果每个人访问时我们都来创建一个数据库连接用完之后再关闭,将会造成大量的资源浪费和时间浪费,所以我们就采用一个叫连接池的东西来管理我们的连接,需要的时候从里面拿出来,用完之后再放回去,就可以解决上述的问题。我们可以自定义连接池,但是比较复杂,我们可以采用C3P0来帮我们完成想要的工作。
先写两个配置文件:c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///web08</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="itclass">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///web08</property>
<property name="user">root</property>
<property name="password">123456</property>
</named-config>
</c3p0-config>
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web08?useUnicode=true&characterEncoding=utf8
username=root
password=123456
因为连接池也是需要先创建连接,所以我们也需要用到JDBC创建连接的内容,接下来写JDBC创建连接的类:JDBCUtils.java
package cn.itclass.jdbc.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.sql.Connection;
import java.sql.DriverManager;
import java.lang.Exception;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class JDBCUtils {
private static String driver;
private static String url;
private static String username;
private static String password;
/**
* 静态代码块,直接加载,速度更快 这里是创建并获取连接的步骤 并且需要一个名为db.properties:配置文件: 后缀固定,名字自取
*/
static {
try {
// 1.通过当前类获取加载器
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
// 2.通过类加载器的方法获得一个输入流
InputStream is = classLoader.getResourceAsStream("db.properties");
// 3.创建一个properties对象
Properties props = new Properties();
// 4.加载输入流
props.load(is);
// 5.获取相关参数的值
driver = props.getProperty("driver");
url = props.getProperty("url");
username = props.getProperty("username");
password = props.getProperty("password");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 这里还需要一个获取连接的方法
*/
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 打开资源入口之后就要关闭 所以这里最后需要关闭资源
*/
public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
然后我们直接开始写C3P0的测试类:TestC3P0.java
package cn.itclass.jdbc.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import javax.sql.DataSource;
import org.junit.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import cn.itclass.jdbc.utils.JDBCUtils;
@Test
public void testAddUser() {
Connection conn = null;
PreparedStatement pstmt = null;
/*
* 1.创建自定义连接池对象
* ComboPooledDataSource()如果括号内不填写内容,将查找config文件中默认的配置
* 如果需要找自定义配置,需要写ComboPooledDataSource("XXX")
*/
DataSource dataSource = new ComboPooledDataSource("itclass");
try {
// 2.从池子中获取链接
conn = dataSource.getConnection();
// 3.书写sql语句
String sql = "insert into tbl_user values(null,?,?)";
// 4.执行sql语句
pstmt = conn.prepareStatement(sql);
// 5.设置sql语句占位符的值
pstmt.setString(1, "貂蝉2");
pstmt.setString(2, "吕布2");
// 6.对结果进行处理
int rows = pstmt.executeUpdate();
if (rows > 0) {
System.out.println("添加成功");
} else {
System.out.println("添加失败");
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
// 7.关闭连接
JDBCUtils.release(conn, pstmt, null);
}
}
有了以上代码之后,我们就可以直接使用了,但是我们可以发现,还可以将C3P0的1、2两步抽取出来,封装成一个工具类,所以我们将其封装成类:C3P0Utils.java
package cn.itclass.jdbc.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 dataSource = new ComboPooledDataSource("itclass");
public static DataSource getDataSource() {
return dataSource;
}
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
}
我们之后可以将TestC3P0.java代码进行更新,更新过后为以下内容:
package cn.itclass.jdbc.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import javax.sql.DataSource;
import org.junit.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import cn.itclass.jdbc.utils.C3P0Utils;
import cn.itclass.jdbc.utils.JDBCUtils;
public class TestC3P0 {
/**
* 此方法为抽取工具类的方法
*/
@Test
public void testAddUser1() {
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 2.从池子中获取链接
conn = C3P0Utils.getConnection();
String sql = "insert into tbl_user values(null,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "吕布1");
pstmt.setString(2, "貂蝉1");
int rows = pstmt.executeUpdate();
if (rows > 0) {
System.out.println("添加成功");
} else {
System.out.println("添加失败");
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
JDBCUtils.release(conn, pstmt, null);
}
}
@Test
public void testAddUser() {
Connection conn = null;
PreparedStatement pstmt = null;
/*
* 1.创建自定义连接池对象
* ComboPooledDataSource()如果括号内不填写内容,将查找config文件中默认的配置
* 如果需要找自定义配置,需要写ComboPooledDataSource("XXX")
*/
DataSource dataSource = new ComboPooledDataSource("itclass");
try {
// 2.从池子中获取链接
conn = dataSource.getConnection();
// 3.书写sql语句
String sql = "insert into tbl_user values(null,?,?)";
// 4.执行sql语句
pstmt = conn.prepareStatement(sql);
// 5.设置sql语句占位符的值
pstmt.setString(1, "貂蝉2");
pstmt.setString(2, "吕布2");
// 6.对结果进行处理
int rows = pstmt.executeUpdate();
if (rows > 0) {
System.out.println("添加成功");
} else {
System.out.println("添加失败");
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
// 7.关闭连接
JDBCUtils.release(conn, pstmt, null);
}
}
}
为了看得更清楚一点,抽取之后的在上,没有抽取的在下,大家可以进行一下对比,虽然只少了两步,可如果程序很大的时候,就可能少很多代码了,所以这也是很至关重要的。
总结:连接池的使用和之前单一连接的方式差不多,为以下几步:
1)创建连接池(C3P0会根据配置文件创建出一定数量的连接,无需我们手动创建连接)
2)从连接池中获取连接
3)书写sql语句
4)执行sql语句
5)给占位符赋值
6)对结果集进行处理
7)关闭连接(这个地方还不太明白,应该是将其归还到连接池当中,但是却直接关闭了,后续了解之后再更新)
推荐阅读
-
JAVA使用C3P0操作数据库
-
使用Java Rest Client操作Elasticsearch 博客分类: ELK elasticsearchjava
-
java: SQLite使用实例 博客分类: 7.数据库 javadbsqlitesqlite管理工具
-
Java商城开发中使用连接池会起到的效果 博客分类: Java java数据库连接商城数据库关闭
-
使用JConsole监控c3p0的连接情况 博客分类: tomcatjava数据库 监控c3p0JConsolejmx
-
JAVA无法使用MySQL别名获取列 博客分类: 数据库 MySql别名
-
MongoDB最简单的入门教程之四:使用Spring Boot操作MongoDB 数据库mongoDBSpringBoot
-
MongoDB最简单的入门教程之三 使用Java代码往MongoDB里插入数据 mongoDBJava数据库NoSQL
-
JAVA连接数据库:数据库连接池,C3P0连接和druid连接
-
通用的Java操作数据库工具类(原生JDBC,不使用DBUtils,c3p0等工具)