最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Mybatis @Select注解中實現(xiàn)拼寫動態(tài)sql

 更新時間:2020年11月30日 14:50:44   作者:apicescn  
這篇文章主要介紹了在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ù)或標記組成。需要對這樣的標簽符號進行轉義即可。

補充知識: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)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java實現(xiàn)AES加密和解密方式完整示例

    Java實現(xiàn)AES加密和解密方式完整示例

    這篇文章主要給大家介紹了關于Java實現(xiàn)AES加密和解密方式的相關資料,AES加密為最常見的對稱加密算法,是一種區(qū)塊加密標準,這個標準用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用,需要的朋友可以參考下
    2023-10-10
  • Springboot項目對數(shù)據(jù)庫用戶名密碼實現(xiàn)加密過程解析

    Springboot項目對數(shù)據(jù)庫用戶名密碼實現(xiàn)加密過程解析

    這篇文章主要介紹了Springboot項目對數(shù)據(jù)庫用戶名密碼實現(xiàn)加密過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Spring Junit測試找不到SpringJUnit4ClassRunner.class的解決

    Spring Junit測試找不到SpringJUnit4ClassRunner.class的解決

    這篇文章主要介紹了Spring Junit測試找不到SpringJUnit4ClassRunner.class的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 詳解Java如何跨平臺獲取MAC地址

    詳解Java如何跨平臺獲取MAC地址

    有時我們因為軟件授權或者其它需要獲取主機唯一標識而需要獲取用戶主機的MAC地址,而本文則將介紹如何通過Java來實現(xiàn)跨平臺獲取MAC地址的兩種方法,需要的朋友可以參考下
    2021-06-06
  • Java如何找出數(shù)組中重復的數(shù)字

    Java如何找出數(shù)組中重復的數(shù)字

    這篇文章主要為大家詳細介紹了Java如何找出數(shù)組中重復的數(shù)字,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • java使用webuploader實現(xiàn)跨域上傳詳解

    java使用webuploader實現(xiàn)跨域上傳詳解

    目前初步接觸JAVA圖片上傳,用的webuploader。已經(jīng)跟后臺對接上,但是有個問題就是跨域請求,通過查找相關資料終于實現(xiàn)了,下面這篇文章主要給大家介紹了關于java使用webuploader實現(xiàn)跨域上傳的相關資料,需要的朋友可以參考下。
    2017-07-07
  • 基于Spring接口集成Caffeine+Redis兩級緩存

    基于Spring接口集成Caffeine+Redis兩級緩存

    這篇文章主要介紹了基于Spring接口集成Caffeine+Redis兩級緩存,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • Java生成唯一訂單號的幾種方式

    Java生成唯一訂單號的幾種方式

    這篇文章主要介紹了Java生成唯一訂單號的幾種方式,訂單號具有唯一標識符的作用,下邊將演示自增、隨機、組合的方式,生成高效、安全、唯一的訂單號,以滿足業(yè)務需求和避免潛在問題,需要的朋友可以參考下
    2025-03-03
  • java字符串相似度算法

    java字符串相似度算法

    這篇文章主要介紹了java字符串相似度算法,是Java實現(xiàn)比較典型的算法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Java單例模式的8種寫法(推薦)

    Java單例模式的8種寫法(推薦)

    這篇文章主要介紹了Java單例模式的8種寫法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01

最新評論

长白| 西和县| 台湾省| 焦作市| 驻马店市| 清涧县| 鄂温| 平和县| 利川市| 潜山县| 大冶市| 萍乡市| 刚察县| 彭泽县| 高青县| 甘孜县| 新巴尔虎左旗| 隆昌县| 岳普湖县| 平南县| 勐海县| 永和县| 安丘市| 宣汉县| 高陵县| 汾阳市| 陇川县| 清水河县| 六枝特区| 阜城县| 承德市| 麻阳| 区。| 永年县| 竹山县| 正镶白旗| 乌拉特后旗| 晋江市| 康保县| 万安县| 集安市|