DbUtils(二) 结果集实例——handler应用
2017-07-06 09:53
267 查看
单行数据处理:ScalarHandler ArrayHandler MapHandler
BeanHandler
多行数据处理:BeanListHandler AbstractListHandler(ArrayListHandler
MapListHandler
ColumnListHandler)
AbstractKeyedHandler(KeyedHandler
BeanMapHandler)
可供扩展的类:BaseResultSetHandler
Dbutils使用结果集的方法有query、insert、insertBatch三个。这些方法都在QueryRunner类中,需要注意的是insert和update方法都能执行 “insert”开头的sql语句,但是返回值有区别。insert 执行后返回的是表中的插入行生成的主键值,update 返回的是受语句影响的行数。所以,如果目标表中有主键且需要返回插入行的主键值就用 insert 方法,如果表没有主键或者不需要返回主键值可使用
update 方法。
先建立测试用数据表[users]:
字段类型,id 为主键:
1、ScalarHandler<T>
用于获取结果集中第一行某列的数据并转换成 T 表示的实际对象。
该类对结果集的处理直接在 handle 方法中进行,不涉及 dbutils 库的其他类。
使用的时候一定要保证提供正确的列索引或列名,并且结果类型也要正确可转换。
17f84
2、ArrayHandler
用于获取结果集中的第一行数据,并将其封装到一个数组中,一列值对应一个数组元素。
handle 源码:
3、MapHandler
用于获取结果集中的第一行数据,并将其封装到一个Map中,Map 中 key 是数据的列别名(as label),如果没有就是列的实际名称,Map 中 value 就是列的值,注意代表列的 key 不区分大小写。
handle 源码:
通过查看 BasicRowProcessor 代码,可以知道封装结果集的 Map 其实是一个 LinkedHashMap 对象。
4、BeanHandler<T>
用于获取结果集中的第一行数据,并将其封装到JavaBean对象。
整个转换过程最终会在 BeanProcessor 类中完成。
+ View Code
执行代码:
需要注意的是,默认的情况下要保证表的字段和javabean的属性一致(字符一致即可,对大小写不敏感),比如字段是userLock,那么javabean中属性必须是userLock这几个字母(可以是userlock,userLock,userLOCK,不过还是建议按照规范来定义)。
但有个问题,数据表中的字段可能已经定下来了,而且名称可能不太规范,比如用下划线(login_name),或者加了一个类型前缀(chrLoginName),如果修改表字段,那么涉及到的修改地方太多了,其实查看源码可以知道BeanHandler有两个构造方法:
可以看出其实都是调用的第二个方法。
情况一:只涉及到下划线,表字段名用下划线间隔(如表users_t字段:[id],[user_name],[login_name],[user_password],[user_level],[user_lock]),现在要封装到Javabean中Users类(代码见上),其中属性使用驼峰命名。可以用dbutils1.6提供的BeanProcessor类的子类GenerousBeanProcessor。
情况二:完全改变表字段到Javabean属性的映射(如表users_m字段:[yhmid],[charUsername],[charLoginName],[charPassword],[intLevel],[boolLock])映射到Users类(代码同上):
5、BeanListHandler[b]<T>[/b]
用于将结果集的每一行数据转换为Javabean,再将这个Javabean添加到ArrayList中。可以简单的看着是BeanHandler的高级版,只不过是多了一步,就是将生成的Javabean添加到ArrayList中,其他的处理都和BeanHandler一样。
6、AbstractListHandler<T>
AbstractListHandler抽象类已经实现handle方法,该方法其实只是起到一个包装作用,将处理好的每行数据添加到ArrayList中。每行的数据处理通过调用handleRow方法实现,所有它的3个子类都必须实现这个方法。
6.1 ArrayListHandler (extends AbstractListHandler<Object[]>)
用于将结果集每行数据转换为Object数组(处理过程等同与ArrayHandler),再将该数组添加到ArrayList中。简单点,就是将每行数据经过ArrayHandler处理后添加到ArrayList中。
6.2 MapListHandler (extends AbstractListHandler<Map<String, Object>>)
用于将结果集每行数据转换为Map(处理过程等同与MapHandler),再将Map添加到ArrayList中。简单点,就是将每行数据经过MapHandler处理后添加到ArrayList中。
6.3 ColumnListHandler<T> (extends AbstractListHandler<T>)
根据列索引或列名获取结果集中某列的所有数据,并添加到ArrayList中。可以理解为ScalarHandler<T>的加强版。
7、AbstractKeyedHandler<K, V>
AbstractKeyedHandler是一个抽象类,已经实现了handle方法,其子类必须实现createKey(ResultSet rs)和createRow(ResultSet rs)方法,以便handle()的调用。
7.1 KeyedHandler<K> (extends AbstractKeyedHandler<K, Map<String, Object>>)
用于获取所有结果集,将每行结果集转换为Map<String, Object>,并指定某列为key。可以简单的认为是一个双层Map,相当于先对每行数据执行MapHandler,再为其指定key添加到一个HaspMap中。KeyedHandler<K> 中的<K>是指定的列值的类型。
7.2 BeanMapHandler<K, V> (extends AbstractKeyedHandler<K, V>)
用于获取所有结果集,将每行结果集转换为Javabean作为value,并指定某列为key,封装到HashMap中。相当于对每行数据的做BeanHandler一样的处理后,再指定列值为Key封装到HashMap中。
需要注意这个结果转换类也可以像BeanHandler的情况一和情况二介绍的那样定义一个processor,但默认情况下这么做了就会以每行的第一列作为Key,不能指定其他列为Key。
8、BaseResultSetHandler<T>
根据文档介绍,如果上面的结果集处理类都不能满足你的要求,可以通过继承这个抽象类定义自己的结果处理类,子类必须实现无参方法handle()。
做个简单的例子,比如要将指定列值加一个前缀"class-"后添加到ArrayList中:
======================================================================
总的来说,最终的数据处理是在 BasicRowProcessor 的四个方法中进行,涉及到JavaBean的话会通过 BasicRowProcessor 调用 BeanProcessor 的两个方法。其他的都是对每行数据转换后的结果的封装。
BeanHandler
多行数据处理:BeanListHandler AbstractListHandler(ArrayListHandler
MapListHandler
ColumnListHandler)
AbstractKeyedHandler(KeyedHandler
BeanMapHandler)
可供扩展的类:BaseResultSetHandler
Dbutils使用结果集的方法有query、insert、insertBatch三个。这些方法都在QueryRunner类中,需要注意的是insert和update方法都能执行 “insert”开头的sql语句,但是返回值有区别。insert 执行后返回的是表中的插入行生成的主键值,update 返回的是受语句影响的行数。所以,如果目标表中有主键且需要返回插入行的主键值就用 insert 方法,如果表没有主键或者不需要返回主键值可使用
update 方法。
先建立测试用数据表[users]:
id | userName | loginName | userPassword | userLevel | userLock |
1 | 测试用户1 | test1 | jiseflwes | 10 | 0 |
2 | 知道什么 | hello | 2556sefsfs | 10 | 1 |
3 | 编程就编程 | cjava | sfsfsef254sefs | 2 | 0 |
用于获取结果集中第一行某列的数据并转换成 T 表示的实际对象。
该类对结果集的处理直接在 handle 方法中进行,不涉及 dbutils 库的其他类。
17f84
2、ArrayHandler
用于获取结果集中的第一行数据,并将其封装到一个数组中,一列值对应一个数组元素。
handle 源码:
用于获取结果集中的第一行数据,并将其封装到一个Map中,Map 中 key 是数据的列别名(as label),如果没有就是列的实际名称,Map 中 value 就是列的值,注意代表列的 key 不区分大小写。
handle 源码:
用于获取结果集中的第一行数据,并将其封装到JavaBean对象。
整个转换过程最终会在 BeanProcessor 类中完成。
+ View Code
执行代码:
但有个问题,数据表中的字段可能已经定下来了,而且名称可能不太规范,比如用下划线(login_name),或者加了一个类型前缀(chrLoginName),如果修改表字段,那么涉及到的修改地方太多了,其实查看源码可以知道BeanHandler有两个构造方法:
用于将结果集的每一行数据转换为Javabean,再将这个Javabean添加到ArrayList中。可以简单的看着是BeanHandler的高级版,只不过是多了一步,就是将生成的Javabean添加到ArrayList中,其他的处理都和BeanHandler一样。
6.1 ArrayListHandler (extends AbstractListHandler<Object[]>)
用于将结果集每行数据转换为Object数组(处理过程等同与ArrayHandler),再将该数组添加到ArrayList中。简单点,就是将每行数据经过ArrayHandler处理后添加到ArrayList中。
用于将结果集每行数据转换为Map(处理过程等同与MapHandler),再将Map添加到ArrayList中。简单点,就是将每行数据经过MapHandler处理后添加到ArrayList中。
根据列索引或列名获取结果集中某列的所有数据,并添加到ArrayList中。可以理解为ScalarHandler<T>的加强版。
AbstractKeyedHandler是一个抽象类,已经实现了handle方法,其子类必须实现createKey(ResultSet rs)和createRow(ResultSet rs)方法,以便handle()的调用。
用于获取所有结果集,将每行结果集转换为Map<String, Object>,并指定某列为key。可以简单的认为是一个双层Map,相当于先对每行数据执行MapHandler,再为其指定key添加到一个HaspMap中。KeyedHandler<K> 中的<K>是指定的列值的类型。
用于获取所有结果集,将每行结果集转换为Javabean作为value,并指定某列为key,封装到HashMap中。相当于对每行数据的做BeanHandler一样的处理后,再指定列值为Key封装到HashMap中。
根据文档介绍,如果上面的结果集处理类都不能满足你的要求,可以通过继承这个抽象类定义自己的结果处理类,子类必须实现无参方法handle()。
做个简单的例子,比如要将指定列值加一个前缀"class-"后添加到ArrayList中:
总的来说,最终的数据处理是在 BasicRowProcessor 的四个方法中进行,涉及到JavaBean的话会通过 BasicRowProcessor 调用 BeanProcessor 的两个方法。其他的都是对每行数据转换后的结果的封装。
相关文章推荐
- python 爬虫(3) Opener与Handler的介绍和实例应用
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
- Jquery+Json+Handler文件结合应用实例
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
- Android深入浅出系列之实例应用—程序运行进度提示条应用ProgressBar和Handler的使用
- Python]网络爬虫(四):Opener与Handler的介绍和实例应用
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
- DbUtils(二) 结果集实例
- Android的Handler Looper Message机制应用实例与详解(一)
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
- Android深入浅出系列之实例应用—程序运行进度提示条应用ProgressBar和Handler的使用
- asp.net 一般处理程序Handler.ashx应用实例
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
- 在oracle利用游标取数据库的结果集应用实例: