前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决getJdbcTemplate往oracle数据库中插入数据返回主键出错问题

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

作者头像
全栈程序员站长
发布2022-07-12 16:53:48
8150
发布2022-07-12 16:53:48
举报

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

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

代码语言:javascript
复制
	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语句,其它不变:

代码语言:javascript
复制
	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()方法;

代码语言:javascript
复制
	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.cn/118715.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年12月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档