由于在老项目中没有使用一些持久层的框架,每次查询数据时都是要通过手动的方式取一行一行的赋值,研究了一些持久层框架的代码后,我用了自己的方式去把ResultSet的结果集映射到对应的实体上,这样可以减少写业务是对查询结果处理的繁杂工作
在没写我自己的映射方式时每次查询都要一下的操作
String sql = "select t.DIM_VALUE_CODE, t.DIM_VALUE_NAME from SP_DIM_VALUE_INFO t where t.dim_code = '0E0001' and t.p_dim_value = ? and t.CODE_STATUS = 1";
List<SubEffectOrgVo> result = hibernateDao.query(sql, new Object[] {
orgNo }, new RowMapper<SubEffectOrgVo>() {
@Override
public SubEffectOrgVo mapRow(ResultSet rs, int arg1) throws SQLException {
//每次都要对结果集进行收到的映射
SubEffectOrgVo vo = new SubEffectOrgVo();
vo.setOrg(rs.getString(1));
vo.setOrgName(rs.getString(2));
return vo;
}
});
我优化后的结果如下
(1) 声名一个我们需要查询实体中的字段在一个数组
//args表示SubEffectOrgVo实体中的我们需要查询的字段
String sql = "select t.DIM_VALUE_CODE, t.DIM_VALUE_NAME from SP_DIM_VALUE_INFO t where t.dim_code = '0E0001' and t.p_dim_value = ? and t.CODE_STATUS = 1";
String args[] = {
"org","orgName"};
List<SubEffectOrgVo> result = hibernateDaoForVo.QueryForVoByArrays(sql, args, new Object[] {
orgNo }, SubEffectOrgVo.class);
(2) 通过sql中别名的方式声名我们需要查询的字段
通过t.DIM_VALUE_CODE as org、t.DIM_VALUE_NAME as orgname的方式对字段取一个SubEffectOrgVo实体中字段的别名
(该方式的缺点就是实体vo字段中不能使用驼峰命名法)
String sql = "select t.DIM_VALUE_CODE as org, t.DIM_VALUE_NAME as orgname from SP_DIM_VALUE_INFO t where t.dim_code = '0E0001' and t.p_dim_value = ? and t.CODE_STATUS = 1";
List<SubEffectOrgVo> result = hibernateDaoForVo.QueryForVoByColumnName(sql, new Object[] {
orgNo }, SubEffectOrgVo.class);
工具类的代码
package com.pmss_mg.recoveryMonit.config;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.List;
import javax.annotation.Resource;
import org.apache.poi.hssf