dbutils 重写BeanProcessor 部分方法,支持enum的转换

原创 2013年12月04日 00:36:07

dbutils 是apache commons下的共用封装JDBC操作的包。能直接从数据库读取转换成list,bean,map等开发常用数据类型。

它优点:包小,全部就几十个类;透明简洁;入手快,不需要创建若干对象给dbutils用。

dbutils不是OR工具,它只是简化jdbc操作,你执行sql它返回数据。


核心的三个包:

org.apache.commons.dbutils

org.apache.commons.dbutils.handlers

org.apache.commons.dbutils.wrappers


Dbutils处理连接提交关闭等操作,这是一个线程安全的。

handlers处理数据类型转换

QueryRunner查询操作

ResultSetHandler此为接口,实现转换resultSet到object(bean,map等都需要实现此接口)

XXXProcessor具体转换column到实体属性中。


BeanProcessor匹配列名bean属性名和将ResultSet  column转换成对象的bean属性,但是match数据类型时,支持基本数据类型,Timestamp和SQLXML,至于其它统统作Object返回 ResultSet.getObject(index)。如果实体中定义enum,此时会出现转换异常出现。这时就需要Override  toBean(ResultSet rs, Class<T> type)的类 DefaultBeanProcessor extends BeanProcessor


原有toBean方法是通过数组的方式来标识column与property的关联。

  int[] columnToProperty = this.mapColumnsToProperties(rsmd, props);

此数组中-1表示未找到相关联的,但此方法实现中使用双重循环来判断column与property相等。

由于ResultSet支持按列名字符串来查询取值。所以也放弃dbutils使用index来标识取值方式 ,使用Map<column, property>来存储

protected Map<String, PropertyDescriptor> columnsToPropertyMap(ResultSetMetaData rsmd,
PropertyDescriptor[] props) throws SQLException {
Map<String, PropertyDescriptor> map = new HashMap<String, PropertyDescriptor>();
int count = rsmd.getColumnCount();
for (int i = 1; i <= count; i++) {
String columnName = rsmd.getColumnLabel(i);
if (StringUtils.isBlank(columnName)) {
columnName = rsmd.getColumnName(i);
}
String propertyName = columnToPropertyOverrides.get(columnName);
if (propertyName == null) {
propertyName = columnName;

    //删除掉字段中"_",lowcaseMapKey统一转换成小写
propertyName = StringUtils.remove(lowcaseMapKey(propertyName), "_");
}
for (PropertyDescriptor prop : props) {
String propName = prop.getDisplayName();
if (propertyName.equals(lowcaseMapKey(propName))) {
map.put(columnName, prop);
}
}
}
return map;
}


@Override
public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException {
PropertyDescriptor[] props = this.propertyDescriptors(type);
ResultSetMetaData rsmd = rs.getMetaData();
Map<String, PropertyDescriptor> map = this.columnsToPropertyMap(rsmd, props);
return this.createBean(rs, type, props, map);
}

private <T> T createBean(ResultSet rs, Class<T> type,
PropertyDescriptor[] props, Map<String, PropertyDescriptor> map)
throws SQLException {
T bean = this.newInstance(type);
for (Map.Entry<String, PropertyDescriptor> entry : map.entrySet()) {
String columnName = entry.getKey();
PropertyDescriptor prop = entry.getValue();
this.callsetter(bean, prop, processorColumn(rs, columnName, prop.getPropertyType()));
}
return bean;
}

protected Object processorColumn(ResultSet rs, String label, Object propType) throws SQLException {
Object obj = rs.getObject(label);
if (rs.wasNull() || obj == null) {
return null;
}


               ........


if (Enum.class.isAssignableFrom((Class<?>) propType)) {//存储是int类型,若有存储name String类型此处需要修改。
int intFromDb = rs.getInt(label);
for (Object enumInstance : ((Class<?>) propType).getEnumConstants()) {
try {
int enumIndex = (int) enumInstance.getClass().getMethod("getIndex").invoke(enumInstance);
if (enumIndex == intFromDb) {
return enumInstance;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return obj;
}


调用:

String sql = "select * from  table where id = "+id;
DefaultBeanProcessor bean = new DefaultBeanProcessor();
RowProcessor convert = new BasicRowProcessor(bean);
ResultSetHandler<Plan> rsh = new BeanHandler<>(Bean.class, convert);
Bean bean = queryRunner.query(sql, rsh);

Apache DbUtils 源码分析 | Apache DbUtils Source Code Analysis

本文转自:点击打开链接 上一篇文章Apache DbUtils 使用教程详细讲解了DbUtils的特性和使用方法,如果你厌倦了Hibernate的笨重,也不想用IBatis,...
  • zhuyucheng123
  • zhuyucheng123
  • 2014年07月26日 18:29
  • 1925

DBUtils – BeanProcessor扩展,支持自定义字段映射

ApacheCommos的DbUtils是一个简单好用的轻量级的数据库操作工具,该项目的主页是:http://commons.apache.org/dbutils/,关于它的信息可以从那里获取. 在...
  • juroney1
  • juroney1
  • 2014年03月30日 23:09
  • 353

Enum的toString方法

定义一个枚举型的变量(Enum),如:Public Enum Status        Initial = 0        Process = 1        Finished = 2End E...
  • vividboy
  • vividboy
  • 2006年07月24日 16:30
  • 5190

DBUtils学习----BeanProcessor类

作用: 匹配列名到Bean属性名,并转换结果集列到Bean对象的属性中 解析:package org.apache.commons.dbutils;import java.beans.BeanIn...
  • lgh1992314
  • lgh1992314
  • 2017年08月20日 13:26
  • 178

C# : Enum and overriding ToString on it

I saw two posts on Enums today on Eric Lipperts and Chris Rathjen's blog. Enums are significantly di...
  • jiangzhanchang
  • jiangzhanchang
  • 2011年05月26日 22:36
  • 1919

Java高级特性之枚举(二)

01.Enum不可以有public或者protected的构造方法,只能是private或friendly(就前面不用修饰符),这样可以保证客户代码不能新建一个Enum的实例,我们也不需要实例化Enu...
  • QQ1130141391
  • QQ1130141391
  • 2013年10月09日 20:19
  • 3565

DBUtils架构分析

首先,我们看看DBUtils的组织架构图 一点一点来看,AbstructQueryRunner封装了PreparStatement的产生与装填,同时还包括了对数据库资源的关闭等操作。它有两个...
  • dlf123321
  • dlf123321
  • 2015年04月22日 22:53
  • 1016

重写_注解_枚举

       java中方法的重载与重写易混,之前虽然记了好多遍,但没过多久又会忘记,今天彻底将它 们区分! 一、      重载发生在一个类中的多个方法之间,重写也是发生在方法之间,但是重写发生在不...
  • ET0019
  • ET0019
  • 2011年01月23日 21:34
  • 1205

DbUtils(二) 结果集实例——handler应用

单行数据处理:ScalarHandler    ArrayHandler    MapHandler    BeanHandler       多行数据处理:BeanListHandler   ...
  • bestzhaoshilei
  • bestzhaoshilei
  • 2017年07月06日 09:53
  • 245

C#方法重写全面介绍

C#语言有很多值得学习的地方,这里我们主要介绍C#方法重写,包括介绍 virtual 修饰符和override 修饰符等方面。 C#方法重写 通过为声明的方法提供新的实现,派生类可以重写基类的方法...
  • wolf_121
  • wolf_121
  • 2012年11月29日 21:03
  • 680
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:dbutils 重写BeanProcessor 部分方法,支持enum的转换
举报原因:
原因补充:

(最多只允许输入30个字)