美文网首页
JDBC连接池 和 JDBC Template

JDBC连接池 和 JDBC Template

作者: sunboximeng | 来源:发表于2018-06-27 16:41 被阅读8次

每一次 web 请求都要建立一次数据库连接。大型电子商务网站,同时有几千人在线是很正常的事。在这种情况下,频繁的进行数据库连接与断开会造成性能低下。

java中规定的数据库连接池接口:DataSource。由数据库厂商来实现,常用的数据库连接池实现有:C3P0 和 Druid。

数据库连接池使用步骤:
  • 导 jar 包
  • 设置或加载配置文件
    • C3P0
      名称: c3p0.properties 或者 c3p0-config.xml
      路径:src目录下。会自动加载,只需按需修改配置文件中对于池对象参数的设置。
      需要复习一下参数的意义。
    • Druid
      properties类型,可以叫任意名称,可以放在任意目录下 (所以不会自动加载了)。
      需要利用Properties类加载配置文件。推荐放在src目录下,用类加载器就能方便的找到,因此参数不用管文件路径,只要文件名字即可。
  • 创建池对象
    • C3P0
      DataSource ds = new ComboPooledDataSource(); 空参就使用默认配置。传字符串表示使用配置文件中的其他配置。
    • Druid
      DataSource ds = DruidDataSourceFactory.createDataSource(pro); pro就是个集合。
  • 从池对象中获取数据库连接对象:Connection conn = ds.getConnection();

利用工具类 JDBCUtils 对上述步骤进行封装:

public class JDBCUtils {

    //1.定义成员变量 DataSource
    private static DataSource ds ;

    //利用静态代码创建一个池对象。有了数据库连接池,就不存在注册驱动的问题了。
    static{
        try {
            //1.加载配置文件
            Properties pro = new Properties();
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //2.获取DataSource
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     */
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    /**
     * 释放资源
     */
    public static void close(Statement stmt,Connection conn){

       close(null,stmt,conn);
    }


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


        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


        if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(conn != null){
            try {
                conn.close();//归还连接
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取连接池
     */

    public static DataSource getDataSource() {
        return  ds;
    }

}

Spring JDBC

针对 JDBCUtils 简化不了的,SQL操作的部分,进行自动化处理。

  • 导入jar包
  • 创建JdbcTemplate对象。依赖于数据源DataSource
    JdbcTemplate template = new JdbcTemplate(ds);
  • 调用JdbcTemplate的方法来完成SQL操作
    • 增删改:update(String sql, sql中的参数)
      String sql = "insert into emp(id,ename,dept_id) values(?,?,?)";
      int count = template.update(sql, 1015, "郭靖", 10); //传参比 PreparedStatement 简单
      
    • 查:
      精华:把结果集自动封装成对象。
      • 行数据 --> Map,列名为key,值为value:
        一行:Map<String, Object> queryForMap(String sql, sql中的参数)
        多行:List<Map<String, Object>> queryForList(String sql, sql中的参数)
      • 行数据 --> T对象:List<T> query(String sql, sql中的参数, RowMapper<T> rm)
        自己决定映射方式:使用 RowMapper,重写其方法实现结果集到对象的映射
        String sql = "select * from emp";
        List<Emp> list = template.query(sql, new RowMapper<Emp>() {
        
          @Override
          public Emp mapRow(ResultSet rs, int i) throws SQLException {
              Emp emp = new Emp();
              int id = rs.getInt("id");
              String ename = rs.getString("ename");
              int job_id = rs.getInt("job_id");
              int mgr = rs.getInt("mgr");
              Date joindate = rs.getDate("joindate");
              double salary = rs.getDouble("salary");
              double bonus = rs.getDouble("bonus");
              int dept_id = rs.getInt("dept_id");
        
              emp.setId(id);
              emp.setEname(ename);
              emp.setJob_id(job_id);
              emp.setMgr(mgr);
              emp.setJoindate(joindate);
              emp.setSalary(salary);
              emp.setBonus(bonus);
              emp.setDept_id(dept_id);
        
              return emp;
          }
        });
        
        
        for (Emp emp : list) {
          System.out.println(emp);
        }
        
        利用字节码文件自动映射:List<T> query(String sql, sql中的参数, BeanPropertyRowMapper<Emp> bprm)
        BeanPropertyRowMapper的意思:数据表的行映射为Java Bean对象的属性
        String sql = "select * from emp";
        List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp> (Emp.class));
        for (Emp emp : list) {
          System.out.println(emp);
        }
        
      • 聚合函数:queryForObject()
        String sql = "select count(id) from emp";
        Long total = template.queryForObject(sql, Long.class);
        

相关文章

  • 二、数据库连接池

    本章内容 数据库连接池 Spring JDBC : JDBC Template 一、数据库连接池 概念:其实就是一...

  • JDBC连接池&JDBCTemplate学习笔记

    大纲 数据库连接池 Spring JDBC : JDBC Template 数据库连接池 概念:其实就是一个容器(...

  • 数据库连接池

    今日内容 数据库连接池 Spring JDBC : JDBC Template 数据库连接池 1、概念:其实就是一...

  • JDBC连接池 和 JDBC Template

    每一次 web 请求都要建立一次数据库连接。大型电子商务网站,同时有几千人在线是很正常的事。在这种情况下,频繁的进...

  • JDBC连接池和Template

    数据库连接池 概念:其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些...

  • JAVAEE——JDBC连接池&DBUtils

    JDBC连接池&DBUtils 使用连接池改造JDBC的工具类: 1.1.1 需求: 传统JDBC的操作,对连接的...

  • JDBC进阶学习笔记

    JDBC进阶 JDBC连接池 1. 常见的JDBC连接池 c3p0 开源连接池 druid 阿里的开源数据库连接池...

  • Spring中使用JDBC Template访问数据库

    简介 为了简化持久化操作,Spring在JDBC API之上提供了JDBC Template组件。 JDBC Te...

  • C3P0、DBCP连接池

    C3P0连接池 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的...

  • JDBC Template

    JDBC Template 其实有比 JDBC Template 更好的操作数据库的框架(如 Mybatis),但...

网友评论

      本文标题:JDBC连接池 和 JDBC Template

      本文链接:https://www.haomeiwen.com/subject/dwibyftx.html