日期:2014-05-17  浏览次数:20723 次

请教jdbcTemplate的问题
请教一个使用jdbcTemplate的问题,在使用jdbcTemplate.query的时候,可以直接返回我们需要的对象或List<Object>,比如:
List<News> newsList = jdbcTemp.query(newsListSql, new NewsRowMapper());
而我们需要写一个NewsRowMapper类来实现RowMapper接口,里面写上结果集合对象封装的过程:


public class NewsRowMapper implements RowMapper<News> {

@Override
public News mapRow(ResultSet resultSet, int rowNum) throws SQLException {
News news = new News();
news.setId(resultSet.getString("id"));
news.setTitle(resultSet.getString("title"));  //如果resultSet里没有title字段,这里就会报错
                return news;
        }
}


那么我的问题是:如果我有两个方法,都是查询news对象,但要求的字段不同,比如:
SQL1是:select id from news;
SQL2是:select id,title from news;
那么jdbcTemplate在使用这个两个sql查询的时候能不能用同一个NewsRowMapper,如果可以,NewsRowMapper需要怎么改?
注:什么每次查询都把字段全部查出来这种方法就不要说了,我举的例子很简单,但实际应用中不行。

------解决方案--------------------
spring的RowMapper有个实现类叫BeanPropertyRowMapper只需要传入要映射的javaBean的class就可以生成相应的javaBean对象集合,这个BeanPropertyRowMapper是会根据查询出来的结果集中的columnLable也就是字段别名如果没有别名就是字段名与属性一致的进行填充而且还会根据数据库的字段命名规则的下划线方式进行相应的转成javaBean的属性命名规则例如数据库字段user_id它可以填充到javaBean中userId属性
jdbcTemplate.query(sql,new BeanPropertyRowMapper(News.class));
------解决方案--------------------
引用:
Quote: 引用:

spring的RowMapper有个实现类叫BeanPropertyRowMapper只需要传入要映射的javaBean的class就可以生成相应的javaBean对象集合,这个BeanPropertyRowMapper是会根据查询出来的结果集中的columnLable也就是字段别名如果没有别名就是字段名与属性一致的进行填充而且还会根据数据库的字段命名规则的下划线方式进行相应的转成javaBean的属性命名规则例如数据库字段user_id它可以填充到javaBean中userId属性
jdbcTemplate.query(sql,new BeanPropertyRowMapper(News.class));

确实可以,不过用这心里好哆嗦。。。如果我数据库里有个字段名是id,而javaBean里写的是newsId是不是就死了?

是的这样spring根本就认为id和newsId没有映射关系.如果你要这么做的话只要自己像JPA那样使用注解来标明映射关系自己继承BeanPropertyRowMapper重写下他的rowMap了