MyBatis常見問題合集

2020-11-04 13:35 更新

總結(jié)一些基礎(chǔ)的常見的Mybatis問題,方便自己,方便讀者學(xué)習(xí),內(nèi)容不多

1、大于號、小于號在 sql 語句中的轉(zhuǎn)換  

  使用 mybatis 時 sql 語句是寫在 xml 文件中,如果 sql 中有一些特殊的字符的話,比如< ,<=,>,>=等符號,會引起 xml 格式的錯誤,需要替換掉,或者不被轉(zhuǎn)義。 有兩種方法可以解決:轉(zhuǎn)義字符和標(biāo)記 CDATA 塊。

方式1、轉(zhuǎn)義字符

1 <select id="searchByPrice" parameterType="Map" resultType="Product">
2     <!-- 方式1、轉(zhuǎn)義字符 -->
3     select * from Product where price &gt;= #{minPrice} and price &lt;= #{maxPrice}
4 </select>

方式2、標(biāo)記 CDATA

1 <select id="searchByPrice" parameterType="Map" resultType="Product">
2   <!-- 方式2、CDATA -->
3   <![CDATA[select * from Product where price >= #{minPrice} and price <= #{maxPrice} ]]>
4 </select>

轉(zhuǎn)義字符表

轉(zhuǎn)義符號
&lt;<
&gt;>
&amp;&
&apos;
&quot;

2、MyBatis 中的 resultType 和 resultMap

  網(wǎng)上的總結(jié)很多,簡單而言,resultType 用于返回值只有一個字段的類型,resultMap 用于返回值有多個字段的類型。至于結(jié)果是 List 還是一個,則在 Mapper 中定義返回值是List還是單個。

使用 resultType:

1 <select id="count" resultType="java.lang.Integer">  
2         SELECT count(*) FROM USER  
3 </select>  

使用 resultMap:

 1 <resultMap type="com.liulanghan.Blog" id="BlogResult">    
2     <id column="id" property="id"/>    
3     <result column="title" property="title"/>    
4     <result column="content" property="content"/>    
5     <result column="owner" property="owner"/>    
6 </resultMap>  
7    
8 <select id="selectBlog" parameterType="int" resultMap="BlogResult">    
9       select * from t_blog where id = #{id}    
10 </select>  

3、參數(shù)

Mapper 中需要用 @Param("queryDate")定義參數(shù)名稱,sql 中用#{queryDate}使用參數(shù),字符串也不需要引號。

參數(shù)判斷和if的用法:

1 <if test="queryDate != null">
2     and queryDate >= #{queryDate}
3 </if>

when otherwise 就是 if else

1 <choose>
2     <when test="isDelete != null and isDelete == 0">
3           isDelete=0
4       </when>
5       <otherwise>
6           isDelete=1
7       </otherwise>
8 </choose>

如果要判斷的字符串,則需要加引號

1 <when test="gender != null and gender == 'MALE'">
2     gender='MALE'
3 </when>


4.傳入?yún)?shù)參數(shù)為0查詢條件失效

4.1 場景再現(xiàn)

場景是這樣的,需要做一個對賬單查詢,可以按金額范圍進(jìn)行查詢,頁面參數(shù)寫完之后進(jìn)行條件,輸入0測試了無數(shù)次均失效。

4.2 原因解析

當(dāng)頁面參數(shù)為 0,傳入到 mybatis 的 xml 中后,如果不是字符串,需指定數(shù)據(jù)類型,否則會被誤認(rèn)為 null

<if test="data.tatalAmount != null and data.totalAmount !='' ">
and total_Amount=#{data.totalAmount}
</if>
  • 1
  • 2
  • 3

這種情況如果 totalAmount 為 0 時將被誤認(rèn)為是 null,里面的條件不會執(zhí)行。正確的姿勢如下

1.添加 0 判斷

<if test="data.tatalAmount != null and data.totalAmount !='' or tatalAmount==0 ">
and total_Amount=#{data.totalAmount}
</if>
  • 1
  • 2
  • 3

2.規(guī)定傳入?yún)?shù)的類型

<if test="data.tatalAmount != null and data.totalAmount !='' ">
and total_Amount=#{data.totalAmount,jdbc.Type=DECIMAL}
</if>


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號