如下情況適用支持自增的DB,如MySQL。其他情況參見:MyBatis魔法堂:Insert操作詳解(返回主鍵、批量插入)
1.model
public class UserInfo { private int id;//主鍵自增ID private String userName;//姓名 private String account;//登陸賬號 private String password;//密碼 }
2.UserInfoMapper.java
public interface UserInfoMapper { int addUser(UserInfo userInfo); }
3.UserInfoMapper.xml
<insert id="addUser" parameterType="com.xxx.model.UserInfo" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user_info(user_name, account, password) values (#{userName},#{account},#{password}) </insert>
這樣,在插入后,MySQL自增的id就會設置到原來的userInfo對象里。
其中
useGeneratedKeys=
"true"
keyProperty=
"id" 是起作用的關鍵語句。
4.QA
4.1 報錯:org.apache.ibatis.binding.BindingException: Parameter 'id' not found
完整錯誤如下:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [userInfo, param1]
這是因為在addUser()的對象參數前加@Param("userInfo"),而在mapper.xml里寫成
<insert id="addUser" parameterType="com.xxx.model.UserInfo" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user_info(user_name,, account, password) values (#{userinfo.userName},#{userInfo.account},#{userInfo.password}) </insert>
這種情況在不返回自增值是沒有問題的,但一旦設置了useGeneratedKeys就報錯。所以養成良好的習慣,沒事少加@Param!!!
end