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) ...
随机推荐
- AAAI |如何保证人工智能系统的准确性?
|如何保证人工智能系统的准确性?" title="AAAI |如何保证人工智能系统的准确性?"> 注:本文译自AI is getting smarter; ...
- Flutter调研(1)-Flutter基础知识
工作需要,因客户端有部分页面要使用flutter编写,需要QA了解一下flutter相关知识,因此,做了flutter调研,包含安装,基础知识与demo编写,第二部分是安装与环境配置. —— Flut ...
- MYSQL对数据库和表的基本操作
CREATE DATABASE testdb CHARSET=UTF8 创建一个数据库 名字叫做testdb USE testdb; 选择数据库 CREATE TABLE testTable1( ) ...
- python基础-基本概念
python概念介绍 python是一门动态解释型的强类型定义语言,创始人吉多·范罗苏姆(Guido van Rossum) #编译型语言 编译型:一次性将所有程序编译成二进制文件 缺点:开发效率低, ...
- unittest实战(二):用例编写
# coding:utf-8import unittestfrom selenium import webdriverimport timefrom ddt import ddt, data, unp ...
- 《ASP.NET Core 3框架揭秘》读者群,欢迎加入
作为一个17年的.NET开发者,我对一件事特别不能理解:我们的计算机图书市场充斥着一系列介绍ASP.NET Web Forms.ASP.NET MVC.ASP.NET Web API的书籍,但是却找不 ...
- step(iter)、epoch、batch size之间的关系
转自:https://blog.csdn.net/wcy23580/article/details/90082221
- ES6拓展的对象功能
前言:因为之前看过很多的博客啊,书籍啊但是最后都雁过无痕,再问我基本没什么印象,所以就迫使自己看书的时候记点笔记,因为懒得写字[捂脸],现在是打字比写字要快好多,所以就写博客吧! ES6规范明确定义了 ...
- GPS轨迹发生模拟器介绍
GPS轨迹发生模拟器介绍 GPS信号模拟器能够模拟卫星信号运动轨迹,模拟GPS卫星导航系统的导航信号.GPS轨迹发生器可以模拟导航系统确定位置点如日期.时间.经度.纬度.海拔信息.速度等.GPS轨迹模 ...
- 03 HDFS的客户端操作
服务器和客户端的概念 hdfs的客户端有多种形式 1.网页形式 2.命令行形式 3.客户端在哪里运行,没有约束,只要运行客户端的机器能够跟hdfs集群联网 参数配置 文件的切块大小和存储的副本数量,都 ...