JDBC连接池和DBUtils

连接池思想
  在数据库连接时,Connection资源非常珍贵,但又频繁被使用,所以创建一个容器来专门管理这些连接

使用连接池实现Connection复用:
  1.创建一个连接池对象
  2.连接池对象生成并管理若干连接
    (线程池中的线程是自己在线程池中使用线程,使用之后线程池将线程回收给后面的线程使用)
    (连接池对象自己生成连接对象,我们使用时直接从连接池得到连接对象)(线程池是先使用线程,在交给线程池管理,一个是连接池先创建连接,在给使用)

  3.当与数据库交互时,从连接池获取连接
  4.连接使用完,以前是直接释放,现在直接存回连接池
  5.存回连接池的目的是供下次使用

  优点:
    A.实现Connection的复用
    B.效率更高

Java中常用的数据库连接池实现(管理程序与数据库的连接)
  C3p0 ----- 用xml配置文件规范
  DBCP ----- 用properties配置文件规范

C3p0连接池使用
  A:必须下载相关jar包
    连接池管理连接的,必须还得导入mysql与java连接的jar包才能正常使用
  B:创建连接池对象,传入相关的配置信息(具体要使用哪一种配置的连接池)
    必须配置的四个配置项(驱动名,url,账号,密码)
    可选配置项,连接的管理策略----初始化连接个数,最大连接数,空闲时的最小连接数......
  C:从连接池对象取连接,并使用
  D:将连接存回连接池
C3p0总结
  1.导包
  2.配置文件直接复制到src下面,注意必须在src下,且文件名不能修改
   固定:c3p0-config.xml  因为解析原码被底层封装
  3.创建连接池对象
    DataSource ds = new ComboPooledDataSource();
    底层实现:
      A:自动读取并解析配置文件
      B:根据解析的数据创建若干连接
        解析c3po-config.xml
        用集合嵌套进行解析
          Map<String(name-config的属性),HashMap<String(property的属性),String(property的文本)>>
          内层HashMap中存的是,元素属性值,元素文本值(连接池的具体配置信息)
          外层Map中存储的是具体使用哪一条配置信息来创建相应的连接池
   4.获取连接 使用
     ds.getConnection(); 从连接池取出一个连接
   5.连接用完之后存回连接池
     con.close(); 这是使用的连接池重写之后的Close方法,将连接放回,没有释放  其它使用的资源需要释放
  特点:资源复用,效率高,底层实现隐藏
C3p0解析配置文件时,配置文件中可以有多套配置信息
  default-config(默认配置,只能有一个)和named-config(命名配置,可以0或多个)
  使用方法:
    DataSource ds = new ComboPooledDataSource; //默认配置
    DataSource ds = new ComboPooledDataSource("配置文件中对应的name的值")
    常用的配置最好放在xml的前面,因为xml解析存在效率问题
    C3p0的配置也可以使用编码的方式完成,但因为是硬代码,灵活性太差

DBCP
  A:导入jar包
  B:创建连接池对象
    1.导入配置文件
    2.创建输入流以及Properties集合,将数据读入集合(通过类加载器中的方法直接读src目录下面的文件)
    3.DataSource ds = BasicDataSourceFactory.createDataSource(集合)
  C:获取并使用连接
    Connection con = ds.getConnection()
  D:存回连接池
    con.close()
    抽取数据库连接池工具类,不用每次都创建一个连接池

DBUtils:
  和连接池一起使用,封装了一系列的“处理对象”处理和“结果”处理
  JavaBean书写规范
    A:必须有包
    B:必须实现序列化接口
    C:属性私有,提供公共的访问方式
    D:必须提供无参构造public
  使用:
    A:QueryRunner qr = new QueryRunner(数据库连接池对象)  
    B:查询操作
      qr.query(参数1,参数2,参数3)
        参数1 —— SQL语句
        参数2 —— 结果集(需要的代理对象)
        参数3 —— 补齐SQL语句的参数(占位符的值)(底层使用预处理对象preparedStatement)
    C:封装连接返回线程池
实现细节:
    1:QueryRunner 执行SQL语句时,会从数据库连接池取出一个连接
      使用完,自己将连接存回线程池
    2:查询时,query("SQL语句",new BeanListHandler<泛型>(反射对象),[占位符参数])
      此条代理对象返回的是一个List<JavaBean>集合,存储每一条数据所对应的对象
      BeanListHandler怎么代理我们执行的?
        A:BeanListHandler 中的泛型决定了返回的集合的泛型
        B:根据反射对象获取无参构造,创建对象
        C:取出表记录中的字段名和字段值,利用反射和方法名拼接,为对象赋值
        D:将对象存入集合然后返回

    代理对象:
      BeanHandler        将单条记录(多条记录的情况下,第一天记录)组装成JavaBean对象
      ArrayHandler       将单条记录(多条数据选取第一条)的每一个字段值存储进一个Object数据
      ArrayListHandler      将每一条记录的每一个字段值存为一个数组,将所有数组存进集合
      ScalarHandler      查询单个结果(聚合函数)
      ColumanListHandler  将某一列的值存入一个集合
      MapHandler        将第一条记录的字段名作为键,字段值作为值存入一个Map集合
      MapListHandler     将每一条记录转换成Map,再将Map存入List选一个值作为Map集合所对应键,然后值为其对应的Map字段名字段值集合
      KeyedHandler       选一个值作为Map集合所对应键,然后值为其对应的Map字段名字段值集合
  增删改操作使用update方法,返回Long
    Long line = qr.update(sql, params);

如果创建QueryRunner的时候没有传入连接词对象

    List<User> rs = qr.query(C3p0Utils.getDs().getConnection(), sql, new BeanListHandler<User>(User.class));

池:
  字符串常量池
  包装类缓存池
  数据库连接池
  线程池
  音乐池
资源复用,效率高

原文地址:https://www.cnblogs.com/chonglchong/p/6736517.html