MyBatis?if?test?判斷字符串相等不生效問題
MyBatis if test 判斷字符串相等不生效
采用 MyBatis 框架操作 MySQL 數(shù)據(jù)庫時,判斷傳入的字符串 priceFlag 值為"0"時,按照 price 屬性降序排列,如下 xml 語句未生效:
<if test="priceFlag != null and priceFlag == '0'"> ? ? ? ORDER BY price DESC </if>
原因分析
MyBatis 是使用 OGNL 表達(dá)式來進(jìn)行解析的,在 OGNL 表達(dá)式中,'0’會被解析成字符,因?yàn)?java 是強(qiáng)類型的,char 和 String 不等,所以 if 標(biāo)簽中的 SQL 不會被解析。
解決方法
解決這個問題,可以把 if test 判斷語句修改成如下幾種方式中的任何一種:
<if test='"0" == priceFlag'>
或者
<if test='"0".equals(priceFlag)'>
或者
<if test="'0'.toString() == priceFlag">
修改完成后,SQL 語句就可以被解析了。
MyBatis if test 判斷字符串相等的坑
自己開發(fā)的系統(tǒng),客戶反映有問題,本著不想改java代碼,想想從數(shù)據(jù)庫入手,加一些判斷條件就想到了if test判斷等于某個字符串執(zhí)行另一個sql語句的原則,沒想到想當(dāng)然了,使用 if test=“sex==‘m’”直接報錯,看了下網(wǎng)上果然大家都有遇到這樣的問題,解決方式如下:
1. if 判斷字符串
- 錯誤寫法:if test="status == 'Y'"特別是數(shù)字字符的時候。。。。
結(jié)果:拋異常NumberFormatException異常!提示內(nèi)容非常少,看不出問題在哪里!
- 正確寫法:if test='status == "y" '
還可以這樣寫:if test="status == 'y'.toString()"
2. if嵌套
? ? ? ? <if test="@com.qbao.tickets.common.util.MybatisUtils@isNotEmpty(firstLetter)"> ? ? ? ? ? ? ?<if test="firstLetter=='-1'.toString()"> ? ? ? ? ? ? ? ? and FIRST_LETTER is null or FIRST_LETTER ='' ? ? ? ? ? ?</if> ? ? ? ? ? ? ? ? ? ? ? ?<if test="firstLetter!='-1'.toString()"> ? ? ? ? ? ? ? ?and FIRST_LETTER = #{firstLetter, jdbcType=VARCHAR} ? ? ? ? ? ?</if> ? ? ? ? </if>
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用BigDecimal進(jìn)行精確運(yùn)算(實(shí)現(xiàn)加減乘除運(yùn)算)
這篇文章主要介紹了如何使用BigDecimal進(jìn)行精確運(yùn)算,最后提供了一個工具類,該工具類提供加,減,乘,除運(yùn)算2013-11-11Spring Cloud 的 Hystrix.功能及實(shí)踐詳解
這篇文章主要介紹了Spring Cloud 的 Hystrix.功能及實(shí)踐詳解,Hystrix 具備服務(wù)降級、服務(wù)熔斷、線程和信號隔離、請求緩存、請求合并以及服務(wù)監(jiān)控等強(qiáng)大功能,需要的朋友可以參考下2019-07-07Map 使用 Lambda 的 forEach 實(shí)現(xiàn)跳出循環(huán)操作
這篇文章主要介紹了Map 使用 Lambda 的 forEach 實(shí)現(xiàn)跳出循環(huán)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09Java實(shí)現(xiàn)的校驗(yàn)銀行卡功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)的校驗(yàn)銀行卡功能,結(jié)合完整實(shí)例形式分析了java針對銀行卡類型、歸屬地等信息的判斷、讀取相關(guān)操作技巧,需要的朋友可以參考下2018-06-06