mybatis如何實現(xiàn)的數(shù)據(jù)庫排序
mybatis數(shù)據(jù)庫排序
今天用到了對數(shù)據(jù)庫按照倒序進行輸出。因為剛接觸mybatis,所以對這方面還不是太了解,再網(wǎng)上搜了好長時間終于找到了一些有用的信息。
我的目標是這樣的,數(shù)據(jù)庫中的信息分為無效和有效,對數(shù)據(jù)庫中的信息的有效值按照倒序進行輸出,輸出到表格中,
在網(wǎng)上看到了這樣的語句,SELECT * FROM photo ORDER BY id DESC;于是我就直接拿過來用了,但是卻出現(xiàn)了問題,因為我的是有條件排序的,
嘗試了幾次后我發(fā)現(xiàn)是這樣寫的, select
<include refid="Base_Column_List" /> from manager_user where is_valid = 1?
ORDER BY id DESC;這樣的話輸出的內(nèi)容就達到了我的目標,將語句中的desc換成asc就可以進行升序排序
mybatis order by 排序
在使用MyBatis解析xml進行排序的時候,遇見排序無效的問題!
- #將傳入的數(shù)據(jù)都當(dāng)成一個字符串,會對自動傳入的數(shù)據(jù)加一個雙引號。如:order by #{user_id},如果傳入的值是111,那么解析成sql時的值為order by “111”, 如果傳入的值是id,則解析成的sql為order by “id”。
- $將傳入的數(shù)據(jù)直接顯示生成在sql中。如:order by ${user_id},如果傳入的值是111,那么解析成sql時的值為order by 111, 如果傳入的值是id,則解析成的sql為order by id。
方式能夠很大程度防止sql注入
- $方式無法防止Sql注入。
- $方式一般用于傳入數(shù)據(jù)庫對象,例如傳入表名。
- 一般能用#的就別用$。
order by 之后要使用$而非#
附解決代碼段:
其中orderByField就是傳入進行排序的參數(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會自動將排序字段當(dāng)成一個字符串,等同于order by ‘create_time’ ‘desc’,可以通過執(zhí)行,但無效,與order by create_time desc結(jié)果不同
解決方法: 使用order,Mybatis會將其視作直接變量,變量替換成功后,不會再加上引號成為字符串,同樣排序順序也一樣
{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注入 $無法防止Sql注入 $用于傳入數(shù)據(jù)庫對象 <![CDATA[]]>,在該符號內(nèi)的語句,不會被當(dāng)成字符串來處理,而是直接當(dāng)成sql語句,比如要執(zhí)行一個存儲過程。
在mapper文件中寫sql語句時,遇到特殊字符時,如:< > 等,建議使用
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用JAXBContext輕松實現(xiàn)Java和xml的互相轉(zhuǎn)換方式
這篇文章主要介紹了依靠JAXBContext輕松實現(xiàn)Java和xml的互相轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java編譯錯誤問題:需要class,interface或enum
這篇文章主要介紹了Java編譯錯誤問題:需要class,interface或enum,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02SpringBoot實現(xiàn)ImportBeanDefinitionRegistrar動態(tài)注入
在閱讀Spring Boot源碼時,看到Spring Boot中大量使用ImportBeanDefinitionRegistrar來實現(xiàn)Bean的動態(tài)注入,它是Spring中一個強大的擴展接口,本文就來詳細的介紹一下如何使用,感興趣的可以了解一下2024-02-02如何解決通過spring-boot-maven-plugin package失敗問題
這篇文章主要介紹了如何解決通過spring-boot-maven-plugin package失敗問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04