JDBC连接池&Template目录
1、数据库连接池
- 之前每次做依次数据库操作时,都需要建立数据库连接,而这种操作是向底层申请资源,非常耗时。
-> 解决方法:数据库连接池技术 -> 解决性能低、资源浪费的情况。 - 用户访问数据库,从容器(池子,数据库连接池)拿数据库连接
- 概念:其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
- 好处:节约资源,用户访问高效
- 实现:
- 标准结构:DataSource javax.sql包下的
- 方法:
- 获取连接:
getConnection()
- 归还连接:如果连接对象Connection()是从连接池中获取的,那么调用
Connection.close()
方法,则不会再关闭连接了,而是归还连接。
- 获取连接:
- 方法:
- 一般我们不去实现它,由数据库厂商来实现(开源的数据库连接池)
- C3P0:数据库连接池技术
- Druid:数据库连接池技术,由阿里巴巴提供
- 标准结构:DataSource javax.sql包下的
2、C3P0:数据库连接池技术
- 步骤
- 导入jar包
c3p0-0.9.5.2.jar mchange-commins-java-0.2.12.jar
(依赖jar包),以及数据库的驱动jar包 - 定义配置文件:
- 名称:c3p0.properties 或 c3p0.config.xml
- 路径:需要放在项目的内路径中,直接将文件放置再src目录下即可
- 创建核心对象 数据库连接池对象 ComboPooledDataSource
- 获取连接 getConnection()
- 导入jar包
3、Druid:数据库连接池技术
- 步骤:
- 导入jar包
druid-1.0.9.jar
- 定义配置文件:
- 特点:是properties形式的;可以叫任意名称,可以放在任意目录下,即 需要手动加载进来
- 加载配置文件
- 获取数据库连接池对象(数据源resource):通过工厂来获取DruidDataResourceFactory
- 获取连接:
getConnection()
- 导入jar包
- 代码示例:
public class druid_demo1{
public static void main(String[] args) throws Exception {
// 1.导入jar包
// 2.定义配置文件
Properties pro = new Poperties();
InputStream is = druid_demo1.class.getClassLoader().getResourceAsStream("druid.properties");
// 3.加载配置文件
pro.load(is);
// 4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
// 5.获取连接
Connection conn = ds.getConnection();
}
}
4、定义工具类 JDBCUtils
-
步骤:
- 定义一个类 JDBCUtils
- 提供静态代码块加载配置文件,初始化连接池对象
- 提供方法
- 获取连接方法:通过数据库连接池获取连接
- 释放资源
- 获取连接池的方法
-
代码示例
public class JDBCUtils {
// 定义成员变量 DataSource
private static DataSource ds;
static{
try{
// 加载配置文件
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取连接
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
// 释放资源
public static void close(ResultSet res, Statement stat, Connection conn){
if (res != null) {
try{
res.close();
} catch (SQLException e){
e.printStackTrace();
}
}
if (stat != null ) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try{
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 重写close()函数
public static void close(Statement stat, Connection conn) {
close(null, statc, conn);
}
// 获取连接池的方法
public static DataSource getDataSource(){
return ds;
}
}
5、Spring JDBC:JDBCTemplate
- 作用:简化JDBC编程
- Spring框架提供的对JDBC的简单封装,提供了JDBCTemplate对象简化JDBC的开发
- 步骤:
- 导入jar包
- 创建JDBCTemplate对象,依赖于数据库DataSource
jdbcTemplate template = new JdbcTemplate(ds);
- 调用JdbcTemplate的方法来完成CRUD操作(增删改查):
update()
:执行DML语句:增删改语句queryForMap()
:查询结果将结果集封装成map集合。
注意:查询的结果集长度只能是1,将列名作为key,将值作为value,将这条记录封装为一个map集合queryForList()
:查询结果将结果集封装为list集合
注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中query()
:查询结果,将结果封装为JavaBean对象
注意:JavaBean最好不要用基本类型,用引用类型比较好,不然null赋值会报错。
参数:RowMapper
一般我们使用BeanPropertyRowMapper实现类,可以完成数据到JavaBean的自动封装
List<User> list = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
new BeanPropertyRowMapper<类型>(类型.class)
类型.class 类型的字节码对象queryForObject()
:查询结果,将结果封装为对象。多用于语句中的聚合函数
- 示例代码:
public class JDBCTemplate_demo{
public static void main(String[] args) {
// 1.导入jar包
// 2.创建JDBCTemplate对象
JdbcTempalte template = new JdbcTemplate(JDBCUtils.getDataSource());
// 3.调用方法
String sql = "update db_user set balance = 5000 where id = ? ";
int count = template.update(sql, 4);
System.out.println(count);
}
}