oracle 导入数据时主键丢失,Oracle 插入数据 返回主键

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值