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

Mybatis關于動態(tài)排序 #{} ${}問題

 更新時間:2022年10月25日 10:57:31   作者:LitongZero  
這篇文章主要介紹了Mybatis關于動態(tài)排序 #{} ${}問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Mybatis動態(tài)排序 #{} ${}問題

在寫Mybatis動態(tài)排序是遇到一個問題,開始,我是這樣寫的

<if test="orderField !=null and orderField != '' ">
? ? order by t.#{orderField} ?#{orderType}
</if>

發(fā)現(xiàn)報錯,后來經(jīng)過查閱資料發(fā)現(xiàn),用#{}會多個' '導致SQL語句失效。

就是說,向上面這樣的,連續(xù)使用#{}進行注入的,會導致SQL語句失效。

所以,改成${}注入就可以了

<if test="orderField !=null and orderField != '' ">
? ? order by t.${orderField} ?${orderType}
</if>

通過動態(tài)排序理解#{}和${}的區(qū)別

在日常開發(fā)中,尤其是在數(shù)據(jù)列表展示中,排序是最基本的功能。一般根據(jù)創(chuàng)建時間倒敘,但有可能碰到動態(tài)排序的需求。

接下來,我們將圍繞由后臺動態(tài)排序進行探討

例如

現(xiàn)在,我們要查詢一張店長表tb_director,我們在原有的父類中,新定義兩個字段

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
?* Entity基類
?*
?* @author 進擊的Java君
?*/
public class BaseEntity implements Serializable
{
? ? private static final long serialVersionUID = 1L;

? ? /** 排序列*/
? ? private String orderField;

? ? /** 排序規(guī)則,升降序*/
? ? private String orderType;

? ? /** 搜索值 */
? ? private String searchValue;

? ? /** 創(chuàng)建者 */
? ? private String createBy;

? ? /** 創(chuàng)建時間 */
? ? @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
? ? private Date createTime;

? ? /** 更新者 */
? ? private String updateBy;

? ? /** 更新時間 */
? ? @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
? ? private Date updateTime;

? ? /** 備注 */
? ? private String remark;

? ? /** 開始時間 */
? ? @JsonIgnore
? ? private String beginTime;

? ? /** 結(jié)束時間 */
? ? @JsonIgnore
? ? private String endTime;

? ? /** 請求參數(shù) */
? ? private Map<String, Object> params;
}

/**
?* 店長表
?* @author 進擊的Java君
?* @date 2021-03-18
?*/
@Entity
@Getter
@Setter
@Table(name = "tb_director")
public class Director extends BaseEntity {
? ??
? ? ?/** 主鍵id */
? ? @Id
? ? @GeneratedValue(strategy = GenerationType.IDENTITY)
? ? private Long id;
? ?
? ? ?/** 店鋪名稱 */
? ? @Column(name = "director_name", unique = true)
? ? private String directorName;

? ? /** 店鋪地址 */
? ? @Column(name = "director_adress", unique = true)
? ? private String directorAdress;
}

現(xiàn)在,我們只需要在mapper.xml中加上sql過濾條件即可

? <!-- 查詢店長信息 -->
? <sql id="selectDirectorVo">
? ? ?select id, director_name,director_adress,director_num,director_create_time,director_up_time,openId
? ? ? ? ?from tb_director
? </sql>
? <!-- 查詢條件 -->
? <sql id="sqlwhereSearch">
? ? ? ? ?<where>
? ? ? ? ? ? ?<if test="directorName !=null and directorName !=''">
? ? ? ? ? ? ? ? ? ? ? AND director_name like concat('%', #{directorName}, '%')
? ? ? ? ? ? ?</if>
? ? ? ? ? ? ?<if test="openId !=null and openId !=''">
? ? ? ? ? ? ? ? ? ? ? AND openId=#{openId}
? ? ? ? ? ? </if>
? ? ? ? ? ? ? ? <if test="id !=null and id !=''">
? ? ? ? ? ? ? ? ? ? ? AND id=#{id}
?? ??? ??? ?</if>
? ? ?? ??? ?<if test="beginTime != null and beginTime != ''"><!-- 開始時間檢索 -->
? ? ? ? ?? ??? ??? ? ?AND date_format(directorCreateTime,'%y%m%d') &gt;= date_format(#{beginTime},'%y%m%d')
? ? ? ? ?? ?</if>
? ? ? ? ? ? <if test="endTime != null and endTime != ''"><!-- 結(jié)束時間檢索 -->
? ? ? ? ? ? ? ? ?? ? ?AND date_format(directorCreateTime,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
? ? ? ? ? ? </if>
? ? ? ? ? ? </where>
? ? ? ? ? ? <!-- 根據(jù)傳入字段動態(tài)過濾 -->
? ? ? ? ? ? <if test="orderField !=null and orderField != '' ">
? ? ? ? ? ? ? ? ? ? ? ? order by ${orderField} ?${orderType}
?? ??? ??? ?</if>
? ? ? ? </sql>
? <!-- 根據(jù)條件查詢店長 -->
? <select id="sel" parameterType="Director" resultMap="DirectorResult">
? ? ? ? ? ? ? ? <include refid="selectDirectorVo"/>
? ? ? ? ? ? ? ? <include refid="sqlwhereSearch"/>
? ? ? ? </select>

持久層代碼編完后,我們只需要在調(diào)用時,傳入我們想進行排序的字段即可。

如下所示:

127.0.0.1:8080/api/director/sel?orderField=director_create_time&orderType=desc

但是這樣的話,就需要我們對表中的字段非常清楚,如果覺得這樣不舒服的話,我們可以對sql進行修改

<if test="orderField !=null and orderField != '' ">
?? ?order by
?? ?<choose>
?? ??? ?<when test="orderField == 'directorName'">
?? ??? ??? ?director_name ${orderType}
?? ??? ?</when>
?? ??? ?<when test="orderField == 'openId'">
?? ??? ??? ?openId ${orderType}
?? ??? ?</when>
?? ??? ?<otherwise>
?? ??? ??? ?create_time ${orderType}
?? ??? ?</otherwise>
?? ?</choose>
</if>

注意事項

使用這樣連續(xù)拼接兩個注入?yún)?shù)時,只能用${},不能用#{}。

如果使用#{orderField},則會被解析成ORDER BY “orderField”,這顯然是一種錯誤的寫法。

  • $ 符號一般用來當作占位符
  • #{}是sql的參數(shù)占位符,Mybatis會將sql中的#{}替換為?號,在sql執(zhí)行前會使用PreparedStatement的參數(shù)設置方法,按序給sql的?號占位符設置參數(shù)值。

預編譯的機制。預編譯是提前對SQL語句進行預編譯,而其后注入的參數(shù)將不會再進行SQL編譯。我們知道,SQL注入是發(fā)生在編譯的過程中,因為惡意注入了某些特殊字符,最后被編譯成了惡意的執(zhí)行操作。而預編譯機制則可以很好的防止SQL注入。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java性能分析jconsole詳解

    java性能分析jconsole詳解

    這篇文章主要介紹了java性能分析jconsole詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • java分割字符串多種方法(附例子)

    java分割字符串多種方法(附例子)

    這篇文章主要給大家介紹了關于java分割字符串多種方法的相關資料,Java中有多種方法可以實現(xiàn)字符串分割,文中將每張方法都給出了代碼示例,需要的朋友可以參考下
    2023-10-10
  • MyBatis框架實現(xiàn)一個簡單的數(shù)據(jù)查詢操作

    MyBatis框架實現(xiàn)一個簡單的數(shù)據(jù)查詢操作

    本文介紹了MyBatis框架下進行數(shù)據(jù)查詢操作的詳細步驟,括創(chuàng)建實體類、編寫SQL標簽、配置Mapper、開啟駝峰命名映射以及執(zhí)行SQL語句等,感興趣的可以了解一下
    2024-12-12
  • jpa使用注解生成表時無外鍵問題及解決

    jpa使用注解生成表時無外鍵問題及解決

    這篇文章主要介紹了jpa使用注解生成表時無外鍵問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 通過java.util.TreeMap源碼加強紅黑樹的理解

    通過java.util.TreeMap源碼加強紅黑樹的理解

    通過分析java.util.TreeMap源碼來對經(jīng)典問題紅黑樹加強理解和理清思路。
    2017-11-11
  • Java性能調(diào)優(yōu)概述

    Java性能調(diào)優(yōu)概述

    本文介紹了Java程序性能的主要表現(xiàn)點、衡量程序性能的主要指標、性能調(diào)優(yōu)的層次、基本調(diào)優(yōu)策略和手段等,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解

    logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解

    這篇文章主要為大家介紹了logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • mybatis+springboot中使用mysql的實例

    mybatis+springboot中使用mysql的實例

    在軟件開發(fā)中,數(shù)據(jù)庫的引入是必不可少的,這里來展現(xiàn)一下通過mybatis框架在springboot中使用mysql,具有一定的參考價值,感興趣的可以了解一下
    2021-07-07
  • mybatis Mapper的xml文件中resultType值的使用說明

    mybatis Mapper的xml文件中resultType值的使用說明

    這篇文章主要介紹了mybatis Mapper的xml文件中resultType值的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Servlet系列兩種創(chuàng)建方式

    Servlet系列兩種創(chuàng)建方式

    本文主要介紹了Servlet系列兩種創(chuàng)建方式,包含Servlet2.5之前使用和Servlet3.0后,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-02-02

最新評論

延吉市| 和平区| 英超| 达拉特旗| 阳高县| 新蔡县| 溆浦县| 项城市| 东海县| 同德县| 安徽省| 广安市| 芜湖市| 阜南县| 竹北市| 屯留县| 凤台县| 长沙市| 泉州市| 九龙县| 合肥市| 彭泽县| 赣州市| 辽中县| 阿拉善左旗| 南召县| 宁乡县| 新建县| 东港市| 出国| 丹寨县| 昔阳县| 遵义市| 苏尼特左旗| 咸丰县| 福州市| 汾阳市| 黄梅县| 玉门市| 普宁市| 密云县|