解决getJdbcTemplate往oracle数据库中插入数据返回主键出错问题

解决getJdbcTemplate往oracle数据库中插入数据返回主键出错问题

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

     我们使用Spring中的JdbcDaoSupport往Mysql中插入数据并返回主键代码,我们使用的mysql数据库,主键在数据库中设置为自增长:该类继承自JdbcDaoSupport,所以能直接使用getJdbcTemplate()

	public int saveUser(String userName,int age,String password){
		getJdbcTemplate().update(new PreparedStatementCreator() {
		public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
			String sql = "insert into tb_user (username,age,password) " +
			"values(?,?,?)";
			PreparedStatement ps = connection.prepareStatement(sql,	Statement.RETURN_GENERATED_KEYS);
			ps.setString(1, userName);
			ps.setString(2, age);
			ps.setString(3, password);
			return ps;
		}
	}, keyHolder);
	Integer generatedId = keyHolder.getKey().intValue();
	return generatedId;
	}

当我们数据库换成oracle数据库时,因为oracle数据库採用序列进行ID标识,我们改动对应的sql语句,其它不变:

	String sql = "insert into tb_user (id,username,age,password) values(SEQ_ZB_USER.nextval,?,?,?)";

执行后它会抛出异常:oracle数据库的number类型不能转换为int类型

换成其它类型也不行,这是由于JdbcDaoSupport中的getJdbcTemplate()不正确oracle支持;

解决方法:继承Spring中的SimpleJdbcDaoSupport,JdbcDaoSupport能做的,SimpleJdbcDaoSupport基本也能完毕,所以继承后,使用其getSimpleJdbcTemplate()方法;

	public int saveUser(String userName,int age,String password){
		//设置參数集合,匹配sql语句中的參数
		MapSqlParameterSource params=new MapSqlParameterSource();
		params.addValue("userName", userName);
		params.addValue("age", age);
		params.addValue("password", password);
		
		KeyHolder keyHolder = new GeneratedKeyHolder();
		String sql = "insert into zb_user (id,username,age,password) " +
		"values(SEQ_ZB_JC_PLAN.nextval,:userName,:age,:password)";
		//须要最后一个String集合列表參数,id表示表主键,否则也会出问题
		getSimpleJdbcTemplate().getNamedParameterJdbcOperations().update(sql, params, keyHolder, new String[]{"id"});
		Integer generatedId = keyHolder.getKey().intValue();
		return generatedId;
	}

执行后,成功执行并返回主键;

至于JdbcDaoSupport和SimpleJdbcDaoSupport的差别,大家能够在网上查阅相关文档进行了解!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118715.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月2日 上午10:00
下一篇 2021年12月2日 上午11:00


相关推荐

  • 哈佛结构和普林斯顿结构的区别_普林斯顿大学和哈佛大学哪个更厉害

    哈佛结构和普林斯顿结构的区别_普林斯顿大学和哈佛大学哪个更厉害哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。      哈佛结构的微处理器通常具有较高的执行效

    2022年10月5日
    4
  • linux的rwx权限,linux权限管理:rwx

    linux的rwx权限,linux权限管理:rwx标签:rwx权限管理简介:r,w,x对文件及目录进行权限管理,从而达到文件及目录管理。1、rwx对于文件而言:r:可读,可以使用类似cat等命令查看文件内容;w:可写,可以编辑或删除此文件;x:可执行,exacutable,可以命令提示符下当作命令提交给内核运行;2、rwx对于目录而言:r:可以对此目录执行ls以列出内部的所有文件;w:可以在此目录创建文件;x:可以使用cd切换进此目录,也可以使用…

    2022年6月10日
    65
  • js全局变量详解

    js全局变量详解前言本文主要介绍3种全局变量的定义方式以及开发中会遇到的一些问题,再加上一点个人见解。首先简单的介绍一下3种全局变量的定义方式vara=1;//方式1b=2;//方式2window.c=3;//方式3这3种形式定义出来的全局变量都属于window对象对于方式1我们都不陌生,方式3也看过不少,方式2的隐似创建方式我们或多或少都干过,例如vara=1;funct

    2022年6月9日
    59
  • pycharm2019.3.3激活成功教程_pycharm界面

    pycharm2019.3.3激活成功教程_pycharm界面PyCharm是由著名的JetBrains公司所打造的一款功能强大的PythonIDE,它具有一般IDE都具备的功能,并且使用起来非常方便好用。最近需求PyCharm激活码的网友非常多,小编就在这里给大家分享一下PyCharm2019最新可用的激活注册码。激活Pycharm专业版的方法有很多,小编在这里主要给大家分享最有效的两种,一种是使用最新可用的注册激活码,一种是使用激活成功教程补丁的方法,这种方法…

    2022年8月27日
    5
  • zyltdlhr

    zyltdlhr

    2022年1月26日
    51
  • python 时间格式(时间戳–格式化时间)的互相转换

    python 时间格式(时间戳–格式化时间)的互相转换

    2021年11月10日
    110

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号