文档章节

Spring的NamedParameterJdbcTemplate的简单使用

乐在克里特
 乐在克里特
发布于 2017/02/23 13:47
字数 461
阅读 211
收藏 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
博文 268
码字总数 394729
作品 0
杭州
程序员
spring jdbctemplate 项目使用完整记录

一、前言 项目使用jdbctemplate已经一段时间了,对于jdbcTemplate的使用有了一些小小心得,这里总结后跟大家分享下。 二、spring xml 配置jdbcTemplate 三、通过DBColumnMapper、泛型封装添加...

漂泊者及其影子
2015/05/27
0
0
spring jdbc是如何实现驼峰和下划线的自动映射的

今天在看写代码的时候突然发现,在类和数据库字段之间没有做过任何的映射关系,但是数据会自动的映射好 以下是spring代码的具体实现直接贴代码 讲述映射实现的过程 关注下BeanPropertyRowMa...

时光流转
07/10
0
0
对JDBC的支持 之 7.2 JDBC模板类

JDBC模板类 概述 Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式。 JdbcTemplate类通过模...

heroShane
2014/02/27
0
0
spring--(23)具名参数

在上一篇中,jdbc的传参形式是 ?,如果参数比较多或者是参数的位置发生改变,则传参对应的位置也需要改变,十分的不方便。这篇中采用具名参数的形式传参,有效的解决了上述问题。 xml配置文...

求是科技
2016/09/04
0
0
Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数

在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定. 在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选...

HappyBKs
2015/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 到底谁是小公猫……

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享Trivium的单曲《Throes Of Perdition》 《Throes Of Perdition》- Trivium 手机党少年们想听歌,请使劲儿戳(这里) @小鱼丁:...

小小编辑
42分钟前
51
1
基础选择器

注意:本教程参考自网上流传的李兴华老师的jquery开发框架视频,但是苦于没有相应的配套笔记,由我本人做了相应的整理. 本次学习的内容 学习jquery提供的各种选择器的使用,掌握了jquery选择...

江戸川
48分钟前
1
0
Spring中static变量不能@value注入的原因

今天本想使用@Value的方式使类中的变量获得yml文件中的配置值,然而一直失败,获得的一直为null。 类似于这样写的。 public class RedisShardedPool { private static ShardedJedisPool pool...

钟然千落
今天
2
0
CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部