文档章节

Spring的NamedParameterJdbcTemplate的简单使用

乐在克里特
 乐在克里特
发布于 2017/02/23 13:47
字数 461
阅读 213
收藏 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

© 著作权归作者所有

共有 人打赏支持
乐在克里特
粉丝 16
博文 268
码字总数 394729
作品 0
杭州
程序员
私信 提问
spring jdbctemplate 项目使用完整记录

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

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

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

时光流转
2018/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

没有更多内容

加载失败,请刷新页面

加载更多

scala学习(一)

学习Spark之前需要学习Scala。 参考学习的书籍:快学Scala

柠檬果过
16分钟前
0
0
按钮点击-30秒钟Jquery倒计时实现

记录一个按钮点击后倒计时定时器的功能(常用于短信验证码功能),方便以后查看复用! //(1)定义按钮点击事件,下面第一句应该在jquery的ready函数 $('#querybbs').click(queryBbs);  ...

em_aaron
19分钟前
0
0
通俗易懂解释网络工程中的技术,如STP,HSRP等

导读 在面试时,比如被问到HSRP的主备切换时间时多久,STP几个状态的停留时间,自己知道有这些东西,但在工作中不会经常用到,就老是记不住,觉得可能还是自己基础不够牢固,知识掌握不够全面...

问题终结者
昨天
3
0
看了一下Maven的内容

了解了Maven其实是一个跨IDE的标准构建工具,能推广的原因估计是借了仓库的便利。 另一个作用是可以通过Maven的功能在社区版的IDEA去创建Web项目,下次实践看看

max佩恩
昨天
2
0
day27:expect批量杀进程|

1、linux下当前目录有一个文件ip-pwd.ini,内容如下: [root@localhost_002 shell100]# cat ip-pwd.ini 10.111.11.1,root,xyxyxy10.111.11.2,root,xzxzxz10.111.11.3,root,12345610.......

芬野de博客
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部