1. 程式人生 > >MyBatis總結之常見問題

MyBatis總結之常見問題

目錄

 

1.#{}和${}的區別

2.resultType和resultMap的區別

3.模糊查詢(MySQL)

 3.1 使用% 拼接字串

 3.2 使用 concat(str1,str2)拼接

 3.3 使用bind


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>