JDBC使用DBUtils

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> JDBC使用DBUtils

点击蓝字“程序员考拉”欢迎关注!

JDBC使用DBUtils

1.commons-dbutils

commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。

commons-dbutilsAPI包括:

  • org.apache.commons.dbutils.QueryRunner
  • org.apache.commons.dbutils.ResultSetHandler
  •   工具类

  • org.apache.commons.dbutils.DbUtils
  •  

    2.QueryRunner类

    该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。

    QueryRunner类提供了两个构造方法:

  • 默认的构造方法;
  • 需要一个 javax.sql.DataSource 来作参数的构造方法。
  • QueryRunner类的主要方法:

    JDBC使用DBUtils

    执行一个不需要置换参数的查询操作。

     

    JDBC使用DBUtils

    执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数

     

    JDBC使用DBUtils

    用来执行一个更新(插入、更新或删除)操作。

     

    JDBC使用DBUtils

     用来执行一个不需要置换参数的更新操作。

     

    2.1 使用DBUtils进行更新操作,更新操作可用于insert,update,delete.

    
    public void testQueryRunnerUpdate() {
      QueryRunner queryRunner=new QueryRunner();
      Connection connection=null;
      String sql="DELETE FROM USERS WHERE ID IN (?,?)";
      try{
        connection=JDBCTools.getConnection();
        queryRunner.update(connection,sql,1,2);
      }catch(Exception e){
        e.printStackTrace();
      }finally{
        JDBCTools.release(null, null, connection);
      }
    }
    

    数据库连接和释放工具类 JDBCTools.java

    
    //获取数据库的连接
    @Test
    public static Connection getConnection() throws Exception{
      String driverClass=null;
      String jdbcUrl=null;
      String user=null;
      String password=null;
      
      InputStream in=JDBCTools.class.getResourceAsStream("/jdbc.properties");
      Properties properties=new Properties();
      properties.load(in);
      
      driverClass=properties.getProperty("driver");
      jdbcUrl=properties.getProperty("jdbcUrl");
      user=properties.getProperty("user");
      password=properties.getProperty("password");
      
      Class.forName(driverClass);
      Connection connection=DriverManager.getConnection(jdbcUrl,user,password);
      return connection;
      
    }
    @Test 
    public void testGetConnection() throws Exception{
      getConnection();
      
    }
    //数据库释放
    public static void release(ResultSet resultset,Statement statement,Connection connection){
        if(statement!=null){
        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        }
        if(connection!=null){
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
        if(resultset!=null){
            try {
              resultset.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            }
    }
    

    3.使用DBUtils进行查询操作

    
    @Test
    public void testQuery(){
      Connection connection=null;
      try{
        connection=JDBCTools.getConnection();
        String sql="SELECT id,name,email,birth FROM CUSTOMER";
        Object obj=queryRunner.query(connection, sql, new MyResultSetHandler());
        System.out.println(obj);
      }catch(Exception e){
        e.printStackTrace();
      }finally{
        JDBCTools.release(null, null, connection);
      }
    }
    
    //QueryRunner的返回值取决于ResultSetHandler的返回值
      QueryRunner queryRunner=new QueryRunner();
      class MyResultSetHandler implements ResultSetHandler{
        @Override
        public Object handle(ResultSet resultset) throws SQLException {
          ListCustomer customers=new ArrayListCustomer();
          while(resultset.next()){
            Integer id=resultset.getInt(1);
            String name=resultset.getString(2);
            String email=resultset.getString(3);
            Date date=resultset.getDate(4);
            Customer customer=new Customer(id,name,email,date);
            customers.add(customer);
          }
          return customers;
        } 
      }
    

    4.ResultSetHandler接口的实现类

    4.1 BeanHandler

    把结果集的第一条记录转为创建BeanHandler对象时传入的Class参数对应的对象。

    示例代码:

    
    public void testBeanHandler() {
      Connection connection=null;
      try{
        connection=JDBCTools.getConnection();
        String sql="SELECT ID,NAME,EMAIL,BIRTH FROM CUSTOMER WHERE ID=?";
        Customer customer=(Customer) queryRunner.query(connection,sql,new BeanHandler(Customer.class),2);
        System.out.println(customer);
      }catch(Exception e){
        e.printStackTrace();
        }finally{
          JDBCTools.release(null, null, connection);
        }
    }
    

    运行结果返回:

    
    Customer [id=2, name=Winda, email=3455345466@163.com, birth=1995-02-14]
    

    4.2 BeanListHandler

    将结果集中的每一条数据都封装到一个对应的JavaBean实例中,存放到List里。

    
    public void testBeanListHandler(){
      Connection connection=null;
      try{
        connection=JDBCTools.getConnection();
        String sql="SELECT ID,NAME,EMAIL,BIRTH FROM CUSTOMER";
        ListCustomer customers=(ListCustomer) queryRunner.query(connection,sql,new BeanListHandler(Customer.class));
        System.out.println(customers);
      }catch(Exception e){
        e.printStackTrace();
        }finally{
          JDBCTools.release(null, null, connection);
        }
    }
    

    返回结果为:

    
    [Customer [id=1, name=Tom, email=231233134@163.com, birth=1983-09-11], Customer [id=2, name=Winda, email=3455345466@163.com, birth=1995-02-14], Customer [id=3, name=A, email=5534565656@163.com, birth=1995-06-23], Customer [id=4, name=B, email=9444532232@163.com, birth=1992-03-11], Customer [id=5, name=C, email=4234412132@163.com, birth=1996-09-14], Customer [id=6, name=D, email=5634645645@163.com, birth=1990-09-19]]
    

    4.3 MapHandler

    返回SQL对应的第一条记录对应的Map对象。键对应列名,值对应列的值。

    示例代码:

    
    public void testMapHandler(){
      Connection connection=null;
      try{
        connection=JDBCTools.getConnection();
        String sql="SELECT ID,NAME,EMAIL,BIRTH FROM CUSTOMER";
        MapString,Object result= queryRunner.query(connection,sql,new MapHandler());
        System.out.println(result);
      }catch(Exception e){
        e.printStackTrace();
        }finally{
          JDBCTools.release(null, null, connection);
        }
    }
    

    返回结果:

    
    {ID=1, BIRTH=1983-09-11, EMAIL=231233134@163.com, NAME=Tom}
    

    4.4 MapListHandler

    将结果集中的每一行数据都封装到一个Map里,然后再存放到List。

    
    public void testMapListHandler(){
      Connection connection=null;
      try{
        connection=JDBCTools.getConnection();
        String sql="SELECT ID,NAME,EMAIL,BIRTH FROM CUSTOMER";
        ListMapString,Object result= queryRunner.query(connection,sql,new MapListHandler());
        System.out.println(result);
      }catch(Exception e){
        e.printStackTrace();
        }finally{
          JDBCTools.release(null, null, connection);
        }
    }
    

    4.5 ScalarHandler

    把结果集转为一个数值返回,这个数值可以是任意类型和String,Date等。

    
    public void testScalarHandler(){
      Connection connection=null;
      try{
        connection=JDBCTools.getConnection();
        String sql="SELECT NAME FROM CUSTOMER WHERE ID=?";
        Object result= queryRunner.query(connection,sql,new ScalarHandler(),2);
        System.out.println(result);
      }catch(Exception e){
        e.printStackTrace();
        }finally{
          JDBCTools.release(null, null, connection);
        }
    }
    

     

    JDBC使用DBUtils
    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    转载声明:转载请注明出处,本技术博客是本人原创文章

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> JDBC使用DBUtils


      转载请注明: 好好学java JDBC使用DBUtils

     上一篇
    数据库事务 数据库事务
    点击蓝字“程序员考拉”欢迎关注! 1.JDBC处理事务 数据库事务是一组逻辑操作单元,使数据从一种状态变换到另一种状态。为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元,当它全部完成时,数据的一致性可以保持,而当这
    下一篇 
    数据库两大必备神器——索引和锁底层原理是什么! 数据库两大必备神器——索引和锁底层原理是什么!
    一、索引 在之前,我对索引有以下的认知: 索引可以加快数据库的检索速度; 表经常进行INSERT/UPDATE/DELETE操作就不要建立索引了,换言之:索引会降低插入、删除、修改等维护任务的速度; 索引需要占物理和数据空间;