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. 全栈新视觉——前后端分离

    1234 前端工程化从单纯的 HTML/CSS/JavaScript,到 gulp/webpack 以及 node.js.可能还需要其他的插件 sass.less.vue.react.angular. ...

  2. windows7 64位系统下无法运行ipython

    windows7 64位系统下无法运行ipython | Creator 导航 导航 博客 分类 标签 友链 关于 大专栏  windows7 64位系统下无法运行ipythontent-post L ...

  3. 学习HEXO的历程

    前言: 简介 开始搭建 命令 API测试 逛github相关的帖子时,发现了hexo.正好想要做一个个人的博客,用来记录自己的各类感悟,所以花一些时间学习学习,以后博客可以放github,省得去注册c ...

  4. Mysql锁和死锁分析

    在MySQL中,行级锁并不是直接锁记录,而是锁索引.索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定 ...

  5. PHPExcel之蛋疼

    限制了内存,处理个80+K的表就会GG,所以还要尽量删空行,选中某一行如A3,ctrl+shift+↓然后ctrl+小键盘的减号最后需要ctrl+s

  6. How to Write a README on GitHub

    最近在寫 GitHub 上的 README,發現這個東西好像每個人的寫法都不太一樣,於是稍微整理了一下自己覺得大概要包含哪些內容. Motivation 顧名思義就是簡介一下為什麼會有這個專案,以及這 ...

  7. Linux命令学习神器!命令看不懂直接给你解释!

    大家都知道,Linux 系统有非常多的命令,而且每个命令又有非常多的用法,想要全部记住所有命令的所有用法,恐怕是一件不可能完成的任务. 一般情况下,我们学习一个命令时,要么直接百度去搜索它的用法,要么 ...

  8. property 属性

    #propery 属性"""内置装饰器函数,只在面向对象中使用."""#计算圆的面积,圆的周长 from math import pi cl ...

  9. 把.net Core 项目迁移到VS2019 for MAC

    VS2019 for MAC已经发布很长时间了,本以为项目移过去很麻烦,一直没有动作,最近呆家里快发霉了,决定研究研究,没想到一句代码都不需要动,直接完功,这下可以生产了.同学们可以放心整了. 本次平 ...

  10. Windows下安装虚拟机

    一.准备工作 1.下载centos7操作系统 阿里巴巴站点: http://mirrors.aliyun.com/centos/7/isos/x86_64/ 2.下载VMware虚假机 可以直接通过3 ...