今天排查乙個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對映檔案中,處理增刪改查的標籤之外...