mybatis 事务内部获取自增主键

mybatis事务内部获取自增主键:


我用的是mysql数据库,用的是spring集成mybatis,

纠结这个问题一年多了,试了很多种方法。以下是需要注意的:

首先mapper.xml代码

  <insert id="insert" parameterType="cn.cq.shenyun.entity.domin.User" >
    <selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER" >
      SELECT LAST_INSERT_ID()
    </selectKey>
    insert into user ( id,create_time, email,
      login_name, nick_name, password, 
      phone_num, city_id, recode_date
      )
    values ( #{id,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, #{email,jdbcType=VARCHAR},
      #{loginName,jdbcType=VARCHAR}, #{nickName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, 
      #{phoneNum,jdbcType=VARCHAR}, #{cityId,jdbcType=VARCHAR}, #{recodeDate,jdbcType=TIMESTAMP}
      )
  </insert>

注意:order是AFTER,或者这一项可以不写,默认order的值就是AFTER,

对于mysql,sqlserver,这类数据库,设置了自增,插入之后就有个自增的值,用order=AFTER

对于orcale,这类,使用序列的数据库,要在之前查询,所以使用order=before


sqlSessionFactory代码

	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:mybatis/mybatis.xml" />
		<property name="mapperLocations" value="classpath:cn/cq/shenyun/dao/mapper/*.xml"></property>
	</bean>

扫描mapper.xml的时候,要用mapperLocations,不要用configLocation,我也不知道原因,反正就是因为这个原因困扰了我一年多。

最后找到原因,不能设置defaultExecutorType=BATCH,不然无法获取自增主键。

<configuration>
<settings>
<!--这儿不能配置defaultExecutorType=BATCH可以不配置这个属性-->
<setting name="defaultExecutorType" value="BATCH"/>
</settings>
</configuration>



java代码:

	@Transactional
	public User register(String email,String password) throws EmailRepeatException {

		User user=new User();
		user.setEmail(email);
		user.setCreateTime(new Date(System.currentTimeMillis()));
		user.setPassword(confusionPassword(password));
		Integer id=userDao.save(user);
		System.out.println("id:"+id);//这儿表示影响的行数
		System.out.println("userid:"+user.getId());//  这样就能获取自增的主键了 ,

		return user;
	}


打印的日志:

13:49:27.319 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
13:49:27.325 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2c48d1fc]
13:49:27.332 [main] DEBUG o.m.s.t.SpringManagedTransaction - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@313d6965] will be managed by Spring
13:49:27.384 [main] DEBUG c.c.s.dao.mapper.UserMapper.insert - ==>  Preparing: insert into user ( id,create_time, email, login_name, nick_name, password, phone_num, city_id, recode_date ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ? ) 
13:49:27.427 [main] DEBUG c.c.s.dao.mapper.UserMapper.insert - ==> Parameters: null, 2015-05-21 13:49:27.314(Timestamp), 2asdlyluoyongqq@qq.com(String), null, null, e9e371ca63793877ceac8f6eacd8d3b5(String), null, null, null
13:49:27.431 [main] DEBUG c.c.s.dao.mapper.UserMapper.insert - <==    Updates: 1
13:49:27.432 [main] DEBUG c.c.s.d.m.U.insert!selectKey - ==>  Preparing: SELECT LAST_INSERT_ID() 
13:49:27.433 [main] DEBUG c.c.s.d.m.U.insert!selectKey - ==> Parameters: 
13:49:27.449 [main] DEBUG c.c.s.d.m.U.insert!selectKey - <==      Total: 1
13:49:27.451 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2c48d1fc]
id:1
userid:13
13:49:50.913 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2c48d1fc]
13:49:50.940 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2c48d1fc]

注意查看:insert 语句和 SELECT LAST_INSERT_ID() 语句在一个事务中,并且SELECT LAST_INSERT_ID()在insert之后。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值