spring simpleJdbcTemplate oracle库中保存记录,获取主键

--------------------------------------------------------前言(废话一点点儿,不需要的请忽略)--------------------------------------------

之前用Mysql库,我们的公共保存方法:

/**
* 插入数据返回数据ID (经验证)

* @param sql
* @param Bean
* @return
*/
public int addObject(String sql, Object bean) {

SqlParameterSource param = new BeanPropertySqlParameterSource(bean);
KeyHolder keyHolder = new GeneratedKeyHolder();
this.simpleJdbcTemplate.getNamedParameterJdbcOperations().update(sql,
param, keyHolder);


return keyHolder.getKey().intValue();
}


后来改用oracle库,修改公共保存数据方法为:

/**

* @param sql
* @param bean
*/
public void addOracleObject(String sql, Object bean) {
SqlParameterSource param = new BeanPropertySqlParameterSource(bean);
this.simpleJdbcTemplate.getNamedParameterJdbcOperations().update(sql,param);
}

//当然我的sql里会注明主键自增相关的序列如:

//insert into processes(id,proname,startfilepath,itemtype) values(processes_seq.nextval,:proname,:startfilepath,:itemtype)

------------------------------------------------------------------OK,进入正题----------------------------------------------------------------------------------------------------

移库后保存的方法,当然用的是addOracleObject,不久发现刚刚保存好的对象需要它的主键,如:表processes我需要id

可是addObject在Oracle中可不适用,大致的报错情况是:

DataRetrievalFailureException: 
The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number]

很纠结啊…………

于是google了一下,

http://stackoverflow.com/questions/11450996/is-there-a-way-to-extract-primary-keyor-rowid-using-namedparameterjdbctemplate

感谢上面的回答,问题终于得以解决,解决方案:

/**
* 插入数据返回数据ID (经验证)

* @param sql
* @param Bean
* @return

* oracle 保存 返回主键
*/
public int add
OracleObject(String sql, Object bean) {

SqlParameterSource param = new BeanPropertySqlParameterSource(bean);
KeyHolder keyHolder = new GeneratedKeyHolder();
this.simpleJdbcTemplate.getNamedParameterJdbcOperations().update(sql,
param, keyHolder,new String[]{"id"});
return keyHolder.getKey().intValue();
}

----------------------------------------------------------------分割线(End)--------------------------------------------------------------------------------------------------------------

总结:

(1)spring 的 SimpleJdbcTemplate掌握的不够好,不能灵活运用;

(2)即使查看源码,仍然无法解决,个人能力需要提升;

(3)看到上面解决方案,全部是English,居然退怯(殊不知这就是解决方法),Learn English是一场持久战,越挫越勇!!!

package com.org.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.stereotype.Repository; import com.org.JdbcTempBaseDao; import com.org.dao.IUserDao; import com.org.model.User; @Repository @SuppressWarnings("all") public class UserDaoImpl extends JdbcTempBaseDao implements IUserDao { @Override public List<User> getUserList() { String sql="select * from user "; final List<User> list= new ArrayList<User>(); jdbcTemplate.query(sql, new RowCallbackHandler(){ @Override public void processRow(ResultSet rs) throws SQLException { User u=new User(); u.setId(rs.getInt("id")); u.setUsername(rs.getString("username")); u.setPassword(rs.getString("password")); u.setCreateDate(rs.getString("createDate")); u.setModifyDate(rs.getString("modifyDate")); u.setType(rs.getString("type")); list.add(u); } }); return list; } @Override public List<User> getUserLists(Map<String, Object> map) { return null; } @Override public Integer getUserCount(Map<String, Object> map) { String sql = "select count(1) from User where id=? "; return getJdbcTemplate().queryForObject(sql, Integer.class,map); } @Override public User getUserById(Integer primaryKeyId) { String sql = "select id,username, password, createDate, modifyDate,type from User where id=?"; List<User> userList = getJdbcTemplate().query(sql, new BeanPropertyRowMapper(User.class), primaryKeyId); if(userList.size() == 0) { return null; } return userList.get(0); } @Override public void delUserById(Integer primaryKeyId) { String sql = "delete from user where id=?"; getJdbcTemplate().update(sql, primaryKeyId); } @Override public User addUser(final User entity) { final String sql = "insert into User(username, password, createDate, modifyDate,type) values(?,?,?,?,?)"; GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); getJdbcTemplate().update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { PreparedStatement psst = connection.prepareStatement(sql, new String[]{"id"}); psst.setString(1, entity.getUsername()); psst.setString(2, entity.getPassword()); psst.setString(3, entity.getCreateDate()); psst.setString(4, entity.getModifyDate()); psst.setString(5, entity.getType()); return psst; } }, keyHolder); entity.setId(keyHolder.getKey().intValue()); return entity; } @Override public void editUser(User entity) { String sql="update user set username=?,password=?"; jdbcTemplate.update(sql, User.class,entity); } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值