在Mybatis @Select注解中實現(xiàn)拼寫動態(tài)sql
現(xiàn)在隨著mybatis plus的應用,越來越多的弱化了SQL語句,對于單表操作可以說幾乎不需要進行自己編寫SQL語句了,但對于多表查詢操作目前mybatis plus還沒有很好的支持,還需要自己編寫SQL語句,如:
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.shield.base.model.domain.MenuDO;
import com.shield.base.model.param.MenuTreeParam;
/**
* 基礎數(shù)據(jù)操作對象
*
* @author xxx
* @date 2018/5/18
*/
@Mapper
public interface MenuDAO extends BaseMapper<MenuDO> {
/**
* 根據(jù)菜單編碼獲得所有下級菜單列表(包括本級)
* @param menuId 菜單編碼
* @return 該菜單下的所有菜單列表(包括本級)
*/
@Select("WITH menuTree"
+ " AS"
+ "("
+ " SELECT menu1.father_rowid as id,menu1.son_rowid as parentId,menu1.system_name as menuName,"
+ "menu1.system_full_rowid as menuTreeFlat,menu1.level_value as menuLevel,menu1.homepage_status as homeStatus,"
+ "menu1.menu_status as menuType,menu1.sort as sort,menu1.duty_name as createName,"
+ "menu1.duty_datetime as createDate,menu1.update_datetime as updateDate,menu1.stop_status as status"
+ " FROM system_menu_setup menu1 WHERE menu1.father_rowid = #{menuId}"
+ " UNION ALL"
+ " SELECT menu2.father_rowid as id,menu2.son_rowid as parentId,menu2.system_name as menuName,"
+ "menu2.system_full_rowid as menuTreeFlat,menu2.level_value as menuLevel,menu2.homepage_status as homeStatus,"
+ "menu2.menu_status as menuType,menu2.sort as sort,menu2.duty_name as createName,"
+ "menu2.duty_datetime as createDate,menu2.update_datetime as updateDate,menu2.stop_status as status"
+ " FROM system_menu_setup menu2"
+ " INNER JOIN menuTree T ON menu2.son_rowid = T.id"
+ ")"
+ " SELECT id,parentId,menuName,MenuTreeFlat,menuLevel,homeStatus,menuType,sort,createName,"
+ "createDate,updateDate,status FROM menuTree")
List<MenuDO> selectMenuTreeList(@Param(value = "menuId") Long menuId);
}
這樣整個語句基本上都是寫死的,沒有辦法通過參數(shù)動態(tài)拼接SQL語句,在對于 相同語句不同參數(shù)來拼接SQL語句是十分不便的,而如果使用xml來配置的話可以用
<where>
<if test="stopStatus != null">
and menu.stop_status=#{stopStatus} and roleMenu.stop_status=#{stopStatus}
</if>
<if test="menuSource != null">
and menuSource.menu_source=#{menuSource}
</if>
<if test="userId != null">
and roleUser.operator_rowid=#{userId}
</if>
</where>
但是現(xiàn)在很多公司可能會采用@Select注解方式來編寫SQL語句,而非通過xml 的SQL Mapper,那對于@Select這種該如何做呢?其實很簡單,只是需要用<script>標簽包圍,然后像xml語法一樣書寫即可,無須任何其他類或自定義注解類來完成,具體事例如下:
package com.szss.shield.base.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.shield.base.model.domain.MenuDO;
import com.shield.base.model.param.MenuTreeParam;
/**
* 基礎數(shù)據(jù)操作對象
*
* @author xxxx
* @date 2018/5/18
*/
@Mapper
public interface MenuDAO extends BaseMapper<MenuDO> {
/**
* 根據(jù)當前用戶權限獲取所有權限內(nèi)的菜單列表(不分頁)
* @param menuTreeParam 菜單參數(shù)
* @return 當前用戶權限獲取所有權限內(nèi)的菜單列表
*/
@Select("<script>"
+ " WITH menuTree"
+ " AS"
+ " ("
+ " SELECT menu.father_rowid as id,menu.son_rowid as parentId,menu.system_name as menuName,\n"
+ " menu.level_value as menuLevel,menu.homepage_status as homeStatus,\n"
+ " menu.menu_status as menuType,menu.sort as sort,menu.stop_status as status,CAST(MAX(menuSource.menu_path_url) as VARCHAR) as menuUrl \n"
+ "from system_menu_setup menu \n"
+ " LEFT JOIN system_menu_source_setup menuSource\n"
+ " ON menu.father_rowid=menuSource.system_menu_rowid \n"
+ " LEFT JOIN system_role_custom_menu_setup roleMenu \n"
+ " ON menu.father_rowid=roleMenu.system_menu_rowid \n"
+ " LEFT JOIN system_role_operator_setup roleUser \n"
+ " ON roleUser.system_role_setup_rowid=roleMenu.system_role_rowid \n"
+ " LEFT JOIN system_role_setup role \n"
+ " ON roleUser.system_role_setup_rowid=role.rowid\n"
+ " LEFT JOIN system_department_menu_setup depMenu\n"
+ " ON menu.father_rowid=depMenu.system_menu_rowid\n"
+ "<where>"
+ "<if test='stopStatus != null'>"
+ " and menu.stop_status=#{stopStatus} and roleMenu.stop_status=#{stopStatus}\n"
+"</if>"
+ "<if test='menuSource != null'>"
+ " and menuSource.menu_source=#{menuSource}"
+"</if>"
+ "<if test='userId != null'>"
+ " and roleUser.operator_rowid=#{userId}\n"
+"</if>"
+"</where>"
+ " GROUP BY menu.father_rowid ,menu.son_rowid ,menu.system_name,menu.level_value,menu.homepage_status,\n"
+ " menu.menu_status,menu.sort,menu.duty_name,menu.duty_datetime,menu.update_datetime,menu.stop_status\n"
+ " UNION ALL\n"
+ " SELECT menu2.father_rowid as id,menu2.son_rowid as parentId,menu2.system_name as menuName,\n"
+ " menu2.level_value as menuLevel,menu2.homepage_status as homeStatus,\n"
+ " menu2.menu_status as menuType,menu2.sort as sort,menu2.stop_status as status,CAST('' as VARCHAR) as menuUrl\n"
+ " FROM system_menu_setup menu2\n"
+ " INNER JOIN menuTree T ON menu2.father_rowid= T.parentId\n"
+ " )\n"
+ " SELECT id,parentId,menuName,menuLevel,homeStatus,menuType,sort,status,max(menuUrl) as menuUrl FROM menuTree\n"
+ " GROUP BY id,parentId,menuName,menuLevel,homeStatus,menuType,sort,status\n"
+ " ORDER BY menuLevel,sort"
+ " </script>")
List<MenuDO> selectMenuTreeListByUserId(MenuTreeParam menuTreeParam);
}
至此我們就可以像在xml文件里面一樣愉快的動態(tài)拼接你想要的SQL語句了!
注意:
在@Select注解中采用<script>標簽包圍拼接SQL語句時不能在標簽里有>大于或<小于符號出現(xiàn),否則會報Caused by: org.xml.sax.SAXParseException: 元素內(nèi)容必須由格式正確的字符數(shù)據(jù)或標記組成。需要對這樣的標簽符號進行轉(zhuǎn)義即可。
補充知識:MyBatis + MyBatis Plus + MySQL——查詢語句中字段名為MySQL關鍵字問題解決方案
問題描述
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc,username,create_time,update_time FROM test WHERE id=1' at line 1 ; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc,username,create_time,update_time FROM test WHERE id=1' at line 1] with root cause
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc,username,create_time,update_time FROM test WHERE id=1' at line 1
問題分析
數(shù)據(jù)庫表中將SQL關鍵字作為字段名時,在查詢的時候MySQL無法進行正常查詢。

Maven
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<!--MyBatis-Plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
解決方案
XML
錯誤:DELETE = #{delete}
正確:`DELETE` = #{delete}
注解
在@TableField注解中加入反引號“ ` ”
@TableField("`function`")
private String function;
以上這篇在Mybatis @Select注解中實現(xiàn)拼寫動態(tài)sql就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
解決出現(xiàn) java.lang.ExceptionInInitializerError錯誤問題
這篇文章主要介紹了解決出現(xiàn) java.lang.ExceptionInInitializerError錯誤問題的相關資料,需要的朋友可以參考下2017-01-01
Java使用OpenOffice將office文件轉(zhuǎn)換為PDF的示例方法
OpenOffice是一個開源的辦公套件,它包含了文檔處理、電子表格、演示文稿以及繪圖等多種功能,類似于Microsoft Office,本文將給大家介紹Java使用OpenOffice將office文件轉(zhuǎn)換為PDF的示例方法,需要的朋友可以參考下2024-09-09
SpringBoot使用Maven實現(xiàn)多環(huán)境配置管理
軟件開發(fā)中經(jīng)常有開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境,而且一般這些環(huán)境配置會各不相同,本文主要介紹了SpringBoot使用Maven實現(xiàn)多環(huán)境配置管理,感興趣的可以了解一下2024-01-01
springboot項目組引入JMeter的實現(xiàn)步驟
本文主要介紹了springboot項目組引入JMeter的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
HttpClient 請求 URL字符集轉(zhuǎn)碼問題
這篇文章主要介紹了HttpClient 請求 URL字符集轉(zhuǎn)碼問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01

