• Apache commons-dbutils工具简介说明


    转自:

    Apache commons-dbutils工具简介说明

    下文笔者讲述Apache commons-dbutils工具简介说明,如下所示

    commons-dbutils简介

    commons-dbutils
      是Apache提供的一个开源JDBC工具类库
      它是对JDBC的简单封装
      学习成本极低
      并且使用dbutils能极大简化jdbc编码的工作量
       同时也不会影响程序的性能
    

    commons-dbutils API介绍

    org.apache.commons.dbutils.QueryRunner
    org.apache.commons.dbutils.ResultSetHandler
    

    工具类

    org.apache.commons.dbutils.DbUtils
    

    commons-dbutils下载方法

    https://commons.apache.org/proper/commons-dbutils/
    

    DbUtils类介绍

    DbUtils类的功能:
      提供一些操作方法:
        如关闭连接、装载JDBC驱动程序等常规工作的工具类
    注意事项:
       里面的所有方法都是静态的(关闭资源、加载驱动)
      
    常见的方法如下所示:
       public static void close(…) throws java.sql.SQLException
          DbUtils类提供了三个重载的关闭方法
         这些方法检查所提供的参数是不是NULL
          当参数为非null时,则关闭Connection、Statement和ResultSet。
    
       public static void closeQuietly(…)
           此方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭
            还能隐藏一些在程序中抛出的SQLException 
    
       public static void commitAndCloseQuietly(Connection conn);
           用于提交连接
           然后关闭连接
          并且在关闭连接时不抛出SQL异常。
    
        public static boolean loadDriver(java.lang.String driverClassName)
          装载并注册JDBC驱动程序
          如果成功就返回true
          使用该方法,无需捕捉这个异常ClassNotFoundException。
    

    QueryRunner

    该类简单化SQL查询
       它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作
        能够大大减少编码量
        此类中定义了所有的与数据库操作的方法(查询、更新)
    

    QueryRunner类提供两个构造方法

     默认的构造方法
      需要一个 javax.sql.DataSource 来作参数的构造方法
    

    QueryRunner类的主要方法

    public Object query(Connection conn,String sql,Object[] params, ResultSetHandler rsh)
      throws SQLException
      执行一个查询操作
      在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数
      该方法会自行处理 PreparedStatement和ResultSet的创建和关闭。
    
    public Object query(String sql,Object[] params, ResultSetHandler rsh) throws SQLException:
       与上一个方法的不同之处在于它不将数据库连接提供给方法
      并且它是从提供给构造方法的数据源(DataSource)
        或使用setDataSource 方法中重新获得 Connection。
    
    public Object query(Connection conn,String sql, ResultSetHandler rsh) throws SQLException
        执行一个不需要置换参数的查询操作
    
    public int update(Connection conn, String sql,Object[] params) throws SQLException
        用于执行一个更新(插入、更新或删除)操作 
    
    public int update(Connection conn, String sql) throws SQLException
        用于执行一个不需要置换参数的更新操作。
    

    ResultSetHandler接口

    该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
     ResultSetHandler接口提供了一个单独的方法:Object
     handle (java.sql.ResultSet  rs)
    

    ResultSetHandler接口的实现类

    ArrayHandler:把结果集中的第一行数据转成对象数组
    ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中
    BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中
    BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里
    ColumnListHandler(列名):将结果集中某一列的数据存放到List中
    KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key
    MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值
    MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
    


    JdbcUtils类编写

    package Utils;
    import java.sql.*;
    /**
    * 1. 返回连接 2. 关闭
    *
    * @author java265.com
    *
    */
    
    public class JdbcUtils {
    
    // 连接参数
        // private String url = "jdbc:mysql://localhost:3306/jdbc_demo";
        private static Stringurl ="jdbc:mysql://192.168.8.245:3306/testdb";
    
    private static Stringuser ="root";
    private static Stringpassword ="123456";
    
    /**
        * 返回连接对象
        */
    public static Connection getConnection() {
      try {
       Class.forName("com.mysql.jdbc.Driver");
       return DriverManager.getConnection(url,user,password);
      }catch (Exception e) {
        throw new RuntimeException(e);
      }
    }
    
    /**
      * 关闭
      */
     public static void closeAll(Connection con, Statement stmt, ResultSet rs) {
    try {
    if (rs !=null) {
         rs.close();// 快速异常捕获Alt + shift + z
         rs =null;// 建议垃圾回收期回收资源
       }
    if (stmt !=null) {
        stmt.close();
        stmt =null;
    }
    if (con !=null && !con.isClosed()) {
        con.close();
        con =null;
        }
    }catch (SQLException e) {
        throw new RuntimeException(e);
       }
     }
    }
    
     
    public class User {
       private int id;
       private String name;
       /*
        此处省略 get/set 及其它字段定义代码
       */
    }
    
    /**
     * 测试代码
     */
    import Utils.JdbcUtils;
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.ResultSetHandler;
    import org.apache.commons.dbutils.handlers.*;
    import org.junit.Test;
    import java.sql.Array;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    public class App_query {
       private Connectionconn;
    
        @Test
        public void testQuery()throws Exception {
           String sql ="select * from users where id=?";
    
           //获取连接 
           conn = JdbcUtils.getConnection();
    
           //创建DbUtils核心工具类对象
            QueryRunner qr =new QueryRunner();
          
    	   //查询
           User users = qr.query(conn, sql,new ResultSetHandler() {
    
           //如何封装一个Admin对象
            public User handle(ResultSet rs)throws SQLException {
    
    		if (rs.next()) {
    			User user =new User();
    			user.setId(rs.getInt("id"));
    			user.setName(rs.getString("name"));
                ***********
    			return user;
    		}
    		return null;
    	}
    
    },29);
    
        // 关闭
    
          conn.close();
    
    }
     
    
        @Test
        public void testQueryOne()throws Exception {
          String sql ="select * from user where id=?";
          
    	   //获取连接
    	   conn = JdbcUtils.getConnection();
    	   //创建DbUtils核心工具类对象
    	   QueryRunner qr =new QueryRunner();
    	   //查询返回单个对象
    	   User user =  qr.query(conn, sql,new BeanHandler(User.class),30);
    
    	   System.out.println(user);
    	   conn.close();
    	  }
    
        //2.BeanListHandler: 查询返回list集合,集合元素是指定的对象
        @Test
        public void testQueryMany()throws Exception {
    		String sql ="select * from user";
              conn = JdbcUtils.getConnection();
            QueryRunner qr =new QueryRunner();
            
    		//查询全部数据
             List list = qr.query(conn, sql,new BeanListHandler(Admin.class));
             conn.close();
         }
    
    @Test
    // 3) ArrayHandler, 查询返回结果记录的第一行,封装对对象数组, 即返回:Object[]
    // 4) ArrayListHandler, 把查询的每一行都封装为对象数组,再添加到list集合中
    // 5) ScalarHandler 查询返回结果记录的第一行的第一列  (在聚合函数统计的时候用)
    // 6) MapHandler  查询返回结果的第一条记录封装为map
    
      public void testArray()throws Exception {
           String sql ="select * from user";
           conn = JdbcUtils.getConnection();
         
    	   QueryRunner qr =new QueryRunner();
           
    	   //查询
          Object[] obj = qr.query(conn, sql,new ArrayHandler());
           
    	  System.out.println("数组:"+ Arrays.toString(obj));
          
    	  List list = qr.query(conn, sql,new ArrayListHandler());
    
         for (int i =0; i < list.size(); i++) {
            System.out.println("list:"+ Arrays.toString(list.get(i)));
          } 
    	 //查询的结果先是数组
         //然后将数组添加到list中
         //所以由list获取的每一条都为数组,然后遍历数组才能获取值
    
        Integer num = qr.query(conn, sql,new ScalarHandler());
         System.out.println("第一列:" + num);
         Map map = qr.query(conn,sql,new MapHandler());
         Set> entrys = map.entrySet();
    
         //entry代表一个键值对
         for (Map.Entry entry : entrys) {
            System.out.println("map " + entry.getKey() +"=" + entry.getValue());
         }
         conn.close();
       }
    }
    
     使用dbutils工具类可以简化
         jdbc编码的工作量
        不再用JDBC编写原子性代码
        直接使用QueryRunner获取结果
        而且其安全性较高
        内部的JDBC一些工作已经做好了实现
        用户只需直接使用即可
  • 相关阅读:
    2023年腾讯云双11活动云服务器价格表
    【C++学习笔记】1.1 命名空间
    深入解析ThreadX任务管理:函数探秘
    什么是BT种子!磁力链接又是如何工作的?
    Auto-GPT测评:自信、努力、不合格
    字节三面:能说一说MySQL缓存池吗?
    2022护网行动在即,关于护网的那些事儿
    用C#实现最小二乘法(用OxyPlot绘图)✨
    vs studio Ctrl+D 快捷键失效(无法复制行)
    负载均衡.
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127439190