JDBC02(DBCP连接池、C3P0连接池、DBUtils框架)

Part01:JDBC连接池

1、JDBC连接池:

  • 存放多个连接的集合,要用到连接时直接从连接池里面拿;
  • 目的:解决建立数据库连接耗费资源和时间的问题,提高性能;

2、DataSource:数据源(编写连接池的规范)

  • Java为数据连接池提供了公共的接口:java.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池;
  • 常见的连接池:DBCP、C3P0

3、DBCP连接池:

  • 导入jar包:
    在这里插入图片描述

  • 实现DataSource接口的实现类为:BasicDataSource

  • DBCP使用:

    //创建连接池实现类对象
      private static BasicDataSource bds = new BasicDataSource();
      //设置连接池实现类对象的四大要素
      static {
          bds.setDriverClassName(driverName);
          bds.setUrl(url);
          bds.setUsername(userName);
          bds.setPassword(password);
      }
    //返回一个连接池对象,
    bds.getConnection();
    
  • 带配置文件的DBCP使用:

    • 核心类:BasicDataSourceFactory
      • 静态方法:public static DataSource createDataSource(Properties properties);//自动解析properties配置文件,把四大要素自动设置给DataSource数据源,并返回DataSource数据源实现类对象

        //创建连接池对象
        private static DataSource ds = null;
          //自动解析配置文件,自动设置连接池对象的四大要素,返回连接池对象
          static {
              try {
                  Properties properties = new Properties();
                  //把配置文件放到项目根目录下时
                 properties.load(new FileInputStream("dbcpconfig.properties"));
        
                  //把配置文件放到src目录下时,getClassLoader()获取类加载器,getResourceAsStream(""),把资源转成流,默认路径src根目录    properties.load(DBCPUtils_config.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
          
                  ds = BasicDataSourceFactory.createDataSource(properties);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
          //返回一个连接池对象,
          ds.getConnection();
        

配置文件:
JDBC02(DBCP连接池、C3P0连接池、DBUtils框架)_第1张图片

4、C3P0连接池:

  • 目前使用它的开源项目有:Spring、Hibernate等

  • 导入jar包:
    JDBC02(DBCP连接池、C3P0连接池、DBUtils框架)_第2张图片

  • 实现DataSource接口的实现类为:ComboPooledDataSource

  • 带配置文件的C3P0使用:C3P0会自动加载配置文件c3p0-config.xml

      public class C3P0Utils {
          //创建连接池对象
          private static ComboPooledDataSource ds = new ComboPooledDataSource();
          public static Connection getConnection() throws SQLException {
              //获取连接,从C3P0连接池获取
              return ds.getConnection();
          }
          //关闭资源
          public static void closeAll(Connection con, Statement st, ResultSet rs){
              if(con != null){
                  try {
                      con.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
              if(st != null){
                  try {
                      st.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
              if(rs != null){
                  try {
                      rs.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
          }
      }
    

配置文件:
JDBC02(DBCP连接池、C3P0连接池、DBUtils框架)_第3张图片

Part02:DBUtils框架
1、DBUtils框架:

  • 简化JDBC代码开发,封装了增删改查操作

  • 常用类:

    • DBUtils类:主要负责关闭连接,释放资源,开启事务等操作;
    • QueryRunner:负责对数据库的CURD操作;(核心类)
    • ResultSetHandler:结果集处理类,复制处理结果集(封装数据);
      2、DBUtils的使用:
  • 导入jar包:

  • QueryRunner类的使用

    • 构造:

      • QueryRunner(DataSource ds);//需要一个连接池
      • QueryRunner( );//不需要一个连接池,用来事务操作
    • 方法:

      • int update(String sql, Object… params);//主要执行增删改;
      • query(String sql,ResultSetHandler rsh,Object… params);//主要执行查询;
    • 使用:

        //创建QueryRunner对象,给定连接池对象
        QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
        //自动获取连接,执行者对象,自动关闭连接,返回受影响行数
        //第一个参数为sql语句,第二个参数为可变参数(也可写成Object数值形式),为sql语句中的?赋值
        int rows = qr.update("insert into student (sid,sname) value (?,?)",5,"王五");
        System.out.println(rows);
      
        //C3P0Utils类中:
        //创建连接池对象
        private static ComboPooledDataSource ds = new ComboPooledDataSource();
        //返回连接池对象
        public static DataSource getDataSource(){
            return ds;
        }
      
  • ResultSetHandler:结果集处理接口

    • 实现类
      • ArrayHandler:将结果集中第一条记录封装到一个object[]数组中,数组中的每一个元素就是这条记录中每一个字段的值;

      • ArrayListHandler:将结果集中每一条记录都封装到一个object[]数组中,将这些数组封装到list集合中;

      • BeanHandler:将结果集中第一条记录封装到一个指定的JavaBean对象中。

      • BeanListHandler:将结果集中每一条记录都封装到一个指定的JavaBean对象中,将这些JavaBean对象封装到list集合中;

      • 注意⚠️:JavaBean中的属性要和数据库中的字段一一对应(BeanHandler/BeanListHandler底层通过反射实现)

      • ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合中。

      • KeyedHandler:将结果集中每一条记录封装到Map集合中,再将这个map集合作为另一个Map的value,另一个Map集合的key是指定的字段的值;

      • MapHandler:将结果集中第一条记录封装到Map集合中,key就是字段名称,value就是字段值;

      • MapListHandler:将结果集中每一条记录封装到Map集合中,key就是字段名称,value就是字段值,再将这些Map封装到List集合中;

      • ScalarHandler:用于单个数据。例如:select count(*) from 表操作;
        //创建QueryRunner对象,给定C3P0连接池

        QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
        
        
        
        //ArrayHandler的使用
          String sql = "select * from student where sid = ?";
          Object[] pramas = {1};
          Object[] objects=qr.query(sql,new ArrayHandler(),pramas);
          for (Object obj:objects
               ) {
              System.out.println(obj);
          }
          
          //ArrayListHandler的使用
          String sql = "select * from student";
          List objects=qr.query(sql,new ArrayListHandler());
          for (Object[] obj:objects
               ) {
              System.out.println(obj[0]+"\t"+obj[1]);
          }
          
          //BeanHandler的使用
          String sql = "select * from student";
          Student student = qr.query(sql,new BeanHandler(Student.class));
          System.out.println(student);
          
          //BeanListHandler的使用
          String sql = "select * from student";
          List list= qr.query(sql,new BeanListHandler(Student.class));
          for (Student s:list
               ) {
              System.out.println(s);
          }
          
          //ColumnListHandler的使用
          String sql = "select * from student";
          List list= qr.query(sql,new ColumnListHandler<>("sid"));
              System.out.println(list);
          
            //MapHandler的使用
            String sql = "select * from student";
            Map map= qr.query(sql,new MapHandler());
              System.out.println(map);
        
          //MapListHandler的使用
          String sql = "select * from student";
          List> maps = qr.query(sql, new MapListHandler());
          System.out.println(maps);
          
          //ScalarHandler的使用
          String sql = "select count(*) from student";
          Object count = qr.query(sql, new ScalarHandler<>());
          System.out.println(count);
          
                
              
           
          
        
                                    
                                
                            
                            
                            

        你可能感兴趣的:(JDBC)