zoukankan      html  css  js  c++  java
  • 11.2_数据库连接池&DBUtils

    一、数据库连接池

      1. 数据库的连接对象创建工作,比较消耗性能。

      2.一开始现在内存中开辟一块空间(集合) , 一开先往池子里面放置 多个连接对象。 后面需要连接的话,直接从池子里面去。不要去自己创建连接了。 使用完毕, 要记得归还连接。确保连接对象能循环利用。

        

    二、开源连接池

      1.DBCP

        1. 导入jar文件

        2. 不使用配置文件:

        public void testDBCP01(){
          Connection conn = null;
          PreparedStatement ps = null;
          try {

            1. 构建数据源对象
              BasicDataSource dataSource = new BasicDataSource();
              连的是什么类型的数据库, 访问的是哪个数据库 , 用户名, 密码。。
              jdbc:mysql://localhost/bank 主协议:子协议 ://本地/数据库
              dataSource.setDriverClassName("com.mysql.jdbc.Driver");
              dataSource.setUrl("jdbc:mysql://localhost/bank");
              dataSource.setUsername("root");
              dataSource.setPassword("root");

            2. 得到连接对象
              conn = dataSource.getConnection();
              String sql = "insert into account values(null , ? , ?)";
              ps = conn.prepareStatement(sql);
              ps.setString(1, "admin");
              ps.setInt(2, 1000);
              ps.executeUpdate();
              } catch (SQLException e) {
                e.printStackTrace();
              }finally {
                JDBCUtil.release(conn, ps);
               }

            }

          2. 使用配置文件方式:


            Connection conn = null;
            PreparedStatement ps = null;
              try {
                BasicDataSourceFactory factory = new BasicDataSourceFactory();
                Properties properties = new Properties();
                InputStream is = new FileInputStream("src//dbcpconfig.properties");
                properties.load(is);
                DataSource dataSource = factory.createDataSource(properties);

          得到连接对象
            conn = dataSource.getConnection();
            String sql = "insert into account values(null , ? , ?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, "liangchaowei");
            ps.setInt(2, 100);
            ps.executeUpdate();

            } catch (Exception e) {
              e.printStackTrace();
            }finally {
              JDBCUtil.release(conn, ps);
            }


      2.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");

          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

      1.增删改

        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);

      2.查询

        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));

        ResultSetHandler 常用的实现类
          以下两个是使用频率最高的

          BeanHandler, 查询到的单个数据封装成一个对象
          BeanListHandler, 查询到的多个数据封装 成一个List<对象>

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

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


          ColumnListHandler
          KeyedHandler
          ScalarHandler

  • 相关阅读:
    环形数组求最大子数组
    教学楼电梯调度需求分析
    结对编程实践扩展
    《梦断代码》读书笔记
    CS小分队第二阶段冲刺站立会议(5月30日)
    CS小分队第二阶段冲刺站立会议(5月29日)
    CS小分队第二阶段冲刺站立会议(5月28日)
    第一阶段冲刺个人总结
    CS小分队第二阶段冲刺站立会议(5月27日)
    CS小分队第二阶段冲刺站立会议(5月26日)
  • 原文地址:https://www.cnblogs.com/zyyzy/p/12571271.html
Copyright © 2011-2022 走看看