JDBC连接池和Spring JDBC
Posted LL.LEBRON
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC连接池和Spring JDBC相关的知识,希望对你有一定的参考价值。
文章目录
JDBC连接池&Spring JDBC
1.数据库连接池
1.1概念
其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
1.2好处
- 节约资源
- 用户访问高效
1.3实现
-
标准接口:
DateSource
javax.sq
l包下的。方法:
- 获取连接:
getConnection()
- 归还连接:
Connection.close()
。如果连接对象Connection
是从连接池中获取的,那么调用Connection.close()
方法,则不会再关闭连接了。而是归还连接。
- 获取连接:
-
一般我们不去实现它,有数据库厂商来实现。
C3P0
:数据库连接池技术。Druid
:数据库连接池实现技术,由阿里巴巴提供的。
1.4C3P0:数据库连接池技术
-
步骤:
- 导入jar包 (两个) :
c3p0-0.9.5.2.jar
,mchange-commons-java-0.2.12.jar
注意:不要忘记导入数据库驱动jar包。 - 定义配置文件:
- 名称:
c3p0.properties
或者c3p0-config.xml
- 路径:直接将文件放在
src
目录下即可。
- 名称:
- 创建核心对象 数据库连接池对象
ComboPooledDataSource
- 获取连接:
getConnection
- 导入jar包 (两个) :
-
代码:
-
创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
-
获取连接对象
Connection conn = ds.getConnection();
-
1.5 Druid:数据库连接池实现技术,由阿里巴巴提供的
-
步骤:
- 导入
jar
包druid-1.0.9.jar
- 定义配置文件:
- 是
properties
形式的。 - 可以叫任意名称,可以放在任意目录下。
- 是
- 加载配置文件。
Properties
- 获取数据库连接池对象:通过工厂来来获取
DruidDataSourceFactory
- 获取连接:
getConnection
代码:
public class DruidDemo { public static void main(String[] args) throws Exception { //1.加载配置文件 Properties pro=new Properties(); InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is); //2.获取连接池对象 DataSource ds= DruidDataSourceFactory.createDataSource(pro); //3.获取连接 Connection conn = ds.getConnection(); } }
- 导入
-
定义工具类
- 定义一个类
JDBCUtils
- 提供静态代码块加载配置文件,初始化连接池对象。
- 提供方法。
1. 获取连接方法:通过数据库连接池获取连接。
2. 释放资源。
3. 获取连接池的方法。
代码:
public class JDBCtils { //1.定义成员变量 DataSource private static DataSource ds; static { //1.加载配置文件 Properties pro = new Properties(); try { pro.load(JDBCUtiles.class.getClassLoader().getResourceAsStream("druid.properties")); try { //2.获取DataSource ds = DruidDataSourceFactory.createDataSource(pro); } catch (Exception e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } //获取连接 public static Connection getConnection() throws SQLException { return ds.getConnection(); } //释放资源 public static void close(Statement stmt, Connection conn) { close(null, stmt, conn); } public static void close(ResultSet rs, Statement stmt, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close();//归还连接 } catch (SQLException e) { e.printStackTrace(); } } } //获取连接池方法 public static DataSource getDataSource(){ return ds; } }
练习:
public class DruidDemo1 { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt = null; try { conn = JDBCtils.getConnection(); String sql = "insert into account values(null,?,?)"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, "小皮皮"); pstmt.setInt(2, 2323); int count = pstmt.executeUpdate(); System.out.println(count); } catch (SQLException throwables) { throwables.printStackTrace(); } finally { JDBCtils.close(pstmt, conn); } } }
- 定义一个类
2.Spring JDBC
-
概述:
Spring
框架对JDBC
的简单封装。提供了一个JDBCTemplate
对象简化JDBC
的开发。 -
步骤:
-
导入
jar
包 -
创建
JdbcTemplate
对象。依赖于数据源DataSource
JdbcTemplate template = new JdbcTemplate(ds);
-
调用
JdbcTemplate
的方法来完成CRUD
的操作。-
update()
:执行DML
语句。增、删、改语句。 -
queryForMap()
:查询结果将结果集封装为map
集合,将列名作为key
,将值作为value
将这条记录封装为一个map
集合。- 注意:这个方法查询的结果集长度只能是1。
-
queryForList()
:查询结果将结果集封装为list
集合。- 注意:将每一条记录封装为一个
Map
集合,再将Map
集合装载到List
集合中。
- 注意:将每一条记录封装为一个
-
query()
:查询结果,将结果封装为JavaBean
对象。-
query
的参数:RowMapper
-
一般我们使用
BeanPropertyRowMapper
实现类。可以完成数据到JavaBean
的自动封装。new BeanPropertyRowMapper<类型>(类型.class)
-
-
queryForObject
:查询结果,将结果封装为对象。- 一般用于聚合函数的查询。
-
-
-
练习
-
需求:
- 修改1号数据的 salary 为 10000
- 添加一条记录
- 删除刚才添加的记录
- 查询id为1的记录,将其封装为Map集合
- 查询所有记录,将其封装为List
- 查询所有记录,将其封装为Emp对象的List集合
- 查询总记录数
-
代码实现:
public class JDBCTemplateDemo { private JdbcTemplate template = new JdbcTemplate(JDBCtils.getDataSource()); //Junit单元测试,可以让方法独立执行 //1.修改1号数据的 salary 为 10000 @Test public void test1() { String sql = "update emp set salary =10000 where id=1001"; int count = template.update(sql); System.out.println(count); } //2.添加一条记录 @Test public void test2() { String sql = "insert into emp(id,ename,dept_id) values(?,?,?)"; int count = template.update(sql, 15, "郭靖", 10); System.out.println(count); } //3.删除刚才添加的记录 @Test public void test3() { String sql = "delete from emp where id=?"; int count = template.update(sql, 15); System.out.println(count); } /*4.查询id为1001的记录,将其封装为Map集合 * 注意:这个方法查询的结果集长度只能是 * */ @Test public void test4() { String sql = "select * from emp where id=? "; Map<String, Object> m = template.queryForMap(sql, 1001); System.out.println(m); } //5.查询所有记录,将其封装为List @Test public void test5() { String sql = "select * from emp "; List<Map<String, Object>> list = template.queryForList(sql); for (Map<String, Object> stringObjectMap : list) { System.out.println(stringObjectMap); } } //6.查询所有记录,将其封装为Emp对象的List集合 @Test public void test6() { String sql = "select * from emp"; List<Emp> list = template.query(sql, new BeanPropertyRowMapper<>(Emp.class)); for (Emp emp : list) { System.out.println(emp); } } //7.查询总记录数 @Test public void test7() { String sql = "select count(id) from emp"; Long total = template.queryForObject(sql, long.class); System.out.println(total); } }
-
以上是关于JDBC连接池和Spring JDBC的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring 和 DBCP 处理 JDBC 连接的正确方法是啥?
知了堂学习心得浅谈c3p0连接池和dbutils工具类的使用
java jdbc深入理解(connection与threadlocal与数据库连接池和事务实)