【Java EE】Day06 JDBC连接池介绍、C3P0连接池实现、Druid连接池实现、JDBCTemplate
一、数据库连接池介绍
1、引入
- 之前:每次都要获取连接释放连接
- 现在:连接重复使用
2、概念:
- 存放数据库连接的容器
3、实现
- DataSource接口
- 三种实现
- 标准实现
- 连接池实现
- C3P0
- Druid实现,阿里提供
- 分布式事务实现
3、方法
- 获取连接
- 归还连接:close()
二、C3P0连接池实现
1、两种使用方式
- 硬编码:将驱动类、链接地址写死在程序中
- 配置文件:c3p0.properties or c3p0-config.xml
2、使用步骤
- 导入jar包 : c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar
- 定义配置文件(可以配置多个连接池,构造写名字)并放到src目录下
- 创建数据库连接池核心对象ComboPooledDataSource
- 获取连接:getConnection
package cn.itcast.datasource.c3p0; import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; /** * c3p0的演示 */ public class C3p0Demo1 { public static void main(String[] args) throws SQLException { //1.创建数据库连接池对象 DataSource ds = new ComboPooledDataSource(); //2.获取连接对象 Connection conn = ds.getConnection();//之前是DriverManager //3.打印 System.out.println(conn); } }
三、Druid连接池实现
1、使用步骤
- 导入jar包druid-1.0.9.jar
- 定义.properties配置文件,进行手动加载
- 加载配置文件 ,使用Properties类
- 通过工厂类DruidSourceFactory获取数据库连接池对象.createDataSource(pro)
- 获取连接getConnection()
package cn.itcast.datasource.druid; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.util.Properties; /** * Druid演示 */ public class DruidDemo { public static void main(String[] args) throws Exception { //1.导入jar包 //2.定义配置文件 //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(); System.out.println(conn); } }
2、封装工具类
- JDBCUtils
- 静态代码块加载配置文件并初始化连接池对象
- 提供方法:
- 获取连接
- 释放资源
- 获取连接池
package cn.itcast.datasource.utils; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /** * Druid连接池的工具类 */ public class JDBCUtils { //1.定义一个成员变量 DataSource private static DataSource ds; static{ try { //1.加载配置文件 Properties pro=new Properties(); 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(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; } }
- 使用工具类进行测试
package cn.itcast.datasource.druid; import cn.itcast.datasource.utils.JDBCUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; /** * 使用新的工具类 */ 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,3000); int count = pstmt.executeUpdate(); System.out.println(count); } catch (SQLException e) { e.printStackTrace(); }finally { //6.释放资源 JDBCUtils.close(pstmt,conn); } } }
四、JDBCTemplate
1、介绍
- Spring提供的对JDBC的封装,简化对JDBC的开发
2、步骤
- 导入jar包
- 创建JDBCTemplate对象,传递数据源
- 如:JDBCTemplate template =new JDBCTemplate(ds)
- 调用方法完成CRUD操作
- update(sql)
- queryForMap():返回Map<String,Object>
- queryForList():返回List<Map<记录>>
- query(sql,RowMapper/BeanPropertyRowMapper):返回 JavaBean
- queryForObject():返回对象查询结果,用于聚合函数
package cn.itcast.datasource.jdbctemplate; import cn.itcast.datasource.utils.JDBCUtils; import org.springframework.jdbc.core.JdbcTemplate; /** * JDBCtemplate入门 */ public class JdbcTemplateDemo1 { public static void main(String[] args) { //1.导入jar包 //2.创建JDBCTemplate对象 //ctrl+p查看参数 //jdbc资源的释放和申请操作由JDBCTemplate完成 JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource()); //3.调用方法 String sql="update account set balance =5000 where id=?"; int count = template.update(sql, 3); System.out.println(count); } }
3、执行DML语句
package cn.itcast.jdbctemplate; import cn.itcast.utils.JDBCUtils; import org.junit.Test; import org.springframework.jdbc.core.JdbcTemplate; public class JdbcTemplateDemo2 { //Junit单元测试,可以让方法独立执行 //1.获取JDBCtemplate对象 private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource()); /** * 修改1号数据的salary为10000 */ @Test public void test1(){ //2.定义sql String sql="update emp set salary =10000 where id=1001"; //3.执行sql int count = template.update(sql); System.out.println(count); } /** * 添加一条记录 */ @Test public void test2(){ String sql="insert into emp(id,ename,dept_id) values(?,?,?)"; int count = template.update(sql, 1015, "郭靖", 10); System.out.println(count); } /** * 删除刚才添加的记录 */ @Test public void test3(){ String sql="delete from emp where id=?"; int count = template.update(sql, 1015); System.out.println(count); } }
4、执行DQL语句
/** * 查询所有id为1的记录,将其封装为map集合 */ @Test public void test4(){ String sql="select * from emp where id=?"; Map<String, Object> map = template.queryForMap(sql, 1001); System.out.println(map); //{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20} } /** * 如果有多条记录 * 注意:此方法queryForMap结果集长度只能为1 */ @Test public void test5(){ String sql="select * from emp where id= ? or id= ?"; Map<String, Object> map = template.queryForMap(sql, 1001,1002); System.out.println(map); //{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20} } /** * 查询所有记录,将其封装为list集合 */ @Test public void test6(){ String sql="select * from emp"; List<Map<String, Object>> list = template.queryForList(sql); for (Map<String, Object> stringObjectMap : list) { System.out.println(stringObjectMap); } } /** * 查询所有记录,将其封装为Emp对象的list集合 */ @Test public void test7(){ String sql="select * from emp"; List<Emp> list = template.query(sql, new RowMapper<Emp>() { @Nullable @Override public Emp mapRow(ResultSet rs, int i) throws SQLException { Emp emp=new Emp(); int id = rs.getInt("id"); String ename = rs.getString("ename"); int job_id = rs.getInt("job_id"); int mgr = rs.getInt("mgr"); Date joindate = rs.getDate("joindate"); double salary = rs.getDouble("salary"); double bonus = rs.getDouble("bonus"); int dept_id = rs.getInt("dept_id"); emp.setId(id); emp.setEname(ename); emp.setJob_id(job_id); emp.setMgr(mgr); emp.setJoindate(joindate); emp.setSalary(salary); emp.setBonus(bonus); emp.setDept_id(dept_id); return emp; } }); for (Emp emp : list) { System.out.println(emp); } } /** * 查询所有记录,将其封装为 Emp对象的list集合 * template已经提供了实现类 */ @Test public void test8(){ String sql="select * from emp"; List<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class)); //提示空值不能转换为double,则需要修改javabean为引用数据类型 for (Emp emp : list) { System.out.println(emp); } } /** * 查询总的记录数(count') */@Test public void test9(){ String sql="select count(id) from emp"; Long total = template.queryForObject(sql, Long.class);//用于执行聚合函数 System.out.println(total); } }
本文来自博客园,作者:哥们要飞,转载请注明原文链接:https://www.cnblogs.com/liujinhui/p/14854043.html