SimpleJdbcTemplate 插入数据,得到插入数据的主键

26 篇文章 0 订阅
13 篇文章 0 订阅

myslq 数据库,主键生成方式是自增,类型是int ;

import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;


private SimpleJdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
}

  1. User user=new User();
  2. user.setUserName("linjia");
  3. user.setPassword("linjia");
  4. String sql="insert into user (userName,password) values (:userName,:password);";
  5. //String sql = "update tb_test1 set username=:username,password=:password,sex=:sex where id=:id";  

  6. KeyHolder keyHolder = new GeneratedKeyHolder();
  7. jdbcTemplate.getNamedParameterJdbcOperations().update(sql, new BeanPropertySqlParameterSource(user), keyHolder);
  8. int userId=keyHolder.getKey().intValue();  



参考一:http://blog.csdn.net/lvhongfen/article/details/7844067


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

之前用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();
}




参考二:


一、简介

SimpleJdbcTemplate内部包含了一个NamedParameterJdbcTemplate,所以NamedParameterJdbcTemplate
能做的事情SimpleJdbcTemplate都能干,SimpleJdbcTemplate相对于NamedParameterJdbcTemplate主要
增加了JDK5.0的泛型技术可变长度参数支持。

增加知识:(NameParameterJdbcTemplate内部包含了一个JdbcTemplate,所以JdbcTemplate能做的事情它都能做.NameParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能)


simpleJdbcTemplate中有些方法不全,比如拿到主键的方法就没有,可以获取到NamedParameterJdbcTemplate
调用它里面的方法 getNamedParameterJdbcOperations()返回的是NamedParameterJdbcOperations其实现就是NamedParameterJdbcTemplate这个类
getJdbcOperations()返回的是JdbcOperation其实现就是JdbcTemplate

SqlParameterSource的两个主要实现MapSqlParameterSourceBeanPropertyParameterSource类,它的作用是将实例中的属性对应到sql中的命名参数上去;而ParameterizedBeanPropertyRowMapper做查询出来的结果映射到java类实例上去;

二、配置

和JdbcTemplate一样,SimpleJdbcTemplate也有3中配置方式:

第一种方式:我们可以在自己定义的DAO 实现类中注入一个DataSource 引用来完 成SimpleJdbcTemplate的实例化。也就是它是从外部“注入” DataSource 到DAO 中,然后 自己实例化SimpleJdbcTemplate,然后将DataSource 设置到SimpleJdbcTemplate对象中。
第二种方式: 在 Spring 的 IoC 容器中配置一个 SimpleJdbcTemplate的 bean,将 DataSource 注入进来,然后再把SimpleJdbcTemplate注入到自定义DAO 中。
第三种方式: Spring 提供了 org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport类 , 这 个 类 中 定 义 了 NamedParameterJdbcTemplate 属性,也定义了DataSource 属性,当设置DataSource 属性的时候,会创 建SimpleJdbcDaoSupport的实例,所以我们自己编写的DAO 只需要继承SimpleJdbcDaoSupport类, 然后注入DataSource 即可。提倡采用第三种方法。虽然下面的用法中采用了前两种方法

配置方法有3种:

1、

Java代码 复制代码 收藏代码
  1. public class UserServiceImpl implements UserService {
  2. private SimpleJdbcTemplate simpleJdbcTemplate;
  3. public SimpleJdbcTemplate getSimpleJdbcTemplate () {
  4. return simpleJdbcTemplate;
  5. }
  6. //注入方法1
  7. public void setSimpleJdbcTemplate (SimpleJdbcTemplate simpleJdbcTemplate) {
  8. this.simpleJdbcTemplate= simpleJdbcTemplate;
  9. }
  10. //其它方法这里省略……
  11. }
public class UserServiceImpl implements UserService {

	private SimpleJdbcTemplate simpleJdbcTemplate;
	
	public SimpleJdbcTemplate getSimpleJdbcTemplate () {
		return simpleJdbcTemplate;
	}

                //注入方法1   
	public void setSimpleJdbcTemplate (SimpleJdbcTemplate simpleJdbcTemplate) {
		this.simpleJdbcTemplate= simpleJdbcTemplate;
	}

               //其它方法这里省略……
}

spring配置文件为:

Xml代码 复制代码 收藏代码
  1. <bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
  2. <property name = "dataSource" ref="dataSource">
  3. </bean>
  4. <bean id="userService" class="com.hxzy.account.simpleJdbcTemplate.UserServiceImpl">
  5. <property name="simpleJdbcTemplate" ref="simpleJdbcTemplate"/>
  6. </bean>

方法2、

Java代码 复制代码 收藏代码
  1. public class UserServiceImpl implements UserService {
  2. private SimpleJdbcTemplate simpleJdbcTemplate;
  3. //注入方法2
  4. public void setDataSource(DataSource dataSource) {
  5. this.simpleJdbcTemplate= new JdbcTemplate(dataSource);
  6. }
  7. //其它方法省略……
  8. }
public class UserServiceImpl implements UserService {

        private SimpleJdbcTemplate simpleJdbcTemplate;
        
        //注入方法2
        public void setDataSource(DataSource dataSource) {
                   this.simpleJdbcTemplate= new JdbcTemplate(dataSource);
        }
     
       //其它方法省略……
}

spring配置文件为:

Xml代码 复制代码 收藏代码
  1. <bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl">
  2. <property name="dataSource" ref="dataSource"/>
  3. </bean>

方法3:继承SimpleJdbcDaoSupport,其内部有个namedParamterJdbcTemplate ,需要注入DataSource 属性来实例化。

Java代码 复制代码 收藏代码
  1. public class UserDaoImpl extends SimpleJdbcDaoSupport implements UserDao {
  2. @Override
  3. public void save(User user) {
  4. String sql = null;
  5. this.getSimpleJdbcDaoSupport().update(sql);
  6. }
  7. //其它方法省略……
  8. }
public class UserDaoImpl extends SimpleJdbcDaoSupport implements UserDao {

	@Override
	public void save(User user) {
		String sql = null;
		this.getSimpleJdbcDaoSupport().update(sql);
	}
        //其它方法省略……
}

spring配置文件:

Xml代码 复制代码 收藏代码
  1. <bean id="userDao" class="com.hxzy.account.jdbcTemplate.UserDaoImpl">
  2. <property name="dataSource" ref="dataSource"/>
  3. </bean>

三、使用

Java代码 复制代码 收藏代码
  1. @Override
  2. public void save(User user) {
  3. String sql = "insert into tb_test1(id,username,password,sex) "
  4. + "values (:id,:username,:password,:sex)";
  5. this.simpleJdbcTemplate.getNamedParameterJdbcOperations().update(sql,
  6. new BeanPropertySqlParameterSource(user));
  7. }
  8. @Override
  9. public void update(User user) {
  10. String sql = "update tb_test1 set username=:username,password=:password,sex=:sex where id=:id";
  11. this.simpleJdbcTemplate.update(sql,
  12. new BeanPropertySqlParameterSource(user));
  13. }
  14. public void deleteById(String id) {
  15. String sql = "delete from tb_test1 where id=?";
  16. this.simpleJdbcTemplate.update(sql, id);
  17. }
  18. public Object queryById(String id) {
  19. String sql = "select * from tb_test1 where id=?";
  20. return simpleJdbcTemplate.queryForObject(sql,
  21. ParameterizedBeanPropertyRowMapper.newInstance(User.class), id);
  22. }
  23. public List<?> queryAll() {
  24. String sql = "select * from tb_test1" ;
  25. return this.simpleJdbcTemplate.query(sql,
  26. ParameterizedBeanPropertyRowMapper.newInstance(clazz));
  27. }
  28. private List<User> queryEntityByExample(User user) {
  29. String sql = "select * from tb_test1 where (username=:username or :username IS NULL) and (password=:password or :password IS NULL)";
  30. return this.simpleJdbcTemplate.query(sql, ParameterizedBeanPropertyRowMapper.newInstance(User.class), new BeanPropertySqlParameterSource(user));
  31. }  

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值