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);

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

原文出处:http://www.showcoo.net/56.html ApacheCommos的DbUtils是一个简单好用的轻量级的数据库操作工具,该项目的主页是:http://commons....

spring 后置处理器BeanFactoryPostProcessor和BeanPostProcessor的用法和区别

主要区别就是: BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能,下面举个例子说明 BEAN类: package com.spri...

BeanPostProcessors使用总结

1、BeanPostProcessors接口 如果这个接口的某个实现类被注册到某个容器,那么该容器的每个受管Bean在调用初始化方法之前,都会获得该接口实现类的一个回调。容器调用接口定义的方法时会将...

DbUtils(二) 结果集实例

单行数据处理:ScalarHandler    ArrayHandler    MapHandler    BeanHandler       多行数据处理:BeanListHandler ...

enum枚举的方法

  • 2015年03月16日 21:41
  • 723B
  • 下载

C++中enum与字符串或CString互相转换的方法

C++中没有专门为enum与字符串或CString互相转换的直接方法,但是工作中会常遇到相互转换的场景。下面介绍一种自己实现的方法,首先得定义一个enum类型,同时,定义一个与之对应的字符串类型,然后...

Xutils中DButils的使用方法

  • 2015年07月09日 12:44
  • 12KB
  • 下载

DBUtils的使用方法

今天使用DBUtils的时候遇到了一些问题,造成问题的原因是没弄清QueryRunner两种构造方法的区别。 QueryRunner的构造方法中常用的两种有: 1.默认的构造方法:QueryRunn...

使用回调函数,简单模拟dbutils中Queryrunner的工作原理,并重写Queryrunner,使其使用起来更加简单方便

所谓回调,就是在执行某个程序时,具体的封装处理由第三方类来实现,简单一点说就是记录内部,再出来(由第三方类可以对数据进行处理),再返回去继续执行,这个过程就是回调。想要程序具有记录内部的功能就必须定义...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:dbutils 重写BeanProcessor 部分方法,支持enum的转换
举报原因:
原因补充:

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