目录
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>