数据库连接池与JDBC Template
数据库连接池
-
概念:存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后,会将连接对象归还给容器。
-
特点:节约资源、访问高效
-
实现:
-
标准接口:DataSource javax.sql包下
- 方法:
- 获取连接:getConnection()
- 归还连接:如果连接对象Connection是从连接池中获取,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接
-
由数据库厂商实现
- C3P0:数据库连接池技术
- Druid:数据库连接池实现技术,由阿里巴巴提供
-
-
C3P0:数据库连接池技术
-
步骤:
-
导入jar包;c3p0-0.9.5.5.jar & mchange-commons-java-0.2.19.jar & mysql-connector-java-8.0.23.jar
下载地址:https://sourceforge.net/projects/c3p0/
-
定义配置文件:
- 名称:c3p0.properties 或者 c3po-config.xml
- 路径:直接将文件放在src目录下即可。
-
创建核心对象(数据库连接池对象)ComboPooledDataSource
-
获取连接:getConnection
-
public class c3p0demo2 {
public static void main(String[] args) throws SQLException {
//1、获取DataSource
DataSource ds = new ComboPooledDataSource();//可添加参数进行指定名称配置
//2、获取连接
for (int i = 1; i < 11; i++) {
Connection conn = ds.getConnection();
System.out.println(i + " : " + conn );
}
}
/*public void testNamedeConfig(){
//1.1获取DataSource,使用指定名称配置
DataSource ds = new ComboPooledDataSource("otherc3p0");
}*/
}
-
Druid:数据库连接池技术,由阿里巴巴提供
-
步骤:
-
导入jar包 druid - 1.0.9.jar & 数据库驱动jar包
-
定义配置文件:是properties形式,可以叫任意名称,可以放在任意目录下
-
加载配置文件:Properrties
4. 获取数据库连接池对象:通过工厂类来获取DruidDataSourceFactory
5. 获取连接
public class DruidDemo1{ public static void main(String[] args) throws Exception { //导入jar包 //定义配置文件 //加载配置文件 Properties pro = new Properties(); InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is); //获取连接池对象 DataSource ds = DruidDataSourceFactory.createDataSource(pro); //获取连接 Connection conn = ds.getConnection(); System.out.println(conn); } }
-
-
定义工具类
- 定义一个JDBCUtils
- 提供静态代码块加载配置文件,初始化连接池对象
- 提供方法
- 获取连接方法:通过数据库连接池获取连接
- 释放资源
- 获取连接池的方法
public class JDBCUtils { //1、定义成员变量DataSource private static DataSource ds; static{ //1、加载配置文件 Properties pro = new Properties(); try { pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties ")); //2、获取DataSource 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 rs, 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(); } } if(rs != null ){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } /* 获取连接池方法 * */ public static DataSource getDataSource(){ return ds; } }
完整代码:
public class DruidDemo2 { public static void main(String[] args) { /* * 完成添加操作 account表添加数据 一条记录 * */ Connection conn = null; PreparedStatement pstmt = null ; try { //1、获取连接 conn = JDBCUtils.getConnection(); // 2、定义SQL String sql = "insert into account values (null,?,?)"; // 3、获取pstmt对象 pstmt = conn.prepareStatement(sql); // 4、给?赋值 pstmt.setString(1,"王五"); pstmt.setDouble(2,1000); // 5、执行SQL int count = pstmt.executeUpdate(); System.out.println(count); } catch (SQLException e) { e.printStackTrace(); }finally{ // 6、释放资源 JDBCUtils.close(null,pstmt,conn); } } }
-
JDBC Template
Spring JDBC
-
Spring 框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
-
步骤:
-
导入jar包
-
创建JDBCTemplate对象。依赖于数据源DataSource
- JdbcTemplate template = new JdbcTemplate(ds)
-
调用JdbcTemplate的方法来完成CRUD的操作
- update():执行DML语句:增删改语句
- queryForMap():查询结果将结果封装为map集合
- queryForList():查询结果将结果封装为list集合
- query():查询结果将结果封装为JavaBean集合
- queryForObject():查询结果将结果封装为对象
public class JdbcTemplateDemo1 { public static void main(String[] args) { // 1、导入jar包 // 2、创建JDBCTemplate对象 JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); // 3、sql语句 String sql = "update account set balance = 5000 where id = ?"; // 4、调用方法 int count = template.update(sql, 3); System.out.println(count); } }
4、练习:
-
需求:
-
修改1号数据的salary为10000
-
添加一条记录
-
删除刚才添加的记录
-
查询所有记录,将其封装为Map集合
-
查询所有记录,将其封装为List集合
-
查询所有记录,将其封装为Emp对象的List集合
-
查询总记录数
-
4、练习:
-
需求:
-
修改1号数据的salary为10000
-
添加一条记录
-
删除刚才添加的记录
-
查询所有记录,将其封装为Map集合
-
查询所有记录,将其封装为List集合
-
查询所有记录,将其封装为Emp对象的List集合
-
查询总记录数
-
-