Apache commons-dbutils工具简介说明
下文笔者讲述Apache commons-dbutils工具简介说明,如下所示
JdbcUtils
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<Map.Entry<String, Object>> entrys = map.entrySet(); //entry代表一个键值对 for (Map.Entry entry : entrys) { System.out.println("map " + entry.getKey() +"=" + entry.getValue()); } conn.close(); } }
使用dbutils工具类可以简化 jdbc编码的工作量 不再用JDBC编写原子性代码 直接使用QueryRunner获取结果 而且其安全性较高 内部的JDBC一些工作已经做好了实现 用户只需直接使用即可
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。