
本檔案為一個系列,前面章節:
- 小書MybatisPlus第1篇-整合SpringBoot快速開始增刪改查
- 小書MybatisPlus第2篇-條件構造器的應用及總結
書接上回,雖然Mybatis Plus幫我們提供了大量的默認方法,但我們為了實作多表關聯查詢,或者根據不同的查詢條件傳參,實作不同的動態SQL,在這種情況下我們還是需要自定義SQL,不管怎樣我們需要首先通過配置指定Mapper.xml檔案的存盤位置,
mybatis-plus:
mapper-locations: classpath*:/mapper/*Mapper.xml
1、原始的自定義SQL方法
筆者認為:將多表關聯查詢或動態SQL寫在XML檔案里面進行維護,大多數場景下仍然是Mybatis最佳實踐,單表的增刪改查使用Mybatis Plus或者mybatis generator生成代碼,是最佳實踐,
- UserMapper 介面放在
@MapperScan配置的掃描路徑下面,這種方法是Mybatis 為我們提供的,在Mybatis Plus里面仍然可以繼續使用,絲毫不耽誤! - 使用最原始的Mybatis SQL定義方式,在集成BaseMapper的基礎上(mybatis plus),新定義一個介面方法findUser,
public interface UserMapper extends BaseMapper<User> {
List<User> findUser(@Param("name") String name, @Param("email") String email);
}
新定義一個UserMapper.xml,放在mybatis-plus.mapper-locations配置路徑下面,下面的動態SQL表示:
- 當引數name不為null或空串的時候,
AND name = #{name}條件生效 - 當引數email不為null或空串的時候,
AND email = #{email}條件生效
<!--這個里面寫動態SQL、多表關聯查詢都可以勝任-->
<select id="findUser" resultType="com.zimug.example.model.User">
SELECT id,name,age,email
FROM user
<trim prefix="WHERE" prefixOverrides="AND|OR" suffixOverrides="AND|OR">
<if test="name != null and name != '' " >
AND name = #{name}
</if>
<if test="email != null and email != '' " >
AND email= #{email}
</if>
</trim>
</select>
使用測驗
@Test
public void testCustomSQL1() {
String name = "字母"; //name不為空
String email = ""; //email為空串
List<User> list = userMapper.findUser(name,email);
list.forEach(System.out::println);
}
最終執行的SQL為(因為email為空串,所以對應的查詢條件在動態SQL中未被構建):
SELECT id,name,age,email
FROM user
WHERE name = ?
2、自定義介面方法使用Wrapper條件構造器
如果我們想在自定義的方法中,使用Wrapper條件構造器,可以參考下面的方式實作,這種方式雖然簡單,但仍然只適用于單表(可以是多表關聯查詢,但查詢條件也是基于單表的),
- 使用注解方式 + Wrapper ,
${ew.customSqlSegment}是一個查詢條件占位符,代表Wapper查詢條件,
@Select("select * from `user` ${ew.customSqlSegment}")
List<User> selectAll(@Param(Constants.WRAPPER) Wrapper wrapper);
- 使用xml 配置方式 + Wrapper
List<User> selectAll(@Param(Constants.WRAPPER) Wrapper wrapper);
<select id="selectAll" resultType="com.zimug.example.model.User">
select * from `user` ${ew.customSqlSegment}
</select>
通過Wapper傳遞查詢引數
上面兩種方式任意選擇一種,引數都是Wrapper
@Test
public void testCustomSQL2() {
LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>();
query.eq(User::getName, "字母");
List<User> list = userMapper.selectAll(query);
list.forEach(System.out::println);
}
最終執行的SQL為(和上文原始的XML動態SQL實作效果一致,但是查詢條件的構造是針對單表的):
SELECT id,name,age,email
FROM user
WHERE name = ?
歡迎關注我的博客,里面有很多精品合集
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客,
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! ,另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注,
- 《手摸手教你學Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《實戰前后端分離RBAC權限管理系統》
- 《實戰SpringCloud微服務從青銅到王者》
- 《VUE深入淺出系列》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/147241.html
標籤:Java
