数据库连接池相关c3p0及DBUtils的使用

1. 数据库的连接对象创建工作比较消耗性能
2. 先在内存中开辟一块空间(集合),往池子里放置多个连接对象,需要连接时,直接在池子里取,不用自己创建连接。
3. 使用完毕归还连接,确保连接对象能循环利用

开源连接池:

  • DBCP
    (DataBase Connection Pool)数据库连接池,java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开
  • C3P0
    一个开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展,目前使用它的开源项目有Hibernate,Spring 等

c3p0的使用

  • 拷贝jar文件到lib目录

  • 不使用配置文件的方式

      Connection conn = null;
      PreparedStatement ps = null;
      try {
      	//1. 创建datasource
      	ComboPooledDataSource dataSource = new ComboPooledDataSource();
      	//2. 设置连接数据的信息
      	dataSource.setDriverClass("com.mysql.jdbc.Driver");
      	
      	//忘记了---> 去以前的代码 ---> jdbc的文档
      	dataSource.setJdbcUrl("jdbc:mysql://localhost/bank");
      	dataSource.setUser("root");
      	dataSource.setPassword("root");
      	
      	//2. 得到连接对象
      	conn = dataSource.getConnection();
      	String sql = "insert into account values(null , ? , ?)";
      	ps = conn.prepareStatement(sql);
      	ps.setString(1, "admi234n");
      	ps.setInt(2, 103200);
      	
      	ps.executeUpdate();
      	
      } catch (Exception e) {
      	e.printStackTrace();
      }finally {
      	JDBCUtil.release(conn, ps);
      }
    
  • 使用配置文件方式

      //默认会找 xml 中的 default-config 分支。 
      	ComboPooledDataSource dataSource = new ComboPooledDataSource();
      	//2. 设置连接数据的信息
      	dataSource.setDriverClass("com.mysql.jdbc.Driver");
      	
    
      	//忘记了---> 去以前的代码 ---> jdbc的文档
      	dataSource.setJdbcUrl("jdbc:mysql://localhost/bank");
      	dataSource.setUser("root");
      	dataSource.setPassword("root");
      	
      	//2. 得到连接对象
      	conn = dataSource.getConnection();
      	String sql = "insert into account values(null , ? , ?)";
      	ps = conn.prepareStatement(sql);
      	ps.setString(1, "admi234n");
      	ps.setInt(2, 103200);	
    

DBUtils

//dbutils 只是帮我们简化了CRUD 的代码, 但是连接的创建以及获取工作。 不在他的考虑范围
  • 增删改

      QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
    
      //增加
      //queryRunner.update("insert into account values (null , ? , ? )", "aa" ,1000);
      
      //删除
      //queryRunner.update("delete from account where id = ?", 5);
      
      //更新
      //queryRunner.update("update account set money = ? where id = ?", 10000000 , 6);
    
  • 查询

    1. 直接new接口的匿名实现类

       QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
      
       Account  account =  queryRunner.query("select * from account where id = ?", new ResultSetHandler<Account>(){
      
       @Override
       public Account handle(ResultSet rs) throws SQLException {
       	Account account  =  new Account();
       	while(rs.next()){
       		String name = rs.getString("name");
       		int money = rs.getInt("money");
       		
       		account.setName(name);
       		account.setMoney(money);
       	}
       	return account;
       }
        
        }, 6);
       
       System.out.println(account.toString());
      

      2.直接使用框架已经写好的实现类。

      • 查询单个对象

          QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
           //查询单个对象
           Account account = queryRunner.query("select * from account where id = ?", 
          new BeanHandler<Account>(Account.class), 8);
        
      • 查询多个对象

          QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
          List<Account> list = queryRunner.query("select * from account ",
          new BeanListHandler<Account>(Account.class));	
        
  • DBUtils常用实现类

      以下两个是使用频率最高的
    
      BeanHandler,  查询到的单个数据封装成一个对象
      BeanListHandler, 查询到的多个数据封装 成一个List<对象>
    

      ArrayHandler,  查询到的单个数据封装成一个数组
      ArrayListHandler,  查询到的多个数据封装成一个集合 ,集合里面的元素是数组。 
      MapHandler,  查询到的单个数据封装成一个map
      MapListHandler,查询到的多个数据封装成一个集合 ,集合里面的元素是map。 
    

猜你喜欢

转载自blog.csdn.net/weixin_43875648/article/details/88417245