原文地址:https://www.iteye.com/blog/itommy-2354746

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")
@Transactional
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

Spring的NamedParameterJdbcTemplate的简单使用的更多相关文章

  1. Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(二)

    然后是项目下的文件:完整的项目请看  上一篇 Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(一) 项目下的springmvc-servlet.xml配置文件: ...

  2. Spring security oauth2最简单入门环境搭建

    关于OAuth2的一些简介,见我的上篇blog:http://wwwcomy.iteye.com/blog/2229889 PS:貌似内容太水直接被鹳狸猿干沉.. 友情提示 学习曲线:spring+s ...

  3. Spring+Netty4实现的简单通信框架

    参考:http://cpjsjxy.iteye.com/blog/1587601 Spring+Netty4实现的简单通信框架,支持Socket.HTTP.WebSocket_Text.WebSock ...

  4. Spring整合JDBC实现简单的增删改

    Spring整合JDBC实现简单的增删改: 1.导入Spring的包和数据库的驱动包: 2.选择一个数据源(dbcp和C3P0) 3.导入数据源的包(这里我们使用dbcp) <span styl ...

  5. Spring data jpa 实现简单动态查询的通用Specification方法

    本篇前提: SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法 这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字 ...

  6. SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

    软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...

  7. Spring 的 NamedParameterJdbcTemplate(转)

    NamedParameterJdbcTemplate类是基于JdbcTemplate类,并对它进行了封装从而支持命名参数特性. NamedParameterJdbcTemplate主要提供以下三类方法 ...

  8. Spring JDBC NamedParameterJdbcTemplate类示例

    org.springframework.jdbc.core.NamedParameterJdbcTemplate类是一个具有基本JDBC操作的模板类,允许使用命名参数而不是传统的’?‘占位符. 这个类 ...

  9. [Java定时器]用Spring Task实现一个简单的定时器.

    今天做一个项目的的时候需要用到定时器功能.具体需求是: 每个月一号触发一次某个类中的方法去拉取别人的接口获取上一个月份车险过期的用户.如若转载请附上原文链接:http://www.cnblogs.co ...

随机推荐

  1. sql比较字符串,比的到底是什么?

    sql里有nvarchar类型的日期数据time1:2019-10-09 00:00:00, 现给定string类型日期time2:2019-10-01 23:59:59,比较两个日期的大小, 发现可 ...

  2. datatable转layui表格【偏原理】

    如题这个类负责把datatable转换为layui表格可以显示的内容.适合配合表格url字段的webapi服务端,为其返回响应字符串.代码如下:using System;using System.We ...

  3. 图层树右键菜单结合Command操作过程

         图层树右键菜单结合Command操作过程 根据老师线上培训图层树右键菜单的生成,添加contextMenuStrip后再依次添加.命名ToolStripMenuItem,若将全部‘项’添加C ...

  4. MySQL——python交互

    与python交互之前我们需要安装一个MySQL的驱动模块Connector,这个驱动模块直接在cmd命令行输入 pip install mysql.connector 安装是否成功可以接着输入 py ...

  5. doucment的获取节点的信息

    document.activeElement 返回当前获取焦点元素 document.addEventListener() 向文档添加句柄 document.adoptNode(node) 从另外一个 ...

  6. QT在Mac OS上编译运行初体验

    QT是一个跨平台的框架,支持PC端(Windows.Linux和Mac OS)以及移动端(Android和IOS),之前的开发大都在Windows或者Ubuntu上,考虑到项目多平台支持性,本文对Ma ...

  7. 面试题:android用户注册代码 密码需要加密传输吗

    答案是肯定的,至少比明文好 客户端注册和登录的时候:一个可行的方法是,客户端提交 md5(password) 密码(如上所述,此方法只是简单保护了密码,是可能被查表获取密码的). 注册的时候:服务端数 ...

  8. <Android Studio> 2.APP开机启动

    开机启动,也就是App随着机器开机而启动,在很多工业场景中是非常常见的. 开机启动的基本原理就是监听系统启动相关的广播,然后启动App. 为了实现开机启动,我人为的分为几个步骤 1.创建broadca ...

  9. 使用gacutil把COM组件注册到全局缓存GAC中

    我们在编写软件的时候,有时候需要调用COM组件,那就需要注册了,注册有两种,一种是使用regasm 在程序运行的时候注册,参考“pb调用C#编写的DLL类库“,不过受路径的限制.还有一种注册方式,使用 ...

  10. django framework插件类视图分页

    分页 继承APIView类的视图中添加分页 from rest_framework.pagination import PageNumberPagination class MyPageNumberP ...