Spring的NamedParameterJdbcTemplate的简单使用
Spring的NamedParameterJdbcTemplate的简单使用
乐在克里特 发表于1年前
Spring的NamedParameterJdbcTemplate的简单使用
  • 发表于 1年前
  • 阅读 210
  • 收藏 0
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

Spring JDBC包提供了JdbcTemplate和它的两个兄弟SimpleJdbcTemplate和NamedParameterJdbcTemplate。

NamedParameterJdbcTemplate类是基于JdbcTemplate类,并对它进行了封装从而支持命名参数特性。

NamedParameterJdbcTemplate主要提供以下三类方法:execute方法、query及queryForXXX方法、update及batchUpdate方法。

命名参数设值有两种方式:java.util.Map和SqlParameterSource:

1)Map:使用Map键数据来对于命名参数,而Map值数据用于设值;

2)SqlParameterSource:可以使用SqlParameterSource实现作为来实现为命名参数设值,默认有MapSqlParameterSource和BeanPropertySqlParameterSource实现;MapSqlParameterSource实现非常简单,只是封装了java.util.Map;而BeanPropertySqlParameterSource封装了一个JavaBean对象,通过JavaBean对象属性来决定命名参数的值。

其中有两个比较实用的两个类,分别是BeanPropertySqlParameterSource、BeanPropertyRowMapper。

BeanPropertySqlParameterSource:可以把实例转化成SqlParameterSource

     例,new BeanPropertySqlParameterSource(new User);

BeanPropertyRowMapper:可以把返回的每一行转化成对应的对象

     例,new BeanPropertyRowMapper<>(CustomSearchVo.class);

项目中的示例:

@Service("repeatContactsService")
public class RepeatContactsService {

    private static final Logger LOG = LoggerFactory.getLogger(RepeatContactsService.class);

    @Resource
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    public int getRepeatContactsCountByPhone(String userid, String phone){
        String sql= "SELECT count(1) FROM tab_user WHERE userid != :userid AND number = :phone";
        Map parmas = ImmutableMap.of("userid",userid,"phone",phone);
        Integer count = null;
        try {
            count = namedParameterJdbcTemplate.queryForObject(sql, parmas, Integer.class);
        } catch (DataAccessException e) {
            LOG.error("获取值时抛错:", e);
        }
        return count;
    }

    public List<RepeatContactsDetailVo> getAllRepeatContacts(String userid) {
        DateTime before = DateTime.now();
        Set<String> phoneSet = new HashSet<>();
        
        String sql = "SELECT contacts_phone FROM tab_contacts WHERE userid=:userid";
        Map param = ImmutableMap.of("userid", userid);
        List<String> phoneList = null;
        try {
            phoneList = namedParameterJdbcTemplate.queryForList(sql , param, String.class);
        } catch (DataAccessException e) {
            LOG.error("获取用户的通讯录和运营商时抛错:", e);
        }

        //生成需要返回的结果
        Map params = ImmutableMap.of("phones", phoneSet, "userid", userid);
        String sql = "SELECT a.name,a.phone,MAX(a.type),b.name userName,b.phone userPhone,b.idcard userIdcard FROM tab_contacts a where call_number in (:phones) AND userid != :userid GROUP BY a.userid,a.phone";
        List<RepeatContactsDetailVo> contactsList = new ArrayList<>();
        try {
            contactsList = namedParameterJdbcTemplate.
                    query(sql, params, new BeanPropertyRowMapper<>(RepeatContactsDetailVo.class));
        } catch (DataAccessException e) {
            LOG.error("获取时抛错:", e);
        }
        return contactsList ;
    }
}

 

推荐看讲NamedParameterJdbcTemplate:

http://www.voidcn.com/blog/victor_cindy1/article/p-6153531.html

讲解JdbcTemplate接口比较好的

https://my.oschina.net/u/218421/blog/38598

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 15
博文 265
码字总数 394729
×
乐在克里特
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: