MyBatis總結之常見問題
目錄
1.#{}和${}的區別
1 )#{}表示一個佔位符號,#{}接收輸入引數,型別可以是簡單型別,pojo、hashmap。如果接收簡單型別,#{}中可以寫成value或其它名稱;
2 )#{}接收pojo物件值,通過OGNL讀取物件中的屬性值,通過屬性.屬性.屬性...的方式獲取物件屬性值;
3) ${}表示一個拼接符號,會引用sql注入,所以不建議使用${},可以看下面的示例;
4 )${}接收輸入引數,型別可以是簡單型別,pojo、hashmap。如果接收簡單型別,${}中只能寫成value;
5 )${}接收pojo物件值,通過OGNL讀取物件中的屬性值,通過屬性.屬性.屬性...的方式獲取物件屬性值;
舉個栗子:
select * from user where user_name = #{name}
預編譯後,會動態解析成一個引數標記符?:
select * from user where user _name = ?
而使用${}在動態解析時候,會傳入引數字串
select * from user where user _name = 'Aaron'
anyway,總之一句話:#{}是編譯好後再取值,${}是取值後再去編譯SQL語句;
2.resultType和resultMap的區別
在預設情況下,使用resultType(例如resultType="SysUser"),MyBatis會將查詢結果資料的列和返回的物件的屬性逐一匹配賦值,對應表sys_user中存在欄位create_time,而POJO物件SysUser的屬性為createTime,那麼SysUser物件將接收到create_time的值,所以resultMap就有了用武之地;
<resultMap type="SysUser" id="baseSysUserResultMap"> <id property="uuid" column="UUID"/> <result property="userName" column="USER_NAME"/> <result property="password" column="PASSWORD"/> <result property="userCnName" column="USER_CN_NAME"/> <result property="idCard" column="IDCARD"/> <result property="phone" column="PHONE"/> <result property="email" column="EMAIL"/> <result property="imageUrl" column="IMAGE_URL"/> <result property="address" column="ADDRESS"/> <result property="status" column="STATUS"/> <result property="createTime" column="CREATE_TIME"/> </resultMap>
綜上所述,可以看出如果sql執行返回的資料列名與接收資料物件的屬性名一致,可以使用resultType;如果不一致使用resultMap;
3.模糊查詢(MySQL)
3.1 使用% 拼接字串
<select id="getByUserName" parameterType="SysUser" resultMap="sysUserResultMap">
SELECT * FROM sys_user T USER_NAME LIKE %"#{userName}"%"
</select>
3.2 使用 concat(str1,str2)拼接
<select id="getByUserName" parameterType="SysUser" resultMap="sysUserResultMap">
SELECT * FROM sys_user T WHERE USER_NAME LIKE concat(concat("%",#{userName}),"%")
</select>
3.3 使用bind
<select id="getByUserName" parameterType="SysUser" resultMap="sysUserResultMap">
<bind name="pattern" value = " '%' + userName + '%' " />
SELECT * FROM sys_user T WHERE USER_NAME LIKE #{pattern}
</select>