mybatis事务内部获取自增主键:
我用的是mysql数据库,用的是spring集成mybatis,
纠结这个问题一年多了,试了很多种方法。以下是需要注意的:
首先mapper.xml代码
SELECT LAST_INSERT_ID()
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}
)
注意:order是AFTER,或者这一项可以不写,默认order的值就是AFTER,
对于mysql,sqlserver,这类数据库,设置了自增,插入之后就有个自增的值,用order=AFTER
对于orcale,这类,使用序列的数据库,要在之前查询,所以使用order=before
sqlSessionFactory代码
最后找到原因,不能设置defaultExecutorType=BATCH,不然无法获取自增主键。
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), [email protected](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]