JDBC开源框架:DBUtils自定义业务类型相关转换器
dbutils提供的handler转换不能满足实际业务开发的需求。比如枚举转int,时间类型LocalDateTime,实体对象的属性名与字段未能相对应。
mysql表member结构字段: id、member_name、sex、createTime
public class Member {
private long id;
private String memberName;
private Sex sex;
private LocalDateTime createTime;
}
枚举Sex 时间LocalDateTime没有默认提供,需要转换。数据的转换需要实现ColumnHandler接口。此接口提供二个简单方法:1、类型是否匹配public boolean match(Class<?> propType);
2、转换数据 public Object apply(ResultSet rs, int columnIndex)。
一、定义二个类型转换handler
public class LocalDateTimeHandler implements ColumnHandler {
@Override
public boolean match(Class<?> propType) {
return propType.equals(LocalDateTime.class);
}
@Override
public Object apply(ResultSet rs, int columnIndex) throws SQLException {
if (rs.getTimestamp(columnIndex) != null) {
return rs.getTimestamp(columnIndex).toLocalDateTime();
}
return null;
}
}
public class SexHandler implements ColumnHandler {
@Override
public boolean match(Class<?> propType) {
return propType.equals(Sex.class);
}
@Override
public Object apply(ResultSet rs, int columnIndex) throws SQLException {
for (Sex sex : Sex.values()){
if (sex.getIndex() == rs.getInt(columnIndex)){
return sex;
}
}
return null;
}
}
public enum Sex {
male(1,"男"),
female(0,"女")
;
private int index;
private String description;
Sex(int index, String description){
this.index = index;
this.description = description;
}
public int getIndex() {
return index;
}
public String getDescription() {
return description;
}
}
二、重构BeanProcessor
public class MyBeanProcessor extends BeanProcessor {
private static ServiceLoader<ColumnHandler> columnHandlers = ServiceLoader.load(ColumnHandler.class);
private static List<ColumnHandler> customList = new ArrayList<>();
static {
customList.add(new LocalDateTimeHandler());
customList.add(new SexHandler());
}
public MyBeanProcessor(Map<String, String> columnToPropertyMap){
super(columnToPropertyMap);
}
@Override
protected Object processColumn(ResultSet rs, int index, Class<?> propType)
throws SQLException {
Object retval = rs.getObject(index);
if ( !propType.isPrimitive() && retval == null ) {
return null;
}
for (ColumnHandler handler : columnHandlers) {
if (handler.match(propType)) {
retval = handler.apply(rs, index);
break;
}
}
for (ColumnHandler handler : customList){
if (handler.match(propType)){
retval = handler.apply(rs, index);
break;
}
}
return retval;
}
}
三、传自定义参数转换数据
@Test
public void customQuery() throws SQLException {
QueryRunner queryRunner = new QueryRunner();
String sql = "select * from member";
Map<String, String> map = new HashMap();
map.put("member_name","memberName");
MyBeanProcessor bean = new MyBeanProcessor(map);
RowProcessor convert = new BasicRowProcessor(bean);
BeanListHandler<Member> handler = new BeanListHandler(Member.class,convert);
List<Member> list = queryRunner.query(getConn(),sql, handler);
System.out.println(JSON.toJSONString(list));
}
JDBC开源框架:DBUtils自定义业务类型相关转换器的更多相关文章
- JDBC开源框架:DBUtils使用入门
在单元测试过程中,只涉及到数据库的直接操作来验证业务逻辑是否正确的情况,DBUtils非常适合使用.它结构简单,包小,友好处理掉那些jdbc异常,让你更专注于业务代码,而非底层的操作.官网对它的定义: ...
- [Android] 开源框架 Volley 自定义 Request
今天在看Volley demo (https://github.com/smanikandan14/Volley-demo), 发现自定义GsonRequest那块代码不全, 在这里贴一个全的. pu ...
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
AsyncTask使用方法详情:http://www.cnblogs.com/zzw1994/p/4959949.html 下拉开源框架PullToRefresh使用方法和下载详情:http://ww ...
- 开源框架:Apache的DBUtils框架
开源框架:Apache的DBUtils框架 Commons DbUtils 1.4 API 开源框架:DBUtils使用详解 Download Apache Commons DbUtils 官方文档
- Farseer.net轻量级开源框架 中级篇:自定义配置文件
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 数据绑定 下一篇:Farseer.net轻量级开源框架 中级篇: 动态数据库访问 ...
- jdbc框架-dbutils的简单使用
jdbc框架-dbutils的简单使用 dbutils:是apache组织的一个工具类,jdbc的框架,更方便我们使用 使用步骤: 1.导入jar包(commons-dbutils-1.4.jar) ...
- NancyFx 2.0的开源框架的使用-CustomModule(自定义模块)
NancyFx框架的自定义模块 新建一个空的Web项目 然后通过NuGet库安装下面的包 Nancy Nancy.Hosting.Aspnet 然后添加Models,Module,Views三个文件夹 ...
- Pyhton开源框架(加强版)
info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
随机推荐
- HAProxy此例简单介绍基于docker的HAProxy反代
HAProxy拓展连接 此例简单介绍基于Docker的HAProxy反代 反代: 1.获取haproxy镜像 docker pull haproxy 2.写配置文件haproxy.cfg 1 glo ...
- USB小白学习之路(3) 通过自定义请求存取外部RAM
通过自定义请求存取外部RAM 1. 实验简述 此实验是对自定义的供应商特殊命令(vendor specific command bRequest = 0xA3)进行解析,程序中的read me说明如下 ...
- 浅谈ConcurrentDictionary与Dictionary
在.NET4.0之前,如果我们需要在多线程环境下使用Dictionary类,除了自己实现线程同步来保证线程安全外,我们没有其他选择.很多开发人员肯定都实现过类似的线程安全方案,可能是通过创建全新的线程 ...
- Kali虚拟机的扩容经历
Kali虚拟机的扩容经历 0x01 起因 更新了一下软件包,竟然提示我空间不足. 升级了 687 个软件包,新安装了 82 个软件包,要卸载 0 个软件包,有 8 个软件包未被升级. 需要下载 1,5 ...
- js实现图片的懒加载
原文地址:https://blog.phyer.cn/article/9277.欢迎大家访问我的博客(●ˇ∀ˇ●) // 防抖 let lazy_timer; window.addEventListe ...
- preload & prefetch
原文地址在 我的笔记里,觉得还行就给个 star 吧:) 关于 preload 和 prefetch 早有耳闻,知道它们可以优化页面加载速度,然具体情况却了解不多.搜索了相关的资料后对其有了些认识,在 ...
- JS 增删改查操作XML
效果图: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...
- 简单服务器端Blazor Cookie身份验证的演示
为了演示身份验证如何在服务器端 Blazor 应用程序中工作,我们将把身份验证简化为最基本的元素. 我们将简单地设置一个 cookie,然后读取应用程序中的 cookie. 应用程序身份验证 大多数商 ...
- 数据加密标准(DES)详解
1 简介 1.1 历史 DES(Data Encryption Standard)是由IBM公司在1974年提出的加密算法,在1977年被NIST定位数据加密标准.随后的很多年里,DES都是最流行的对 ...
- 前端开发--nginx篇
安装和启动 Mac上搭建nginx教程 通过Homebrew 安装nginx brew install nginx 配置 添加配置文件在 /usr/local/etc/nginx/servers 目录 ...