日前有同学在做项目的过程中问道我,这样的一个问题,后来我也遇到了,虽然需求不尽相同,但是大同小异,今天把我做出来的解决方案贴出来供大家参考。
需求(都是),达到如下效果
情况一:表设计如下(没有中间表)
问题:那怎么在对yao表进行查询的时候,使kzb这样的一个多段字段的标识如1,2转化成冠心病,糖尿病这样的需求结果了?
解决思路,在查询集合返回之前,将集合中的每一个对象属性kzb字段进行值的重绘。ResultSet
代码如下(采用Spring MVC) 其实完全可以使用传统的jdbc编程来实现,关键是对 ResultSet的巧妙处理使用
@Repository ( "yaoDao" )
public class YaoDao {
@Resource
private JdbcTemplate jdbcTemplate ;
// 查询所有的 (yao) 药品信息
public List<Yao> queryAllYao() {
String sql= "select * from yao" ;
return (List<Yao>) jdbcTemplate .query(sql, new YaoMapper()) ;
}
// 如果查询的结果 ResultSet 还有下一个,进行 kbz 字段值的重绘
protected class YaoMapper implements RowMapper{
@Override
public Object mapRow(ResultSet rs, int rowNum) throws SQLException{
Yao yao= new Yao();
yao.setId(rs.getInt( "id" ));
yao.setName(rs.getString( "name" ));
// 根据病型 id 查询对应的病型名称,重绘 kbz 字段的值
String kzb=queryBNameByBIDs(rs.getString( "kzb" ));
yao.setKzb(kzb);
return yao;
}
}
// 根据对应病型 id 查询对应的病型名称,得到 kzb 字段的值
public String queryBNameByBIDs(String bids) {
String kzb= "" ;
String sql= "select name from bing where id in(" +bids+ ")" ;
List<Bing> bingList= jdbcTemplate .query(sql, new BeanPropertyRowMapper(Bing. class )) ;
for ( int i = 0; i < bingList.size(); i++) { // 拼接 kzb 多的一端信息
if (i==bingList.size()-1){ // 最后一项不需要加逗号
kzb+=bingList.get(i).getName();
} else {
kzb+=bingList.get(i).getName()+ "," ;
}
}
return kzb;
}
}
情况二:表设计如下(有中间表)
现在一时找不到表了,其实思路和第一种情况很相似,尽量往第一种情况靠就可以了。日后补上。