• ApacheCommonsDbutils 学习笔记


    1.项目结构

    org.apache.commons.dbutils 包

    |__DbUtils:jdbc辅助方法集合,线程安全

    |__ResultSetHandler<T>:转换ResultSets对象 为其他Object 接口,下面为它的一些具体实现类

        |__org.apache.commons.dbutils.handlers包
                |__AbstractKeyedHandler<K,V>:把ResultSet里面数据转换为用Map存储,抽象类

                      |__BeanMapHandler:map里面value保存的是一个bean类,根据相应key获取bean数据

                     |__KeyedHandler;ResultSetHandler h = new KeyedHandler("id"); 根据类中保存的key(id),获取相应value

                |__AbstractListHandler<T>:把ResultSet里面数据转换为用List存储,抽象类

                      |__ArrayListHandler:list为arrayList

                     |__ColumnListHandler:

    |__MapListHandler:

                |__ArrayHandler:把ResultSet里面数据转换为用Object[]存储

                |__BeanHandler<T>:把ResultSet里面数据转换为用javaBean存储

                |__BeanListHandler<T>:把ResultSet里面数据转换为用List存储,list里面对象为javaBean

                |__MapHandler:把ResultSet里面数据转换为用Map存储

                |__ScalarHandler:

    |__AbstractQueryRunner

         |__QueryRunner  :基本查询类

         |__AsyncQueryRunner

    |__RowProcessor

    |__BasicRowProcessor

    |__BeanProcessor

    |__ProxyFactory:代理类

    |__QueryLoader

    |__ResultSetIterator

    org.apache.commons.dbutils.wrappers

    |__SqlNullCheckedResultSet

    |__StringTrimmedResultSet

    2.配置maven

    1 <dependency>
    2     <groupId>commons-dbutils</groupId>
    3     <artifactId>commons-dbutils</artifactId>
    4     <version>1.6</version>
    5 </dependency>
    maven

    3.创建测试表数据

     1 SET FOREIGN_KEY_CHECKS=0;
     2 
     3 -- ----------------------------
     4 -- Table structure for person
     5 -- ----------------------------
     6 DROP TABLE IF EXISTS `person`;
     7 CREATE TABLE `person` (
     8   `id` bigint(20) NOT NULL AUTO_INCREMENT,
     9   `name` varchar(24) DEFAULT NULL,
    10   `age` int(11) DEFAULT NULL,
    11   `address` varchar(120) DEFAULT NULL,
    12   PRIMARY KEY (`id`)
    13 ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=gbk;
    14 
    15 -- ----------------------------
    16 -- Records of person
    17 -- ----------------------------
    18 INSERT INTO `person` VALUES ('1', 'darkdog', '99', 'beijing');
    SQL

    4.开始测试

    首先封装一个工具类用于获取数据库连接

     1 class CommonDbutils {
     2 
     3     public static DataSource getDataSource() {
     4         MysqlDataSource ds = new MysqlDataSource();
     5         ds.setURL("jdbc:mysql://localhost:3306/test?user=root&password=root");
     6         return ds;
     7     }
     8 
     9     public static Connection getConnection() throws SQLException {
    10         MysqlDataSource ds = (MysqlDataSource) getDataSource();
    11         Connection con = ds.getConnection();
    12         return con;
    13     }
    14 
    15 }
    CommonDbutils

    查询时,工具包提供了几种继承自ResultSetHandler, 用于处理结果集的Handler

     1 /**
     2  * 使用ResultSetHandler存储方式查询
     3  * 
     4  * @param id
     5  * @return
     6  * @throws SQLException
     7  */
     8 public Object[] getResultSet(Integer id) throws SQLException {
     9     ResultSetHandler<Object[]> rsh = new ResultSetHandler<Object[]>() {
    10         public Object[] handle(ResultSet rs) throws SQLException {
    11             if (!rs.next()) {
    12                 return null;
    13             }
    14             ResultSetMetaData meta = rs.getMetaData();
    15             int cols = meta.getColumnCount();
    16             Object[] result = new Object[cols];
    17 
    18             for (int i = 0; i < cols; i++) {
    19                 result[i] = rs.getObject(i + 1);
    20             }
    21             return result;
    22         }
    23     };
    24 
    25     /*
    26     QueryRunner qr = new QueryRunner();
    27     return qr.query(CommonDbutils.getConnection(),
    28             "SELECT * FROM Person WHERE id=?", rsh, id);
    29     */
    30 
    31     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
    32     return qr.query("SELECT * FROM Person WHERE id=?", rsh, id);
    33 }
    使用ResultSetHandler存储方式查询
     1 /**
     2  * 使用BeanHandler存储方式查询
     3  * 
     4  * @param id
     5  * @return
     6  * @throws SQLException
     7  * @throws IllegalArgumentException
     8  * @throws IllegalAccessException
     9  */
    10 public Object getBean(Integer id) throws SQLException,
    11         IllegalArgumentException, IllegalAccessException {
    12     ResultSetHandler<Person> rsh = new BeanHandler<Person>(Person.class);
    13     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
    14     return qr.query("select id, name, age, address from Person where id=?",
    15             rsh, id);
    16 }
    使用BeanHandler存储方式查询
     1 /**
     2  * 使用BeanMapHandler存储方式查询
     3  * 
     4  * @param id
     5  * @return
     6  * @throws SQLException
     7  */
     8 public Map<Object, Person> getBeanMap(Integer id) throws SQLException {
     9     ResultSetHandler<Map<Object, Person>> rsh = new BeanMapHandler<Object, Person>(
    10             Person.class);
    11     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
    12     return qr.query("select id, name, age, address from Person", rsh);
    13 }
    使用BeanMapHandler存储方式查询
     1 /**
     2  * 使用BeanListHandler存储方式查询
     3  * 
     4  * @param params
     5  * @return
     6  * @throws SQLException
     7  */
     8 public List<Person> getBeanList() throws SQLException {
     9     ResultSetHandler<List<Person>> rsh = new BeanListHandler<Person>(
    10             Person.class);
    11     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
    12     String sql = "SELECT id, name, age, address FROM person";
    13 
    14     return qr.query(sql, rsh);
    15 }
    使用BeanListHandler存储方式查询
     1 /**
     2  * 使用ScalarHandler存储方式查询
     3  * 
     4  * @param id
     5  * @return
     6  * @throws SQLException
     7  */
     8 public Object getObject(Integer id) throws SQLException {
     9     ResultSetHandler<Object> rsh = new ScalarHandler<Object>();
    10     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
    11     return qr.query("select name from Person where id=?", rsh, id);
    12 }
    使用ScalarHandler存储方式查询
     1 /**
     2  * 使用ArrayHandler存储方式查询
     3  * 
     4  * @param id
     5  * @return
     6  * @throws SQLException
     7  */
     8 public Object[] getArray(Integer id) throws SQLException {
     9     ResultSetHandler<Object[]> rsh = new ArrayHandler();
    10     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
    11     return qr.query("SELECT * FROM Person WHERE id=?", rsh, id);
    12 }
    使用ArrayHandler存储方式查询
     1 /**
     2  * 使用ArrayListHandler存储方式查询
     3  * 
     4  * @param id
     5  * @return
     6  * @throws SQLException
     7  */
     8 public List<Object[]> getArrayList(Integer id) throws SQLException {
     9     ResultSetHandler<List<Object[]>> rsh = new ArrayListHandler();
    10     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
    11     return qr.query("SELECT * FROM Person WHERE id=?", rsh, id);
    12 }
    使用ArrayListHandler存储方式查询
     1 /**
     2  * 使用ColumnListHandler存储方式查询
     3  * 
     4  * @param index
     5  * @return
     6  * @throws SQLException
     7  */
     8 public List<Object> getColumnList(int index) throws SQLException {
     9     ResultSetHandler<List<Object>> rsh = new ColumnListHandler<Object>(
    10             index);
    11     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
    12     return qr.query("SELECT * FROM Person", rsh);
    13 }
    使用ColumnListHandler存储方式查询
     1 /**
     2  * 使用MapHandler存储方式查询
     3  * 
     4  * @param id
     5  * @return
     6  * @throws SQLException
     7  */
     8 public Map<String, Object> getMap(Integer id) throws SQLException {
     9     ResultSetHandler<Map<String, Object>> rsh = new MapHandler();
    10     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
    11     return qr.query("SELECT * FROM Person WHERE id=?", rsh, id);
    12 }
    使用MapHandler存储方式查询
     1 /**
     2  * 使用MapListHandler存储方式查询
     3  * 
     4  * @return
     5  * @throws SQLException
     6  */
     7 public List<Map<String, Object>> getMapList() throws SQLException {
     8     ResultSetHandler<List<Map<String, Object>>> rsh = new MapListHandler();
     9     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
    10     return qr.query("SELECT * FROM Person", rsh);
    11 }
    使用MapListHandler存储方式查询
     1 /**
     2  * 使用KeyedHandler存储方式查询
     3  * 
     4  * @return
     5  * @throws SQLException
     6  */
     7 public Map<Object, Map<String, Object>> getKeyed() throws SQLException {
     8     ResultSetHandler<Map<Object, Map<String, Object>>> rsh = new KeyedHandler<Object>();
     9     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
    10     return qr.query("SELECT * FROM Person", rsh);
    11 }
    使用KeyedHandler存储方式查询

    以上是所有查询相关, 除了第一个ResultSetHandler其余几个几乎不需要读API文档就可以从返回值类型上看出区别

    由于ResultSetHandler是一个接口所以必须实现handle方法来处理每个返回对象。

    以下 insert, update, delete 用的都是QueryRunner中的update方法

     1 /**
     2  * insert
     3  * @param p
     4  * @return
     5  * @throws SQLException
     6  */
     7 public int insert(Person p) throws SQLException {
     8     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
     9     String sql = "insert into Person (id, name, age, address) values (?, ?, ?, ?)";
    10     return qr.update(sql, p.getId(), p.getName(), p.getAge(), p.getAddress());
    11 }
    12 
    13 /**
    14  * update
    15  * @param p
    16  * @return
    17  * @throws SQLException
    18  */
    19 public int update(Person p) throws SQLException {
    20     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
    21     String sql = "update Person set name = ?, age = ?, address = ? where id = ?";
    22     return qr.update(sql, p.getName(), p.getAge(), p.getAddress(), p.getId());
    23 }
    24 
    25 /**
    26  * delete
    27  * @param id
    28  * @return
    29  * @throws SQLException
    30  */
    31 public int delete(Integer id) throws SQLException {
    32     QueryRunner qr = new QueryRunner(CommonDbutils.getDataSource());
    33     String sql = "delete from Person where id = ?";
    34     return qr.update(sql, id);
    35 }
    INSERT, UPDATE, DELETE

    最后关掉数据库连接, 使用DBUtils类中提供了一些简单封装的静态方法

    DbUtils.closeQuietly(CommonDbutils.getConnection());
  • 相关阅读:
    总有一天你将破蛹而出
    java 连接 Access数据库的两种方法
    freemarker中页面直接可以使用的内置对象
    freemarker中页面直接可以使用的内置对象
    常见的样式
    ibatis常用的集中判断语句
    mysql类型转换
    ibatis常用的集中判断语句
    window.open打开窗口时父窗口变成object
    window.open打开窗口时父窗口变成object
  • 原文地址:https://www.cnblogs.com/darkdog/p/4269037.html
Copyright © 2020-2023  润新知