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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在抽象类注入`JdbcTemplate`时,需要注意一些细节。如果您在抽象类注入`JdbcTemplate`,并且在子类使用它,可能会出现`NullPointerException`异常。 这是因为在注入`JdbcTemplate`时,Spring并不会知道应该将哪个`JdbcTemplate`注入到哪个子类。因此,您需要通过在子类使用`@Qualifier`注解来指定要注入的`JdbcTemplate`。 以下是一个示例代码,展示了如何在抽象类注入`JdbcTemplate`并在子类使用它: ```java @Component public abstract class AbstractRepository { @Autowired @Qualifier("jdbcTemplate") private JdbcTemplate jdbcTemplate; public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } } ``` 在上面的代码,我们在抽象类`AbstractRepository`注入了`JdbcTemplate`,并在`getJdbcTemplate()`方法返回它。请注意,我们使用了`@Qualifier`注解来指定要注入的`JdbcTemplate`。 现在,让我们看看一个子类`UserRepository`的例子,它继承了`AbstractRepository`,并使用了`getJdbcTemplate()`方法来执行SQL查询: ```java @Repository public class UserRepository extends AbstractRepository { public List<User> findAll() { String sql = "SELECT * FROM users"; return getJdbcTemplate().query(sql, new BeanPropertyRowMapper<>(User.class)); } } ``` 在子类,我们可以调用`getJdbcTemplate()`方法来获取父类注入的`JdbcTemplate`,并使用它来执行SQL查询。 这样,我们就可以在抽象类注入`JdbcTemplate`并在子类使用它,同时避免了`NullPointerException`异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值