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自定义业务类型相关转换器的更多相关文章

  1. JDBC开源框架:DBUtils使用入门

    在单元测试过程中,只涉及到数据库的直接操作来验证业务逻辑是否正确的情况,DBUtils非常适合使用.它结构简单,包小,友好处理掉那些jdbc异常,让你更专注于业务代码,而非底层的操作.官网对它的定义: ...

  2. [Android] 开源框架 Volley 自定义 Request

    今天在看Volley demo (https://github.com/smanikandan14/Volley-demo), 发现自定义GsonRequest那块代码不全, 在这里贴一个全的. pu ...

  3. 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)

    AsyncTask使用方法详情:http://www.cnblogs.com/zzw1994/p/4959949.html 下拉开源框架PullToRefresh使用方法和下载详情:http://ww ...

  4. 开源框架:Apache的DBUtils框架

    开源框架:Apache的DBUtils框架 Commons DbUtils 1.4 API 开源框架:DBUtils使用详解 Download Apache Commons DbUtils  官方文档

  5. Farseer.net轻量级开源框架 中级篇:自定义配置文件

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 数据绑定 下一篇:Farseer.net轻量级开源框架 中级篇: 动态数据库访问 ...

  6. jdbc框架-dbutils的简单使用

    jdbc框架-dbutils的简单使用 dbutils:是apache组织的一个工具类,jdbc的框架,更方便我们使用 使用步骤: 1.导入jar包(commons-dbutils-1.4.jar) ...

  7. NancyFx 2.0的开源框架的使用-CustomModule(自定义模块)

    NancyFx框架的自定义模块 新建一个空的Web项目 然后通过NuGet库安装下面的包 Nancy Nancy.Hosting.Aspnet 然后添加Models,Module,Views三个文件夹 ...

  8. Pyhton开源框架(加强版)

    info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...

  9. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

随机推荐

  1. git push的完整形式

    现在的情况是,本地有两个分支:master.div, 远程仓库有一个分支:master,本地master分支和远程master分支建立有跟踪联系,这样本地master分支提交时直接git push(只 ...

  2. 【转载】Java for循环

    转载只为个人学习,阅读请前往原地址:Java for循环的几种用法详解 本文主要是来了解一下Java中的几种for循环用法,分析得十分详细,一起来看看. J2SE 1.5提供了另一种形式的for循环. ...

  3. NIPS 2016:普及机器学习

    ​ 2016:普及机器学习" title="NIPS 2016:普及机器学习"> ​左起:微软研究员Robert Schapire,John Langford,Al ...

  4. IDEA打包web项目为war,通过本地Tomcat启动war

    1.打包 ①idea的打包很简单,网上教程也很多,简单说下:project struct-->artifact-->+-->Web Application:Archive--> ...

  5. Python在计算内存时应该注意的问题?

    我之前的一篇文章,带大家揭晓了 Python 在给内置对象分配内存时的 5 个奇怪而有趣的小秘密.文中使用了sys.getsizeof()来计算内存,但是用这个方法计算时,可能会出现意料不到的问题. ...

  6. 前端每日实战:114# 视频演示如何用纯 CSS 和混色模式创作一个 loader 动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MqYroW 可交互视频 此视频是可 ...

  7. 学习Vue.js-Day2

    书接上文/思考反馈 react,ng,vue作用差不多,那各个都有什么特点啊,实际工作中应该用哪一个? 答:其实在实际工作中,组员会通过讨论而选择框架:这三个框架都能解放你的工作量,也适合做单页面应用 ...

  8. 前端每日实战:62# 视频演示如何用纯 CSS 创作一只蒸锅

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/YvOzNy 可交互视频 此视频是可 ...

  9. 关于独立部署web项目到tomcat服务器详情

    步骤: 1.设置端口号:找到所解压的tomcat的目录下中的conf文件夹,再用editPlus打开conf文件夹中的server.xml文件,tomcat初始端口为8005,8080,8009,如果 ...

  10. Python - requests发送请求报错:UnicodeEncodeError: 'latin-1' codec can't encode characters in position 13-14: 小明 is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8.

    背景 在做接口自动化的时候,Excel作为数据驱动,里面存了中文,通过第三方库读取中文当请求参数传入 requests.post() 里面,就会报错 UnicodeEncodeError: 'lati ...