今日内容

  1. 1. 数据库连接池
  2. 2. Spring JDBC : JDBC Template

数据库连接池

  1. 1. 概念:其实就是一个容器(集合),存放数据库连接的容器。
  2. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
  3. 2. 好处:
  4. 1. 节约资源
  5. 2. 用户访问高效
  6. 3. 实现:
  7. 1. 标准接口:DataSource javax.sql包下的
  8. 1. 方法:
  9. * 获取连接:getConnection()
  10. * 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接
  11. 2. 一般我们不去实现它,有数据库厂商来实现
  12. 1. C3P0:数据库连接池技术
  13. 2. Druid:数据库连接池实现技术,由阿里巴巴提供的
  14. 4. C3P0:数据库连接池技术
  15. * 步骤:
  16. 1. 导入jar (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
  17. * 不要忘记导入数据库驱动jar
  18. 2. 定义配置文件:
  19. * 名称: c3p0.properties 或者 c3p0-config.xml
  20. * 路径:直接将文件放在src目录下即可。
  21. 3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
  22. 4. 获取连接: getConnection
  23. * 代码:
  24. //1.创建数据库连接池对象
  25. DataSource ds = new ComboPooledDataSource();
  26. //2. 获取连接对象
  27. Connection conn = ds.getConnection();
  28. 5. Druid:数据库连接池实现技术,由阿里巴巴提供的
  29. 1. 步骤:
  30. 1. 导入jar druid-1.0.9.jar
  31. 2. 定义配置文件:
  32. * properties形式的
  33. * 可以叫任意名称,可以放在任意目录下
  34. 3. 加载配置文件。Properties
  35. 4. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
  36. 5. 获取连接:getConnection
  37. * 代码:
  38. //3.加载配置文件
  39. Properties pro = new Properties();
  40. InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
  41. pro.load(is);
  42. //4.获取连接池对象
  43. DataSource ds = DruidDataSourceFactory.createDataSource(pro);
  44. //5.获取连接
  45. Connection conn = ds.getConnection();
  46. 2. 定义工具类
  47. 1. 定义一个类 JDBCUtils
  48. 2. 提供静态代码块加载配置文件,初始化连接池对象
  49. 3. 提供方法
  50. 1. 获取连接方法:通过数据库连接池获取连接
  51. 2. 释放资源
  52. 3. 获取连接池的方法
  53. * 代码:
  54. public class JDBCUtils {
  55. //1.定义成员变量 DataSource
  56. private static DataSource ds ;
  57. static{
  58. try {
  59. //1.加载配置文件
  60. Properties pro = new Properties();
  61. pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
  62. //2.获取DataSource
  63. ds = DruidDataSourceFactory.createDataSource(pro);
  64. } catch (IOException e) {
  65. e.printStackTrace();
  66. } catch (Exception e) {
  67. e.printStackTrace();
  68. }
  69. }
  70. /**
  71. * 获取连接
  72. */
  73. public static Connection getConnection() throws SQLException {
  74. return ds.getConnection();
  75. }
  76. /**
  77. * 释放资源
  78. */
  79. public static void close(Statement stmt,Connection conn){
  80. /* if(stmt != null){
  81. try {
  82. stmt.close();
  83. } catch (SQLException e) {
  84. e.printStackTrace();
  85. }
  86. }
  87. if(conn != null){
  88. try {
  89. conn.close();//归还连接
  90. } catch (SQLException e) {
  91. e.printStackTrace();
  92. }
  93. }*/
  94. close(null,stmt,conn);
  95. }

  1. public static void close(ResultSet rs , Statement stmt, Connection conn){

  1. if(rs != null){
  2. try {
  3. rs.close();
  4. } catch (SQLException e) {
  5. e.printStackTrace();
  6. }
  7. }

  1. if(stmt != null){
  2. try {
  3. stmt.close();
  4. } catch (SQLException e) {
  5. e.printStackTrace();
  6. }
  7. }
  8. if(conn != null){
  9. try {
  10. conn.close();//归还连接
  11. } catch (SQLException e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. }
  16. /**
  17. * 获取连接池方法
  18. */
  19. public static DataSource getDataSource(){
  20. return ds;
  21. }
  22. }

Spring JDBC

  1. * Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
  2. * 步骤:
  3. 1. 导入jar
  4. 2. 创建JdbcTemplate对象。依赖于数据源DataSource
  5. * JdbcTemplate template = new JdbcTemplate(ds);
  6. 3. 调用JdbcTemplate的方法来完成CRUD的操作
  7. * update():执行DML语句。增、删、改语句
  8. * queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
  9. * 注意:这个方法查询的结果集长度只能是1
  10. * queryForList():查询结果将结果集封装为list集合
  11. * 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
  12. * query():查询结果,将结果封装为JavaBean对象
  13. * query的参数:RowMapper
  14. * 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
  15. * new BeanPropertyRowMapper<类型>(类型.class)
  16. * queryForObject:查询结果,将结果封装为对象
  17. * 一般用于聚合函数的查询
  18. 4. 练习:
  19. * 需求:
  20. 1. 修改1号数据的 salary 10000
  21. 2. 添加一条记录
  22. 3. 删除刚才添加的记录
  23. 4. 查询id1的记录,将其封装为Map集合
  24. 5. 查询所有记录,将其封装为List
  25. 6. 查询所有记录,将其封装为Emp对象的List集合
  26. 7. 查询总记录数
  27. * 代码:
  28. import cn.itcast.domain.Emp;
  29. import cn.itcast.utils.JDBCUtils;
  30. import org.junit.Test;
  31. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  32. import org.springframework.jdbc.core.JdbcTemplate;
  33. import org.springframework.jdbc.core.RowMapper;
  34. import java.sql.Date;
  35. import java.sql.ResultSet;
  36. import java.sql.SQLException;
  37. import java.util.List;
  38. import java.util.Map;
  39. public class JdbcTemplateDemo2 {
  40. //Junit单元测试,可以让方法独立执行

  1. //1. 获取JDBCTemplate对象
  2. private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
  3. /**
  4. * 1. 修改1号数据的 salary 为 10000
  5. */
  6. @Test
  7. public void test1(){
  8. //2. 定义sql
  9. String sql = "update emp set salary = 10000 where id = 1001";
  10. //3. 执行sql
  11. int count = template.update(sql);
  12. System.out.println(count);
  13. }
  14. /**
  15. * 2. 添加一条记录
  16. */
  17. @Test
  18. public void test2(){
  19. String sql = "insert into emp(id,ename,dept_id) values(?,?,?)";
  20. int count = template.update(sql, 1015, "郭靖", 10);
  21. System.out.println(count);
  22. }
  23. /**
  24. * 3.删除刚才添加的记录
  25. */
  26. @Test
  27. public void test3(){
  28. String sql = "delete from emp where id = ?";
  29. int count = template.update(sql, 1015);
  30. System.out.println(count);
  31. }
  32. /**
  33. * 4.查询id为1001的记录,将其封装为Map集合
  34. * 注意:这个方法查询的结果集长度只能是1
  35. */
  36. @Test
  37. public void test4(){
  38. String sql = "select * from emp where id = ? or id = ?";
  39. Map<String, Object> map = template.queryForMap(sql, 1001,1002);
  40. System.out.println(map);
  41. //{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}
  42. }
  43. /**
  44. * 5. 查询所有记录,将其封装为List
  45. */
  46. @Test
  47. public void test5(){
  48. String sql = "select * from emp";
  49. List<Map<String, Object>> list = template.queryForList(sql);
  50. for (Map<String, Object> stringObjectMap : list) {
  51. System.out.println(stringObjectMap);
  52. }
  53. }
  54. /**
  55. * 6. 查询所有记录,将其封装为Emp对象的List集合
  56. */
  57. @Test
  58. public void test6(){
  59. String sql = "select * from emp";
  60. List<Emp> list = template.query(sql, new RowMapper<Emp>() {
  61. @Override
  62. public Emp mapRow(ResultSet rs, int i) throws SQLException {
  63. Emp emp = new Emp();
  64. int id = rs.getInt("id");
  65. String ename = rs.getString("ename");
  66. int job_id = rs.getInt("job_id");
  67. int mgr = rs.getInt("mgr");
  68. Date joindate = rs.getDate("joindate");
  69. double salary = rs.getDouble("salary");
  70. double bonus = rs.getDouble("bonus");
  71. int dept_id = rs.getInt("dept_id");
  72. emp.setId(id);
  73. emp.setEname(ename);
  74. emp.setJob_id(job_id);
  75. emp.setMgr(mgr);
  76. emp.setJoindate(joindate);
  77. emp.setSalary(salary);
  78. emp.setBonus(bonus);
  79. emp.setDept_id(dept_id);
  80. return emp;
  81. }
  82. });

  1. for (Emp emp : list) {
  2. System.out.println(emp);
  3. }
  4. }
  5. /**
  6. * 6. 查询所有记录,将其封装为Emp对象的List集合
  7. */
  8. @Test
  9. public void test6_2(){
  10. String sql = "select * from emp";
  11. List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
  12. for (Emp emp : list) {
  13. System.out.println(emp);
  14. }
  15. }
  16. /**
  17. * 7. 查询总记录数
  18. */
  19. @Test
  20. public void test7(){
  21. String sql = "select count(id) from emp";
  22. Long total = template.queryForObject(sql, Long.class);
  23. System.out.println(total);
  24. }
  25. }

JDBC连接池&JDBCTemplate的更多相关文章

  1. Java中JDBC连接池&JDBCTemplate

    数据库连接池 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归 ...

  2. JavaWeb——JDBC连接池&JDBCTemplate

    今日内容 1. 数据库连接池 2. Spring JDBC : JDBC Template 数据库连接池 1. 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容 ...

  3. 四大流行的jdbc连接池之C3P0篇

    C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSourc ...

  4. Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介

    日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...

  5. JDBC连接池-C池3P0连接

    JDBC连接池-C3P0连接 c3p0连接池的学习英语好的看英文原版      c3p0 - JDBC3 Connection and Statement Pooling 使用c3p0连接池  三种方 ...

  6. JDBC连接池(三)DBCP连接池

    JDBC连接池(三)DBCP连接池 在前面的随笔中提到 了  1.JDBC自定义连接池  2. C3P0连接池 今天将介绍DBCP连接池 第一步要导入jar包   (注意:mysql和mysql 驱动 ...

  7. JDBC连接池-自定义连接池

    JDBC连接池 java JDBC连接中用到Connection   在每次对数据进行增删查改 都要 开启  .关闭  ,在实例开发项目中 ,浪费了很大的资源 ,以下是之前连接JDBC的案例 pack ...

  8. Jmeter(九)JDBC连接池

    JDBC为java访问数据库提供通用的API,可以为多种关系数据库提供统一访问.因为SQL是关系式数据库管理系统的标准语言,只要我们遵循SQL规范,那么我们写的代码既可以访问MySQL又可以访问SQL ...

  9. jdbc连接池&改进dbUtil成C3P0Util

    一.jdbc连接池 1.连接池的存在理由   前面介绍的dbUtils工具类虽然实现了一个对jdbc的简单封装.但它依旧采取从驱动管理获取连接 (DriverManager.getConnection ...

随机推荐

  1. C语言学习之我见-strncmp()字符串比较函数(控制范围)

    strncmp()函数,用于范围内,两个字符串的比较,n表示最大比较范围. (1)函数原型 int strncmp(const char *_Str1,const char *_Str2,size_t ...

  2. CMU15445 之 Project#0 - C++ Primer 详解

    前言 这个实验主要用来测试大家对现代 C++ 的掌握程度,实验要求如下: 简单翻译一下上述要求,就是我们需要实现定义在 src/include/primer/p0_starter.h 中的三个类 Ma ...

  3. 全网求解,用Python处理一个基础题目

    昨天在群里看见一个Python的问题,趁着今天有那么一点点时间,就想把这个题目分享出来,让大家一起解决.毕竟三个臭皮匠,赛过诸葛亮.原始数据如下: 1 origin_lst = [0, 0, 1, 2 ...

  4. 全国降雨侵蚀力因子R值

      数据下载链接:百度云下载链接​ 降雨侵蚀力因子其实是反应降雨对土壤侵蚀的潜在能力,就是降雨的冲刷对土壤的侵蚀效应. 在过去几天查阅文献资料的过程中,本人亲眼看见过的关于因子R的计算方法就超过30种 ...

  5. Linux操作系统(5):网络命令

    Linux 网络环境配置①自动获取 缺点: linux 启动后会自动获取 IP,缺点是每次自动获取的 ip 地址可能不一样.这个不适用于做服务器,因为我们的服务器的 ip 需要时固定的. ②直 接 修 ...

  6. vue2升级vue3指南(一)—— 环境准备和构建篇

    1.nodejs和npm 注意二者的版本,版本过低需要升级,本人升级后的版本如下: $ node -v v16.15.1 $ npm -v 8.11.0 2.package.json 和依赖升级 由于 ...

  7. Identity Server 4资源拥有者密码认证控制访问API

    基于上一篇文章中的代码进行继续延伸,只需要小小的改动即可,不明白的地方可以先看看本人上一篇文章及源码: Identity Server 4客户端认证控制访问API 一.QuickStartIdenti ...

  8. YII自定义第三方扩展

    cat.php <?php /** * Created by PhpStorm. * Date: 2016/5/25 * Time: 15:23 */ namespace vendor\anim ...

  9. 后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_158 在之前的一篇文章中:为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统,详 ...

  10. 从-99打造Sentinel高可用集群限流中间件

    接上篇Sentinel集群限流探索,上次简单提到了集群限流的原理,然后用官方给的 demo 简单修改了一下,可以正常运行生效. 这一次需要更进一步,基于 Sentinel 实现内嵌式集群限流的高可用方 ...