SpringJDBC无疑极大的方便了我们访问数据库,但是有一个小问题,每次查询操作返回的实体对象不一样,难道我们每次都要重新实现RowMapper吗?利用泛型,可以方便处理这样的操作。
开发环境:Windows10、eclipse、SpringJDBC4.3.7。文末含项目源码下载链接。
1、自我实现RowMapper
/*
* 文件名:LocalRowMapper.java
* 版权:Copyright 2007-2017 517na Tech. Co. Ltd. All Rights Reserved.
* 描述: LocalRowMapper.java
* 修改人:xiaofan
* 修改时间:2017年3月19日
* 修改内容:新增
*/
package com.zxiaofan.dubboProvidder.rowMapper;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import org.springframework.jdbc.core.RowMapper;
/**
*
* @author xiaofan
*/
public class LocalRowMapper<T> implements RowMapper<T> {
/**
* 添加字段注释.
*/
private Class<?> targetClazz;
/**
* 添加字段注释.
*/
private HashMap<String, Field> fieldMap;
/**
* 构造函数.
*
* @param targetClazz
* .
*/
public LocalRowMapper(Class<?> targetClazz) {
this.targetClazz = targetClazz;
fieldMap = new HashMap<>();
Field[] fields = targetClazz.getDeclaredFields();
for (Field field : fields) {
// 同时存入大小写,如果表中列名区分大小写且有列ID和列iD,则会出现异常。
// 阿里开发公约,建议表名、字段名必须使用小写字母或数字;禁止出现数字开头,禁止两个下划线中间只出现数字。
fieldMap.put(field.getName(), field);
// fieldMap.put(getFieldNameUpper(field.getName()), field);
}
}
/**
* {@inheritDoc}.
*/
@Override
public T mapRow(ResultSet rs, int arg1) throws SQLException {
T obj = null;
try {
obj = (T) targetClazz.newInstance();
final ResultSetMetaData metaData = rs.getMetaData();
int columnLength = metaData.getColumnCount();
String columnName = null;
for (int i = 1; i <= columnLength; i++) {
columnName = metaData.getColumnName(i);
Class fieldClazz = fieldMap.get(columnName).getType();
Field fiel