MyBatis的 or 和and 問題

2022-08-19 07:18:10 字數 3247 閱讀 1551

今天排查乙個mybatis查詢的問題,用的動態sql語句結果發現個問題。在mybatis中  or 的位置不同也會影響查詢結果。上**:

這是有問題的**

<

select

id="querycomissionrecord"

resulttype

="comissionrecordresult"

>

select

sum(t.amount) as transferamount,

t.agentname as agentname,

t.tillnumber as

tillnumber,

t.agentrealname as realname,

count(*) as transactionnumber,

sum(t.comission) as

agentcomissionamount,

sum(t.parentcomission) as

superagentcomissionamount

from comission_record t

where

1=1<

if test

="name != null and name != ''"

>

and t.agentname=# or t.agentrealname=#

if>

<

if test

="tillnumber != null and tillnumber != ''"

>

and t.tillnumber=#

if>

and t.parenttillnumber=#

and date_format(

starttime, '%y%m' ) = date_format(# , '%y%m' )

and t.status in (0)

group by agentname

order by tillnumber desc

select

>

這是沒問題的**1

<

select

id="querycomissionrecord"

resulttype

="comissionrecordresult"

>

select

sum(t.amount) as transferamount,

t.agentname as agentname,

t.tillnumber as

tillnumber,

t.agentrealname as realname,

count(*) as transactionnumber,

sum(t.comission) as

agentcomissionamount,

sum(t.parentcomission) as

superagentcomissionamount

from comission_record t

where

1=1<

if test

="tillnumber != null and tillnumber != ''"

>

and t.tillnumber=#

if>

and t.parenttillnumber=#

and date_format(

starttime, '%y%m' ) = date_format(# , '%y%m' )

and t.status in (0)

<

if test

="name != null and name != ''"

>

and t.agentname=# or t.agentrealname=#

if>

group by agentname

order by tillnumber desc

select

>

沒問題**2

<

select

id="querycomissionrecord"

resulttype

="comissionrecordresult"

>

select

sum(t.amount) as transferamount,

t.agentname as agentname,

t.tillnumber as

tillnumber,

t.agentrealname as realname,

count(*) as transactionnumber,

sum(t.comission) as

agentcomissionamount,

sum(t.parentcomission) as

superagentcomissionamount

from comission_record t

where

1=1<

if test

="name != null and name != ''"

>

and (t.agentname=# or t.agentrealname=#)

if>

<

if test

="tillnumber != null and tillnumber != ''"

>

and t.tillnumber=#

if>

and t.parenttillnumber=#

and date_format(

starttime, '%y%m' ) = date_format(# , '%y%m' )

and t.status in (0)

group by agentname

order by tillnumber desc

select

>

兩份**的不同之處就在於,下劃線部分的**的位置不一樣,如果放在前面,一旦name不為空的時候,條件開啟,or 就會把後面所有的條件都當成or的一部分。結果會有很大差異。

或者也可以和第三種一樣,括號優先一下。

在此小記一下,也幫助新手填坑吧。

mybatis重複掃瞄package的問題

可問題是 1.為什麼會列印這麼多重複的日誌呢?2.為什麼只有debug級別的日誌呢?問題1 通過對日誌 和原始碼的學習,終於把第一問題解答了。1 dao類是需要注入乙個sqlsessionfactory的。mybatis與spring整合,對應的是sqlsessionfactorybean類。3 當...

mybatis重複掃瞄package的問題

可問題是 1.為什麼會列印這麼多重複的日誌呢?2.為什麼只有debug級別的日誌呢?問題1 通過對日誌 和原始碼的學習,終於把第一問題解答了。1 dao類是需要注入乙個sqlsessionfactory的。mybatis與spring整合,對應的是sqlsessionfactorybean類。3 當...

MyBatis的重點和面試常問的問題

mybatis 和 的區別 使用 時,mybatis會生成preparedstatment,並將 內容賦給對應的?實際上是通過set 來賦值。使用時 會 將 時,會將 時,會將 中的內容注入到sql語句中,例如在使用order by 中可以指定乙個排序的列名。xml對映檔案中,處理增刪改查的標籤之外...