第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

MyBatis insert

1. 前言

本小節(jié),我們將一起學習 MyBatis insert。

在 MyBatis 中,insert 標簽對應(yīng)于 SQL 語句中的 insert 插入;與 select 相比,insert 要簡單許多,只有當需要返回主鍵時,才會麻煩一些,我們將從簡單到復(fù)雜來依次介紹。

2. 定義

慕課解釋:insert 標簽用于映射 SQL 中的插入語句

3. 實例

3.1 xml 實例

下面是一個簡單的 insert 標簽。

<insert id="insertUser" parameterType="com.imooc.mybatis.model.User">
  INSERT INTO imooc_user(id,username,age,score) VALUES (#{id},#{username},#{age},#{score})
</insert>

同 select 一樣,每一個 insert 標簽都必須有一個唯一的 id 和可選的 parameterType。標簽里面則是真正的 SQL 語句,該語句共有 4 個參數(shù),分別對應(yīng) User 類的四個屬性。

3.2 注解實例

如果不使用 xml 的方式,使用注解也可取得同樣的效果,如下:

@Insert("INSERT INTO imooc_user(username,age,score) VALUES (#{username},#{age},#{score})")
int insertUser(User user);

4. insert 屬性

insert 標簽也支持諸多屬性來改變語句的行為。

其中常見且重要的屬性如下表:

屬性 描述
id 在命名空間中的唯一標識符
parameterType 語句的參數(shù)類型,默認可選,MyBatis 會自動推斷
flushCache 設(shè)置為 true 后,只要語句被調(diào)用,都會導致本地緩存和二級緩存被清空,默認為 false
timeout 設(shè)置超時時間
statementType STATEMENT,PREPARED 或 CALLABLE 中的一個,默認為 PREPARED(預(yù)處理)
useGeneratedKeys 取出由數(shù)據(jù)庫自動生成的主鍵,僅對支持主鍵自動生成的數(shù)據(jù)庫有效,默認為 false
keyProperty 主鍵的名稱,必須與useGeneratedKeys 一起使用,默認未設(shè)置

5. 返回主鍵

select 標簽在需要返回被添加記錄的主鍵時,會稍微復(fù)雜一點。

5.1 自增主鍵

5.1.1 xml 方式

如果使用的數(shù)據(jù)庫,如 MySQL,PostgreSQL,這些數(shù)據(jù)庫支持自增主鍵,那么得到返回的主鍵只需添加上 useGeneratedKeys 和 keyProperty 兩個屬性即可。如下:

<insert id="insertUserNoId" useGeneratedKeys="true" keyProperty="id"
        parameterType="com.imooc.mybatis.model.User">
  INSERT INTO imooc_user(username,age,score) VALUES (#{username},#{age},#{score})
</insert>

在 insertUserNoId 中,我們并未添加上 id 參數(shù),而是使用了數(shù)據(jù)庫自增主鍵的特性,keyProperty 屬性值對應(yīng) id 字段的名稱,這樣當語句執(zhí)行成功后,對象的 id 字段會被自動設(shè)置為返回的 id 值。

5.1.2 注解方式

使用下面的注解方式,同樣可以實現(xiàn)同樣的效果:

@Insert("INSERT INTO imooc_user(username,age,score) VALUES (#{username},#{age},#{score})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(User user);

MyBatis 提供了 Options 注解來指定方法調(diào)用的行為。

5.2 selectKey 標簽

5.2.1 xml 方式

如果使用的數(shù)據(jù)庫不支持主鍵自增,如 Oracle,MyBatis 提供了 selectKey 標簽來通過 SQL 語句獲得主鍵。

例如:

<insert id="insertUserNoId" parameterType="com.imooc.mybatis.model.User">
  INSERT INTO imooc_user(username,age,score) VALUES (#{username},#{age},#{score})
  <selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER">
    SELECT LAST_INSERT_ID()
  </selectKey>
</insert>

selectKey 標簽必須在 insert 標簽里面,selectKey 有 4 個屬性,它們的作用如下表:

屬性 描述
keyColumn 數(shù)據(jù)庫字段名,對應(yīng)返回結(jié)果集中的名稱
keyProperty 目標字段名稱,對應(yīng)Java 對象的字段名
resultType id字段的類型
order 執(zhí)行的順序,在 insert 之前調(diào)用為 BEFORE,之后為 AFTER

注意,selectKey 中的語句其實就是 SQL 語句,不同數(shù)據(jù)庫得到主鍵的語句均不一樣。

5.2.2 注解方式

@Insert("INSERT INTO imooc_user(username,age,score) VALUES (#{username},#{age},#{score})")
@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", before = false, resultType = Long.class)
int insertUser(User user);

selectKey 也有相應(yīng)的注解,不過配置屬性略有不同,statement 屬性對應(yīng)標簽中的 SQL 語句,而 before 屬性則對應(yīng)標簽中的 order 屬性,若 before 為 false,則 order 對應(yīng)為 AFTER。

6. 實踐

下面,我們一起來實操鞏固一下。

6.1 例1. 插入用戶

請使用 MyBatis 完成在 imooc_user 表中插入用戶的功能。

分析:

按照 MyBatis 的開發(fā)模式,先在對應(yīng) UserMapper.xml 文件中添加插入用戶的 insert 標簽,然后在 UserMapper.java 中增加上對應(yīng)的方法即可。

步驟:

使用 MyBatis 向數(shù)據(jù)庫中插入用戶。由于我們使用的數(shù)據(jù)庫是 MySQL,因為直接使用 useGeneratedKeys 得到自增主鍵。

首先,我們在 UserMapper.xml 文件中添加上對應(yīng)的 insert 標簽:

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id"
        parameterType="com.imooc.mybatis.model.User">
  INSERT INTO imooc_user(username,age,score) VALUES (#{username},#{age},#{score})
</insert>

然后在 UserMapper.java 中添加對應(yīng)的方法:

package com.imooc.mybatis.mapper;

import com.imooc.mybatis.model.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper {
  int insertUser(User user);
}

結(jié)果:

通過如下代碼,我們運行 insertUser 方法:

UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User();
user.setUsername("insert test");
user.setAge(100);
user.setScore(100000);
int rows = userMapper.insertUser(user);
System.out.println(rows);
// 一定要提交
session.commit();
session.close();

TIPS: 注意,這里必須通過 commit 方法提交會話,語句才會生效。

7. 小結(jié)

  • 絕大多數(shù)情況下,我們都不會在插入時指定 id 的值,而是通過數(shù)據(jù)庫自動去生成。
  • 不同數(shù)據(jù)庫獲得主鍵的 SQL 語句也不同,如果通過 selectKey 獲得主鍵,那么一定要注意數(shù)據(jù)庫廠商之間的差異性。