以前使用JdbcTemplate来获取自增列的值,现在发现NamedParameterJdbcTemplate也可以,而且后者大部分情况下,其实更加方便。

这种方便主要是在于代码维护方面:我们更加习惯于看有意的名称而不是?。

我们来看下二者的具体例子:

@Component
public class NamedJdbcServiceImpl implements NamedJdbcService { @Autowired
NamedParameterJdbcTemplate njdbcTp; @Autowired
JdbcTemplate jdbcTp; @Override
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,rollbackFor=Exception.class)
public int addFamilyWithNJT(String name) {
String sql="insert into family(name) values(:name)";
//使用map传递参数
Map<String,Object> args=new HashMap<String,Object>();
args.put("name",name);
KeyHolder keyHolder=new GeneratedKeyHolder();
SqlParameterSource paramSource=new MapSqlParameterSource(args);
int qty=njdbcTp.update(sql, paramSource, keyHolder);
return keyHolder.getKey().intValue();
} @Override
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,rollbackFor=Exception.class)
public int addFamilyWithNJT2(String name) {
String sql="insert into family(name) values(:name)";
//使用bean/pojo传递参数
Family family=new Family(name);
KeyHolder keyHolder=new GeneratedKeyHolder();
SqlParameterSource paramSource=new BeanPropertySqlParameterSource(family);
int qty=njdbcTp.update(sql, paramSource, keyHolder);
return keyHolder.getKey().intValue();
} @Override
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,rollbackFor=Exception.class)
public int addFamilyWithJT(String name) {
KeyHolder keyHolder=new GeneratedKeyHolder();
jdbcTp.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
String sql="insert into family(name) values(?)";
PreparedStatement ps = null;
ps = con.prepareStatement(sql, new String[] { "custom_id"});
ps.setInt(1, Integer.valueOf(name));
return ps;
}},keyHolder);
return keyHolder.getKey().intValue();
}
}

SqlParameterSource 接口有多个实现,具体如下图:

具体的后代有 BeanPropertySqlParameterSource和MapSqlParameterSource。

这两个实现类的作用就和它们的名字一样,分别通过bean和map的传递值,关联的方式分别是属性和key的名称必须和命名参数的名称一致即可。

相对完整的内容,请参阅 Spring-jdbcTempalate研究 - 正在战斗中 - 博客园 (cnblogs.com)

spring之NamedParameterJdbcTemplate返回自增列值的更多相关文章

  1. mysql 清空或删除表数据后,控制表自增列值的方法

    http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html 方法1: truncate table 你的表名 //这样不但将数据全部删除,而且重新定位自增 ...

  2. MySQL--REPLACE INTO更新自增列值引发的异常

    ##=====================================================================##测试环境:MySQL版本:MySQL 5.7.19复制 ...

  3. sql server自增列值的获取

    IDENT_CURRENT(tbname) 是看表对象.所以没有受作用域限制. SCOPE_IDENTITY()  受作用域限制.同一个会话里面不同作用域也会有差异 @@IDENTITY  受会话限制 ...

  4. SQL Server 强行Insert包含自增列值的记录

    SET IDENTITY_INSERT 表 ON INSERT INTO 表 ([ID] ,[SequenceNumber] ,[EnumCode] ,[Description]) VALUES ( ...

  5. 转:SqlServer2012自增列值突然增大1000的原因及解决方法

    原文链接:http://blog.csdn.net/phoenix36999/article/details/53304126 首先排除数据回滚及增加删除等操作. 按照这篇文章SQL Server 2 ...

  6. SQLServer2012自增列值跳跃的问题

    2012引入的新特性,重启之后会出现值跳跃的问题,如: 解决的方案: 1.使用序列(Sequence),2012引入的和Oracle一样的特性. 2.更改SQLServer启动服务的启动参数,增加[- ...

  7. excel筛选两列值是否相同,如果相同返回第三列值

    见图:

  8. innodb 自增列重复值问题

    1 innodb 自增列出现重复值的问题 先从问题入手,重现下这个bug use test; drop table t1; create table t1(id int auto_increment, ...

  9. MySQL自增列(AUTO_INCREMENT)相关知识点总结

      MySQL的自增列(AUTO_INCREMENT)和其它数据库的自增列对比,有很多特性和不同点(甚至不同存储引擎.不同版本也有一些不同的特性),让人感觉有点稍微复杂.下面我们从一些测试开始,来认识 ...

  10. SQL Server数据库sql语句生成器(SqlDataToScript)的使用(sql server自增列(id)插入固定值)

    SqlDataToScript是根据表数据进行生成 Insert Into语句,此工具还有一个好处是可以对自增列插入固定值,例如:自增的列id值为5,但是5这个行值已经删除,如果想存储Id自增列值为5 ...

随机推荐

  1. [FAQ] chrome.runtime.onMessage 问题, Unchecked runtime.lastError: The message port closed before a response was received

    // quasar background-hook.js chrome.runtime.onMessage.addListener(function (request, sender, sendRes ...

  2. 🎊这个 OpenTiny 开源项目的 CLI 可太牛了,两行命令创建一个美观大气的 Vue Admin 后台管理系统,有手就会,连我的设计师朋友都学会啦啦

    大家好,我是 Kagol,OpenTiny 开源社区运营,TinyVue 跨端.跨框架组件库核心贡献者,专注于前端组件库建设和开源社区运营. 近期尝试了下 OpenTiny 的 CLI 工具,不得不说 ...

  3. K8s应用---Service代理和kube-proxy转发(9)

    一.k8s为什么要用Service四层代理 1.1 四层负载均衡Service: 概念.原理解读 1.pod ip 经常变化,service 是 pod 的代理,我们客户端访问,只需要访问 servi ...

  4. 数据分析之重要模块pandas

    1.简介 基于Numpy构建 pandas的出现,让Python语言成为使用最广泛而且强大的数据分析环境之一 pandas的主要功能 - 具备诸多功能的两大数据结构 Series.DataFrame( ...

  5. 基于权电阻网络的VGA色条显示#DE10-lite#verilog#qp

  6. hbuilder打包报错:java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 7 column 15 path $.icons

    一个棘手的问题,在网上找几乎没有出现这样的案例,个别也只有翻译没有解决方式,,,,,自己研究一番发现这实际上都不算是个问题 这句话翻译:这个位置应该是个对象而不是数组,解决方法: 在manifest. ...

  7. WebGL实现简易的局部“马赛克”

    前言 接触过Canvas的小伙伴应该都知道,在Canvas2D中我们要加载一个图片很简单,通过调用drawImage API就能将图像绘制到画布上,当然在WebGL中我们也可以绘制图像,在绘制时我们需 ...

  8. ruby操作excel

    操作xlsx axlsx插件 操作xls spreadsheet插件

  9. 零知识证明: Tornado Cash 项目学习

    前言 最近在了解零知识证明方面的内容,这方面的内容确实不好入门也不好掌握,在了解了一些基础的概念以后,决定选择一个应用了零知识证明的项目来进行进一步的学习.最终选择了 Tornado Cash 这个项 ...

  10. vue特殊attribute-ref

    vue.js中文社区文档:ref 被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象上.如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素:如果用在子组件上,引 ...