我们使用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的区别,大家可以在网上查阅相关资料进行了解!