一、有自增主键的数据库(例如:MySQL/MSDB)
这类数据库使用MyBatis官方说明中的useGeneratedKeys、keyProperty属性
-- useGeneratedKeys,使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键,默认值:false。
-- keyProperty,和parameterType中指定的参数属性保持一致。
<insert id="addTotemUser" parameterType="com.totem.model.TotemUser"
useGeneratedKeys="true" keyProperty="uId">
INSERT INTO t_user(u_name, u_age) VALUES
(
#{uName},
#{uAge}
)
</insert>
主键首先会被写入parameterType中的对应字段,然后再进行入库操作,那么在入库完成之后我们就可以通过传入的javaBean获取主键,而写入语句本身返回的依然是受影响的数据库行数
实例如下图所示:
public void addTotemUser() {
TotemUser totemUser = new TotemUser();
totemUser.setuName("杨玉环");
totemUser.setuAge(18);
totemUserMapper.addTotemUser(totemUser);
System.out.println("返回的主键是:"+totemUser.getuId());
}
二、没有自增主键的数据库(例如:oracle)
Oracle数据库通过序列可以实现主键的生成,那么在写入数据时可以通过selectKey在写入数据之前查询序列,并将序列填入parameterType传入的javaBean中。
此处的查询可以通过order属性进行设置(BEFORE/AFTER)是在INSERT之前还是之后。
此处需要注意的是,如果Mapper中的参数设置了@Param("xxx")别名,那么keyProperty也需要添加别名,否则无法返回主键
实例如下图所示:
<insert id="addUserTest" parameterType="com.totem.model.UserTest">
<selectKey keyProperty="user.id" resultType="java.lang.Integer" order="BEFORE">
SELECT seq_user_test.nextval FROM dual
</selectKey>
INSERT INTO user_test(ID, u_name, u_age, u_address, u_tele)
VALUES
(#{user.id}, #{user.uName}, #{user.uAge}, #{user.uAddress}, #{user.uTele})
</insert>
Integer addUserTest(@Param("user") UserTest userTest);