Java之JDBC连接池
Posted 我想回家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java之JDBC连接池相关的知识,希望对你有一定的参考价值。
数据库连接池
连接池的概述
- 概念:其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,
从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。 - 好处:
- 节约资源
- 用户访问高效
- 节约资源
- 实现:
- 标准接口:DataSource javax.sql包下的
- 方法:
- 获取连接:getConnection()
- 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,
则不会再关闭连接了。而是归还连接
- 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,
- 获取连接:getConnection()
- 一般我们不去实现它,有数据库厂商来实现
- C3P0:数据库连接池技术
- Druid:数据库连接池实现技术,由阿里巴巴提供的
- 方法:
- 标准接口:DataSource javax.sql包下的
- C3P0:数据库连接池技术
- 步骤:
- 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
- 不要忘记导入数据库驱动jar包
- 定义配置文件:
- 名称: c3p0.properties 或者 c3p0-config.xml
- 路径:直接将文件放在src目录下即可。
- 创建核心对象 数据库连接池对象 ComboPooledDataSource
- 获取连接: getConnection
- 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
- 代码:
//1.创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//2. 获取连接对象
Connection conn = ds.getConnection();
- 步骤:
- Druid:数据库连接池实现技术,由阿里巴巴提供
- 步骤:
- 导入jar包 druid-1.0.9.jar
- 定义配置文件:
- 是properties形式的
- 可以叫任意名称,可以放在任意目录下
- 加载配置文件。Properties
- 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
- 获取连接:getConnection
- 代码:
//3.加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接
Connection conn = ds.getConnection();
- 定义工具类
- 定义一个类 JDBCUtils
- 提供静态代码块加载配置文件,初始化连接池对象
- 提供方法
- 获取连接方法:通过数据库连接池获取连接
- 释放资源
- 获取连接池的方法
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db3?useSSL=true
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000public class JDBCUtils {
/** * 定义数据源 */ private static DataSource ds; static { try { /** * 加载配置文件 */ InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"); Properties pro = new Properties(); pro.load(is); /** * 获取数据源 */ ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } /** * 获取数据源 * @return 返回数据源 */ public static DataSource getDataSource(){ return ds; } /** * 获取连接对象 * @return 返回连接对象 * @throws SQLException 抛出的编译异常 */ public static Connection getConn() throws SQLException { return ds.getConnection(); } /** * 关闭连接 * @param stmt sql执行对象 * @param conn 数据库连接对象 */ public static void close(Statement stmt, Connection conn){ if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 关闭资源的重载方法 * @param rs 处理结果集的对象 * @param stmt 执行sql语句的对象 * @param 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(); } } }
}
- 步骤:
JdbcTemplate
- 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)
- query的参数:RowMapper
- queryForObject:查询结果,将结果封装为对象
一般用于聚合函数的查询
public class SpringJdbcTemplateTest {
private static JdbcTemplate jdbcTemplate;@Before public void init(){ // 1. 导入jar包 // 2. 创建JDBCTemplate对象 jdbcTemplate = new JdbcTemplate(JdbcUtils.getDataSource()); } @Test public void testInsert(){ // 创建sql String sql = "INSERT INTO ACCOUNT VALUES(NULL,?,?)"; // 执行sql,返回影响的行数 int lines = jdbcTemplate.update(sql, "王五", 5000); System.out.println("影响的行数为:" + lines); } @Test public void testUpdate(){ // 创建sql String sql = "UPDATE ACCOUNT SET BALANCE = ? WHERE ID = ?"; // 执行sql,返回影响的行数 int lines = jdbcTemplate.update(sql, 3000, 3); System.out.println("影响的行数为:" + lines); } @Test public void testDelete(){ // 创建sql String sql = "DELETE FROM ACCOUNT WHERE ID = ?"; // 执行sql,返回影响的行数 int lines = jdbcTemplate.update(sql, 3); System.out.println("影响的行数为:" + lines); } @Test public void testQueryForMap(){ // 3. 创建sql String sql = "SELECT * FROM STUDENT WHERE ID = ?"; // 4. 使用查询语句进行查询(变长参数替换占位符) Map<String, Object> map = jdbcTemplate.queryForMap(sql,7); System.out.println(map); } @Test public void testQueryForList(){ // 创建sql语句 String sql = "SELECT * FROM STUDENT"; // 执行sql,返回结果 List<Map<String, Object>> list = jdbcTemplate.queryForList(sql); // 处理结果 for (Map<String, Object> map : list) { System.out.println(map); } } /** * queryForMap:将结果封装成Map,只能返回一条结果, * 列名为Key,对应的值为Value */ @Test public void testQuery(){ // 创建sql String sql = "SELECT * FROM ACCOUNT"; // 执行sql(使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装) List<Account> accounts = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Account.class)); // 处理结果 for (Account account : accounts) { System.out.println(account); } } @Test public void testQueryForObject(){ // 创建sql String sql = "SELECT COUNT(ID) FROM ACCOUNT"; // 执行sql,一般用于查询聚合函数() Long count = jdbcTemplate.queryForObject(sql,Long.class); System.out.println(); }
}
以上是关于Java之JDBC连接池的主要内容,如果未能解决你的问题,请参考以下文章