1. 程式人生 > 程式設計 >詳解Mybatis註解寫法(附10餘個常用例子)

詳解Mybatis註解寫法(附10餘個常用例子)

【前言】

Mybatis 除了 XML 配置寫法,還可以使用註解寫法。

首先需要引入 Mybatis 的依賴:

<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>1.3.2</version>
</dependency>
<dependency>
  <groupId>tk.mybatis</groupId>
  <artifactId>mapper-spring-boot-starter</artifactId>
  <version>1.1.3</version>
</dependency>

然後在介面上打上對應 @Mapper 註解

下面是常用的 Myatis 註解寫法:

【1】新增物件( 非自增 ID)

插入的時候,資料庫的值欄位會自動匹配物件中同名稱屬性的值。

@Insert(value = { "INSERT INTO user (id,name,age,remark) VALUES (#{id},#{name},#{age},#{remark})" })
public void addUser(User user);

【2】新增物件( 自增 ID)

如果資料庫user表的 id 是自增長,我們可以加上@Options 註解,那麼該物件在插入後,id 屬性會自動獲取到主鍵。

@Options(useGeneratedKeys=true,keyProperty="id") 其中的 id 對應資料庫表中的主鍵欄位。

@Insert(value = { "INSERT INTO user (name,remark) VALUES (#{name},#{remark})" })
@Options(useGeneratedKeys=true,keyProperty="id")
public void insertUser(User user);

【3】根據 ID 查詢物件

@Param(value = "id") 其中的 id 對應 SQL 語句中的 #{id}

@Select("SELECT * FROM user WHERE id = #{id}")
public User getUserById(@Param(value = "id") long id);

在查詢物件的過程中,表字段會自動裝箱給同名屬性。當然,也可以寫成繫結形式。

如下:@Result 註解中 property 是物件欄位,column 是表字段。

@Select("SELECT * FROM user WHERE id = #{id}")
@Results({
 @Result(property="id",column="id"),@Result(property="name",column="name"),@Result(property="age",column="age"),@Result(property="remark",column="remark"),})
public User getUserById(@Param(value = "id") long id);

【4】大於 ( > )查詢

在SQL 語句中,直接寫作 > ,但在 xml 中,大於通常用轉義> 替代 ( xml 寫法介紹詳見 6.2)。

@Select("SELECT * FROM user WHERE age > #{age}")
public List<User> getUserList(@Param(value = "age") Integer age);

【5】小於 ( < ) 查詢

在SQL 語句中,直接寫作 < ,但在 xml 中,小於通常用轉義< 替代 ( xml 寫法介紹詳見 6.2)。

@Select("SELECT * FROM user WHERE age < #{age}")
public List<User> getUserList(@Param(value = "age") Integer age);

【6】IN 關鍵字查詢

(6.1)帶 IN的子查詢

@Select("SELECT * FROM user WHERE id IN (SELECT id FROM user WHERE name = #{name})")
public List<User> getUserList(@Param(value = "name") String name);

(6.2)帶 IN 的集合查詢

List 集合,Set集合,陣列 都適用。

注意:@Select({"<script>","xx1","xx2","</script>"}) 這種寫法為xml 方式寫法。所有 SQL 都在 <script> </script> 這對標籤之中,標籤之外是一對大括號,<script> 標籤內的所有引數在最後執行 SQL 的時候會自動拼接,如這裡為xx1xx2,以此類推。<script> 標籤內還可以內嵌標籤,比如下面裡的 <foreach>,標籤內所有引號都為單引號。

@Select({"<script>","SELECT * FROM user WHERE id IN ","<foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach>","</script>"})
public List<User> getUserList(@Param(value = "ids") List<Long> ids);

在 Postgrelsql 中,如果邏輯SQL中的 IN 和ANY 的語義相同,那麼儘量用 ANY,這樣會更加效率。如:

@Select("SELECT * FROM user WHERE id = ANY(#{ids}::integer[])")
public List<SubOrderPO> getUserList(@Param(value = "ids") Integer[] ids);

【7】LIKE 關鍵字查詢

@Select("SELECT * FROM user WHERE name LIKE concat('%','%') ")
public List<User> getUserList(@Param(value = "name") String name);

【8】時間查詢

(8.1)Date 型別:直接傳入進行比較

@Select("SELECT * FROM user WHERE create_time > #{createTime}")
public List<User> test(@Param(value = "createTime") Date createTime);

(8.2)String 型別:需要將其轉化( 時間精度可以按自己需要裁取)

Mysql :STR_TO_DATE('2008-08-08 08:08:08','%Y-%m-%d %H:%i:%s')

Postgrelsql :to_timestamp('2008-08-08 08:08:08','yyyy-MM-dd hh24:mi:ss')

Oracle :to_date( '2008-08-08 08:08:08','yyyy-MM-dd HH24:mi:ss' )

如 Mysql 寫法:

@Select("SELECT * FROM user WHERE create_time > STR_TO_DATE(#{createTime},'%Y-%m-%d %H:%i:%s')")
public List<User> test(@Param(value = "createTime") String createTime);

【9】高階查詢( 動態SQL )

注意:【>】是大於(>)的轉義,【<】 是小於(<)的轉義

@Select({"<script>","SELECT * FROM user ","<where>","<if test = 'name != null' >"," AND name LIKE concat('%','%') ","</if>","<if test = 'age != null and age != 0' >"," AND age < #{age} ","</where>","</script>"})
public List<User> getUserList(@Param(value = "name") String name,@Param(value = "age") Integer age);

【10】修改物件

@Update("UPDATE user SET name = #{name} WHERE id = #{id}")
public void update(@Param(value = "id") Long id,@Param(value = "name") String name);

【11】刪除物件

@Delete("Delete FROM user WHERE id = #{id}")
public void delete(@Param(value = "id") Long id);

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。