Spring的NamedParameterJdbcTemplate的简单使用

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);

项目中的示例:

1@Service("repeatContactsService") 2public class RepeatContactsService { 3 4 private static final Logger LOG = LoggerFactory.getLogger(RepeatContactsService.class); 5 6 @Resource 7 private NamedParameterJdbcTemplate namedParameterJdbcTemplate; 8 9 public int getRepeatContactsCountByPhone(String userid, String phone){ 10 String sql= "SELECT count(1) FROM tab_user WHERE userid != :userid AND number = :phone"; 11 Map parmas = ImmutableMap.of("userid",userid,"phone",phone); 12 Integer count = null; 13 try { 14 count = namedParameterJdbcTemplate.queryForObject(sql, parmas, Integer.class); 15 } catch (DataAccessException e) { 16 LOG.error("获取值时抛错:", e); 17 } 18 return count; 19 } 20 21 public List<RepeatContactsDetailVo> getAllRepeatContacts(String userid) { 22 DateTime before = DateTime.now(); 23 Set<String> phoneSet = new HashSet<>(); 24 25 String sql = "SELECT contacts_phone FROM tab_contacts WHERE userid=:userid"; 26 Map param = ImmutableMap.of("userid", userid); 27 List<String> phoneList = null; 28 try { 29 phoneList = namedParameterJdbcTemplate.queryForList(sql , param, String.class); 30 } catch (DataAccessException e) { 31 LOG.error("获取用户的通讯录和运营商时抛错:", e); 32 } 33 34 //生成需要返回的结果 35 Map params = ImmutableMap.of("phones", phoneSet, "userid", userid); 36 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"; 37 List<RepeatContactsDetailVo> contactsList = new ArrayList<>(); 38 try { 39 contactsList = namedParameterJdbcTemplate. 40 query(sql, params, new BeanPropertyRowMapper<>(RepeatContactsDetailVo.class)); 41 } catch (DataAccessException e) { 42 LOG.error("获取时抛错:", e); 43 } 44 return contactsList ; 45 } 46}

推荐看讲NamedParameterJdbcTemplate:

http://www.voidcn.com/blog/victor\_cindy1/article/p-6153531.html

讲解JdbcTemplate接口比较好的

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )