场景:解决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的区别,大家可以在网上查阅相关资料进行了解!

oracle 导入数据时主键丢失,Oracle 插入数据 返回主键相关推荐

  1. maya导出fbx没动画_maya做出的动画,导出FBX,在导入max时部分动画丢失,如何解决?...

    maya做出的动画,导出FBX,在导入max时部分动画丢失,如何解决? bailing1254 LV11 2013-04-02 maya做出的动画,导出FBX,在导入max时部分动画丢失,如何解决? ...

  2. MyBatis 插入数据库返回主键

    最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...

  3. mybatis 主键自增 insert后返回主键

    mybatis 主键自增 insert后返回主键 : <insert id="insertStudentAutoKey" parameterType="Studen ...

  4. Mybatis批量插入,返回主键ID不成功,巨坑

    一.场景说明 批量插入,返回主键ID报错 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibati ...

  5. oracle批量插入并且返回自增主键_mybatis + (oracle)实现主键自增 + 插入数据并返回主键...

    一.实现主键自增 在oracle数据库中,主键并没有办法自动增长,无法使用insert对应的useGeneratedKeys和keyProperty属性自动返回增加的主键. 要实现自增需要修改 ID列 ...

  6. oracle导入dmp时覆盖,imp导入dmp时产生错误 ORA-14063、ORA-14048

    imp导入dmp时产生错误 ORA-14063.ORA-14048,错误信息如下: . . 正在导入表 "APP_ASSEM_SET_DICT"导入了 4 行 IMP-00017: ...

  7. java实现数据库主键的更新_Java获取数据库自增主键表中插入数据的ID

    这段代码是为了解决,JDBC中在给自增表插入数据后获取插入数据自动生成的ID问题.上网找了半天资料,原来在JDK中有提供方法哎. 参考资料点击打开链接感谢诸位高手的指点. 直接上代码吧: /** * ...

  8. mysql批量插入没有返回主键id

    在大批量新增数据的时候往往会采用批量插入来提高效率,但是经常遇到没有返回主键的情况. 一般会有以下几种可能: 1.升级Mybatis版本到3.3.1.官方在这个版本中加入了批量新增返回主键id的功能 ...

  9. 给echarts添加筛选时间控件时,控件不显示,并设置数据库无数据时echarts模块显示暂无数据

    给echarts模块添加时间控件时,控件无效,经检查发现,控件被画布遮盖了,需要用一个form标签包括时间控件,否则时间控件不生效.另外,如果echarts从后台获取到的数据为空,需要提示暂无信息.这 ...

最新文章

  1. python swapcase用法_Python swapcase函数有什么用
  2. foreach 语句
  3. 数据分析系列:绘制散点图(matplotlib)
  4. 实验:交换机生成树协议STP--功能验证
  5. GPU和显卡是什么关系?GPU会取代CPU吗?GPU和显卡的区别是什么?
  6. UDP socket 设置为的非阻塞模式
  7. Codeforces Round #225 (Div. 1) E. Vowels 容斥 + sosdp
  8. Java项目问题_Java项目出现的问题01----学习
  9. REVERSE-PRACTICE-BUUCTF-4
  10. php error_get_last(),PHP捕获异常register_shutdown_function和error_get_last的使用
  11. 算法与数据结构1800题 之 栈和队列
  12. vco为什么低频下起振困难_为什么协作如此困难?
  13. C++中获得文件大小
  14. AVL平衡树的插入例程
  15. C/C++编程(尾积相乘)
  16. C# winform 魔兽MH全图制作教程(3):魔兽1.20E.1.24B.1.24E全图内存地址 转自breeze...
  17. LTE学习-OFDM
  18. 转载 centos 7 安装2080ti驱动
  19. android开发 问卷调查案例_「Android问卷调查类型页面及逻辑实现」RadioButton、CheckBox、EditView、单选、多选、输入、...
  20. 人类登月不可或缺 大型机半个世纪发展史

热门文章

  1. Maven 仓库使用与私有仓库搭建
  2. java行转列_最近面试 Java 后端开发的感受!
  3. 采用C编写程序实现从文件读取操作
  4. Tensorflow2.0(2):中文分词(jieba)
  5. XML文件解析--Python
  6. Leecode刷题热题HOT100导航目录
  7. 面向对象的重试模式方法
  8. 在Android上将ONNX神经网络模型与TensorFlow Lite结合使用
  9. Bootstrap 公布长期支持计划,Bootstrap 3 生命周期结束
  10. 实时 Git,在版本控制之前控制源码