原文地址http://www.voidcn.com/article/p-cwqegtpg-hx.html

在使用JdbcTemplate时,一般传参都是用的?来绑定参数,但是对于某种情况就不适用了,例如Sql中如果存在IN,那么写SQL的时候就会比较麻烦,例如,咱们要查ID在某个范围内的数据,一般情况下咱们这么写:

List<String> ids = new ArrayList<String>();
ids.add("id1");
ids.add("id2");
ids.add("id3");
String sql = "SELECT * FROM TEST WHERE ID IN(";
for(int i = 0; i<ids.size();i++){
sql+="?";
if(i!=ids.size()){
sql+=",";
}
}
sql+=")";
List result = getJdbcTemplate.queryForList(sql, ids.toArray());

这里需要提到的类就是NamedParameterJdbcTemplate,他是Spring给开发者提供的一个基于JdbcTemplate的类,他支持命名参数特性。包含了JdbcTemplate中的大部分方法,主要有三类:execute方法、query及queryForXXX方法、update及batchUpdate方法。

咱们可以看一个由NamedParameterJdbcTemplate完成的上述例子:

List<String> ids = new ArrayList<String>();
ids.add("id1");
ids.add("id2");
ids.add("id3");
String sql = "SELECT * FROM TEST WHERE ID IN(:ids)";
Map params = new HashMap();
params.addValue("ids", ids);
NamedParameterJdbcTemplate jdbcTemplate = null;
jdbcTemplate = new NamedParameterJdbcTemplate(getJdbcTemplate());
List reslut = jdbcTemplate.query(sql, params);

可以看到Sql中的参数可以用 :[name] 的方式书写,在执行之前,所有的参数可以放在一个Map中,key为Sql中的参数名,这样的话,就简化了咱们自己拼写Sql的工作量。
其实,这只是NamedParameterJdbcTemplate的好处之一,另一个好处就是,对于同一个参数,多次出现在一条sql中时,也很好处理。
例如咱们要查一个数据,传入的时间参数要在字段F1和字段F2之间。那么可以这么写:

String sql = "SELECT * FROM TEST WHERE F1>:time and F2<:time";
Map params = new HashMap();
params.addValue("time", new Date());
NamedParameterJdbcTemplate jdbcTemplate = null;
jdbcTemplate = new NamedParameterJdbcTemplate(getJdbcTemplate());
List reslut = jdbcTemplate.query(sql, params);

上面咱们利用NamedParameterJdbcTemplate查询时,是将所有参数放入到了一个Map中,其实NamedParameterJdbcTemplate为咱们提供的参数模型不止Map。还有SqlParameterSource和BeanPropertySqlParameterSource。
其中SqlParameterSource和咱们用Map一样,他只是对Map进行了封装。
而BeanPropertySqlParameterSource封装了一个JavaBean对象,通过JavaBean对象属性来决定命名参数的值。
例如咱们创建了一个Bean。

public class User {
private int id;
private String userName;
private String password;
//省略getter和setter
}

现在验证一个登录信息是否正确:

public boolean login(String userName,String password){
NamedParameterJdbcTemplate namedParameterJdbcTemplate = null;
namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(getJdbcTemplate());
User user = new User();
model.setUserName("jialeens");
model.setPassword("hehe");
String sql = "SELECT COUNT(1) FROM USER WHERE USERNAME=:userName AND PASSWORD=:password";
SqlParameterSource paramSource = new BeanPropertySqlParameterSource(user);
int size = namedParameterJdbcTemplate.queryForInt(sql, paramSource);
return size==1;
}

可以看到,传入的参数是一个对象Bean,Sql在执行时,会根据Sql中的参数名去获取对应Bean中的属性。

NamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干; NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能。
public Object queryForObject(String sql, Map paramMap, RowMapper rowMapper)
public Object queryForObject(String sql, SqlParameterSource paramSource, RowMapper rowMapper)
SqlParameterSource的两个主要实现MapSqlParameterSource
和BeanPropertySqlParameterSource
public int update(String sql, SqlParameterSource paramSource, KeyHolder generatedKeyHolder)保存数据获得主键。

public class NamedJdbcTemplate {
// JdbcTemplate是线程安全的
static JdbcTemplate jdbc = new JdbcTemplate(JdbcUtils.getDataSource());
static NamedParameterJdbcTemplate named = new NamedParameterJdbcTemplate(
JdbcUtils.getDataSource());
public static void main(String[] args) {
User user=new User();
user.setMoney(10);
user.setId(2);
// System.out.println(findUser(user));
System.out.println(findUser1(user));
}
static void addUser(User user){
String sql = "insert into user(name,birthday, money) values (:name,:birthday,:money) ";//:后的命名要与列名一致
SqlParameterSource ps=new BeanPropertySqlParameterSource(user);//从user中取出数据,与sql语句中一一对应将数据换进去
KeyHolder keyHolder=new GeneratedKeyHolder();
named.update(sql, ps, keyHolder);
int id=keyHolder.getKey().intValue();//获得主键
user.setId(id);
//Map map=keyholder.getKeys();//这样可以得到联合主键的值
//keyholder.getKeyList();//这样可以得到一些主主键值,若一次添加好几条记录
}
static User findUser1(User user) {
String sql = "select id, name, money, birthday from user where money>:money and id<:id";
SqlParameterSource ps=new BeanPropertySqlParameterSource(user);
Object u=named.queryForObject(sql, ps, new BeanPropertyRowMapper(User.class));
return (User) u;
}
static User findUser(User user) {
String sql = "select id, name, money, birthday from user where money>:m and id<:id";
Object[] args = new Object[] {user.getName(),user.getMoney(),user.getId() };
Map params=new HashMap();
params.put("m", user.getMoney());
params.put("id", user.getId());
Object u=named.queryForObject(sql, params, new BeanPropertyRowMapper(User.class));
return (User) u;
}

Spring JdbcTemplate使用别名传参(NamedParameterJdbcTemplate)的更多相关文章

  1. axios&spring前后端分离传参规范总结

    前后端分离开发的场景下,开发人员的工作内容更加专注与专业,但是也产生了一些额外的沟通成本.比如:本文中为大家说明的前后端参数传递与接受方法.本文主要是面对前端使用axios,后端使用Spring进行参 ...

  2. spring mvc 重定向加传参

    常用: ModelAndViewi: return new ModelAndView("redirect:/toList");  或者 ii:return "redire ...

  3. JdbcTemplate in()传参

    1. 实体类 import java.util.List; public class Param { private List<String> names; private List< ...

  4. MyBatis 强大之处 多环境 多数据源 ResultMap 的设计思想是 缓存算法 跨数据库 spring boot rest api mybaits limit 传参

    总结: 1.mybaits配置工2方面: i行为配置,如数据源的实现是否利用池pool的概念(POOLED – This implementation of DataSource pools JDBC ...

  5. jdbcTemplate传参使用Map或List

    List传参方式 举个例子 sql = "select * from table where id=? and param=?": sql中的参数要用?形式,然后使用list.ad ...

  6. VueJs(11)---vue-router(命名路由,命名视图,重定向别名,路由组件传参)

    vue-router 上篇文章讲了第一篇vue-router相关文章,文章地址:VueJs(10)---vue-router(进阶1) 一.命名路由 有时候,通过一个名称来标识一个路由显得更方便一些, ...

  7. spring mvc controller间跳转 重定向 传参(转)

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  8. Spring cloud Feign不支持对象传参解决办法[完美解决]

    spring cloud 使用 Feign 进行服务调用时,不支持对象参数. 通常解决方法是,要么把对象每一个参数平行展开,并使用 @RequestParam 标识出每一个参数,要么用 @Reques ...

  9. Spring JdbcTemplate 和 NamedParameterJdbcTemplate 使用

    1.简单介绍 DAO层 的一般使用常见的是MyBatis 和 Hibernate,但是Hibernate是重量级的,而且学习成本较高,Mybatis 需要编写大量配置文件及接口文件,对于简单的项目应用 ...

随机推荐

  1. layui的使用说明

    一.定义 layui,是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,跟其他UI框架比较(比如bootstrap.easyui.findui.topu ...

  2. DISK2VHD 转win2008 无法启动

    windows 2008R2物理机,使用微软的DISK2VHD转换成虚拟盘,挂到虚拟机上,无法启动只有光标闪.找来window2008安装盘 选择“修复windows系统”, 调出cmd命令提示符Bo ...

  3. java实现二叉树常见操作

    package com.xk.test.struct.newp; import java.util.ArrayList; import java.util.LinkedList; import jav ...

  4. centos7设置时间

    1.查看时间时区 date 2.修改时区 timedatectl set-timezone Asia/Shanghai # 设置系统时区为上海 3.安装ntp 联网校准时间 yum install n ...

  5. CSS和层叠

    ##常见的CSS属性## color:red  设置元素内容的颜色 <br>text-align:center  设置文字的对齐方式(例:centeer 居中) <br>fon ...

  6. VMWare15.0手动为Mac OS10.14虚拟机安装VMWare Tools

    安装完客户机虚拟机后,无法在虚拟机和本机之间拖拽传输文件,开启虚拟机后,底部提示安装VMWare Tools,但是这里无法安装. 虽然可以联网后使用局域网工具(如FeiQ)来传输,但是老感觉不是太方便 ...

  7. APS系统如何落地?用户实际痛点解析!

    APS软件在中国的发展,在很长的时间内处于非常尴尬的状态:大企业都了解APS很重要,但只有非常少的企业肯真正实施APS软件,处于叫好不叫座的状态.直到工业4.0概念流行后,APS才逐渐被国内企业所认可 ...

  8. OL8.0静默安装Oracle 19C

    首先在edelivery中下载Oracle Linux 8.0 然后就默认安装系统 环境准备工具目前不支持OL8,所以需要手动安装,首先设置内核参数,在/etc/sysctl.conf追加 [root ...

  9. 【学习笔记】大数据技术原理与应用(MOOC视频、厦门大学林子雨)

    1 大数据概述 大数据特性:4v volume velocity variety value 即大量化.快速化.多样化.价值密度低 数据量大:大数据摩尔定律 快速化:从数据的生成到消耗,时间窗口小,可 ...

  10. 部署LNMP应用平台

    一.LNMP应用平台概述 1.概述:LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构.Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/ ...