JDBC开发流程
- 加载驱动
- 建立数据库连接(connect)
- 执行SQL语句(statement)
- ResultSet接受结果集(查询)
- 断开连接 释放资源
1.数据库连接对象是通过DriverManager来获取的,每次获取都需要向数据库申请获取连接,验证用户名和密码,执行完SQL语句后断开连接,这样的方式会造成资源的浪费,数据连接资源没有得到很好的重复利用。
可以使用数据库连接池解决这一问题
2.数据库连接池的基本思想就是为数据库建立一个缓冲池,预先向缓冲池放入一定数量的连接对象,供下一次请求的使用,做到了资源的重复利用,允许程序重复使用一个现有的数据库连接对象,而不需要重新创建
数据库连接池实现
JDBC的数据库连接池使用javax.sql.Datasource
来完成的。
javax
表示java后来扩展的一部分内容
javax.sql.Datasource
是java官方提供的接口,使用的时候开发者不需要自己来实现该接口,可以使用第三方的工具,C3P0
是一个常用的第三方实现 C3P0下载地址
- 导入jar包{
mchange-commons-java-0.2.19.jar,c3p0-0.9.5.5.jar
} - 编写代码
- 可以将C3P0的配置信息定义在xml文件中,java程序只需要加载配置文件即可完成数据库连接池的初始化操作
- &转义:&
//创建c3p0
try {
String url = "jdbc:mysql://localhost:3306/bjpowernode";
String user = "root";
String pwd = "12345678";
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
comboPooledDataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
comboPooledDataSource.setJdbcUrl(url);
comboPooledDataSource.setUser(user);
comboPooledDataSource.setPassword(pwd);
// 设置初始化连接数量
comboPooledDataSource.setInitialPoolSize(20);
// 设置最大连接数量
comboPooledDataSource.setMaxPoolSize(40);
// 当连接对象不够时,再次申请的连接个数
comboPooledDataSource.setAcquireIncrement(5);
// 当连接对象剩余2个时候就会去申请
comboPooledDataSource.setMinPoolSize(2);
Connection connection = comboPooledDataSource.getConnection();
System.out.println(connection);
} catch (PropertyVetoException | SQLException e) {
e.printStackTrace();
}
xml配置文件
- 配置文件的名字必须是
c3p0-config.xml
- 初始化comboPooledDataSource时 传入的参数必须是
c3p0-config.xml
中named-config
标签的name
值
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">
jdbc:mysql://localhost:3306/blog?useSSL=false&serverTimezone=UTC
</property>
<property name="user">root</property>
<property name="password">toor</property>
<property name="initialPoolSize">10</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">60</property>
<property name="maxStatements">200</property>
</default-config>
<named-config name="mysql5">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/w_blog</property>
<property name="user">root</property>
<property name="password"></property>
<property name="initialPoolSize">30</property>
<property name="maxPoolSize">60</property>
</named-config>
<named-config name="mysql8">
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/w_blog?useSSL=false&serverTimezone=UTC</property>
<!-- 使用&代替& -->
<property name="user">root</property>
<property name="password">toor</property>
<property name="initialPoolSize">300</property>
<property name="maxPoolSize">400</property>
</named-config>
</c3p0-config>
DBUtils工具
DBUtils
:可以帮助开发者完成数据的封装,把结果集映射到java对象
1.导入jar包 下载地址
2.使用
下面用到可变参数
Object... params
public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
return this.query(conn, false, sql, rsh, params);
}
public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh) throws SQLException {
return this.query(conn, false, sql, rsh, (Object[])null);
}
ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql_name");
QueryRunner run = new QueryRunner(dataSource);
// Use the BeanHandler implementation to convert the first
// ResultSet row into a Person JavaBean.
ResultSetHandler<Person> h = new BeanHandler<Person>(Person.class);
// Execute the SQL statement with one replacement parameter and
// return the results in a new Person object generated by the BeanHandler.
Person p = run.query(
"SELECT * FROM Person WHERE name=?", h, "John Doe");
网友评论