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....

DbUtils(二) 结果集实例

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

enum枚举的方法

  • 2015-03-16 21:41
  • 723B
  • 下载

DBUtils的使用方法

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

Xutils中DButils的使用方法

  • 2015-07-09 12:44
  • 12KB
  • 下载

移植u-boot-2011.03到S3C2440(utu2440)的方法与步骤###7.NAND FLASH部分移植和支持NAND FLASH启动和读写

作者:reille本博客网址:http://blog.csdn.net/reille/开发环境:主机:Window XP SP2;linux:VMware7.01+ubuntu9.10;目标板:扬创u...
  • reille
  • reille
  • 2011-06-26 16:41
  • 26637

ES6部分方法点评(三):babel-preset-es2015-loose可转换且移动端兼容性较好的语法

前言由于目前各浏览器对ES6兼容性较低,再加上需要兼容历史上各种版本的浏览器,因此,使用编译器将ES6语法转译成ES5语法则势在必行了。babel是目前最常用的ES6转ES5的工具,但即使是ES5,各...

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

所谓回调,就是在执行某个程序时,具体的封装处理由第三方类来实现,简单一点说就是记录内部,再出来(由第三方类可以对数据进行处理),再返回去继续执行,这个过程就是回调。想要程序具有记录内部的功能就必须定义...

java部分基础类型及时间格式的数据格式相互转换方法整理

目录 目录 1LonglongIntegerint之间的恩怨情仇 2String与intLongbyteByteDoublefloatcharDate令人发指的纠缠 - 22 注意:本次整理涉及...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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