實體類屬性如下
public class User {
private Integer id;
private String username;
private String userEmail;
private String userCity;
private Integer age;
// 省略get、set方法
}
如果資料庫支援自動生成主鍵的欄位(比如 MySQL 和 SQL Server),那麼可以設定 useGeneratedKeys=”true”,然後再把 keyProperty 設定到目標屬性上就 OK 了,keyProperty設定的是需要對映到實體類中的屬性。
插入單條記錄
介面定義如下
public int addUser(User user);
介面對應的 Mapper.xml 定義如下所示
<insert id="addUser"
parameterType="com.example.mybatis.entity.User"
useGeneratedKeys="true"
keyProperty="id">
insert into user
(username, user_email, user_city, age)
values (#{username}, #{userEmail}, #{userCity}, #{age})
</insert>
Mybatis會將獲取到的自增主鍵設定到User類中的id屬性
插入多條記錄
介面定義如下
public int addUserList(List<User> userList);
介面對應的 Mapper.xml 定義如下所示
<insert id="addUserList"
parameterType="com.example.mybatis.entity.User"
useGeneratedKeys="true"
keyProperty="id">
insert into user
(username, user_email, user_city, age)
values
<foreach item="item" collection="list" separator=",">
(#{item.username}, #{item.userEmail}, #{item.userCity}, #{item.age})
</foreach>
</insert>
特殊情況
對於不支援自動生成型別的資料庫或可能不支援自動生成主鍵的 JDBC 驅動,MyBatis 有另外一種方法來生成主鍵。這裡有一個簡單的示例,透過select unix_timestamp(now())
可以獲取當前時間戳
<insert id="addUser">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select unix_timestamp(now())
</selectKey>
insert into user
(id, username, user_email, user_city, age)
values (#{id}, #{username}, #{userEmail}, #{userCity}, #{age})
</insert>
在上面的示例中,selectKey
元素中的語句將會首先執行,User的 id 會被設定,然後插入語句會被呼叫。這可以提供給你一個與資料庫中自動生成主鍵類似的行為,同時保持了 Java 程式碼的簡潔。
selectKey 元素描述如下:
<selectKey
keyProperty="id"
resultType="int"
order="BEFORE"
statementType="PREPARED">
屬性 | 描述 |
---|---|
keyProperty |
selectKey 語句結果應該被設定的目標屬性。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。 |
keyColumn |
匹配屬性的返回結果集中的列名稱。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。 |
resultType |
結果的型別。MyBatis 通常可以推斷出來,但是為了更加精確,寫上也不會有什麼問題。MyBatis 允許將任何簡單型別用作主鍵的型別,包括字串。如果希望作用於多個生成的列,則可以使用一個包含期望屬性的 Object 或一個 Map。 |
order |
這可以被設定為 BEFORE 或 AFTER。如果設定為 BEFORE,那麼它會首先生成主鍵,設定 keyProperty 然後執行插入語句。如果設定為 AFTER,那麼先執行插入語句,然後是 selectKey 中的語句 - 這和 Oracle 資料庫的行為相似,在插入語句內部可能有嵌入索引呼叫。 |
statementType |
與前面相同,MyBatis 支援 STATEMENT,PREPARED 和 CALLABLE 語句的對映型別,分別代表 PreparedStatement 和 CallableStatement 型別。 |
本作品採用《CC 協議》,轉載必須註明作者和本文連結