mybatis如何實(shí)現(xiàn)的數(shù)據(jù)庫(kù)排序
mybatis數(shù)據(jù)庫(kù)排序
今天用到了對(duì)數(shù)據(jù)庫(kù)按照倒序進(jìn)行輸出。因?yàn)閯偨佑|mybatis,所以對(duì)這方面還不是太了解,再網(wǎng)上搜了好長(zhǎng)時(shí)間終于找到了一些有用的信息。
我的目標(biāo)是這樣的,數(shù)據(jù)庫(kù)中的信息分為無(wú)效和有效,對(duì)數(shù)據(jù)庫(kù)中的信息的有效值按照倒序進(jìn)行輸出,輸出到表格中,
在網(wǎng)上看到了這樣的語(yǔ)句,SELECT * FROM photo ORDER BY id DESC;于是我就直接拿過(guò)來(lái)用了,但是卻出現(xiàn)了問(wèn)題,因?yàn)槲业氖怯袟l件排序的,
嘗試了幾次后我發(fā)現(xiàn)是這樣寫的, select
<include refid="Base_Column_List" /> from manager_user where is_valid = 1?
ORDER BY id DESC;這樣的話輸出的內(nèi)容就達(dá)到了我的目標(biāo),將語(yǔ)句中的desc換成asc就可以進(jìn)行升序排序
mybatis order by 排序
在使用MyBatis解析xml進(jìn)行排序的時(shí)候,遇見(jiàn)排序無(wú)效的問(wèn)題!
- #將傳入的數(shù)據(jù)都當(dāng)成一個(gè)字符串,會(huì)對(duì)自動(dòng)傳入的數(shù)據(jù)加一個(gè)雙引號(hào)。如:order by #{user_id},如果傳入的值是111,那么解析成sql時(shí)的值為order by “111”, 如果傳入的值是id,則解析成的sql為order by “id”。
- $將傳入的數(shù)據(jù)直接顯示生成在sql中。如:order by ${user_id},如果傳入的值是111,那么解析成sql時(shí)的值為order by 111, 如果傳入的值是id,則解析成的sql為order by id。
方式能夠很大程度防止sql注入
- $方式無(wú)法防止Sql注入。
- $方式一般用于傳入數(shù)據(jù)庫(kù)對(duì)象,例如傳入表名。
- 一般能用#的就別用$。
order by 之后要使用$而非#
附解決代碼段:
其中orderByField就是傳入進(jìn)行排序的參數(shù)值!
<choose>
? <when test="orderByField != null and orderByField !=''">
? ? <choose><when test="isAsc == true">
? ? ? order by ${orderByField} ASC
? </when>
? <otherwise>
? ? order by ${orderByField} DESC
? </otherwise></choose>
? </when>
<otherwise>
? order by id DESC</otherwise></choose>
? ORDER BY
? ? ? ? <choose>
? ? ? ? <when test="sort!=null">
? ? ? ? ? ? ? ? #{sort,jdbcType=VARCHAR}
? ? ? ? ? ? <if test="order!=null">
? ? ? ? ? ? ? ? #{order,jdbcType=VARCHAR}
? ? ? ? ? ? </if>
? ? ? ? </when>
? ? ? ? <otherwise>
? ? ? ? ? ? id asc , create_time asc
? ? ? ? </otherwise>
? ? ?</choose>原因是: #{order,jdbcType=VARCHAR},MyBatis會(huì)自動(dòng)將排序字段當(dāng)成一個(gè)字符串,等同于order by ‘create_time’ ‘desc’,可以通過(guò)執(zhí)行,但無(wú)效,與order by create_time desc結(jié)果不同
解決方法: 使用order,Mybatis會(huì)將其視作直接變量,變量替換成功后,不會(huì)再加上引號(hào)成為字符串,同樣排序順序也一樣
{order},因此
? ORDER BY
? ? ? ? <choose>
? ? ? ? <when test="sort!=null">
? ? ? ? ? ? ? ? ${sort}
? ? ? ? ? ? <if test="order!=null">
? ? ? ? ? ? ? ? ${order}
? ? ? ? ? ? </if>
? ? ? ? </when>
? ? ? ? <otherwise>
? ? ? ? ? ? id asc , create_time asc
? ? ? ? </otherwise>
? ? ?</choose>#能很大程度的防止SQL注入 $無(wú)法防止Sql注入 $用于傳入數(shù)據(jù)庫(kù)對(duì)象 <![CDATA[]]>,在該符號(hào)內(nèi)的語(yǔ)句,不會(huì)被當(dāng)成字符串來(lái)處理,而是直接當(dāng)成sql語(yǔ)句,比如要執(zhí)行一個(gè)存儲(chǔ)過(guò)程。
在mapper文件中寫sql語(yǔ)句時(shí),遇到特殊字符時(shí),如:< > 等,建議使用
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中利用POI優(yōu)雅的導(dǎo)出Excel文件詳解
這篇文章主要給大家介紹了關(guān)于Java中如何利用POI優(yōu)雅的導(dǎo)出Excel文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
java實(shí)現(xiàn)簡(jiǎn)單五子棋小游戲(2)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單五子棋小游戲的第二部分,添加游戲結(jié)束條件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Java實(shí)現(xiàn)文件壓縮與解壓的示例[zip格式,gzip格式]
本篇文章主要介紹了Java實(shí)現(xiàn)文件壓縮與解壓的示例[zip格式,gzip格式],具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01
Spring Security的過(guò)濾器鏈機(jī)制
過(guò)濾器作為 ?Spring Security? 的重中之重,我們需要了解其中的機(jī)制,這樣我們才能根據(jù)業(yè)務(wù)需求的變化進(jìn)行定制,今天來(lái)探討一下 ?Spring Security? 中的過(guò)濾器鏈機(jī)制2022-08-08
Springboot整合Mybatis傳值的常用方式總結(jié)
今天給大家?guī)?lái)的是關(guān)于Springboot的相關(guān)知識(shí),文章圍繞著Springboot整合Mybatis傳值的常用方式展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06

