MyBatis总结之常见问题

版权声明:@AaronFo https://blog.csdn.net/sinat_33212645/article/details/85096083

目录

 

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}

扫描二维码关注公众号,回复: 4605346 查看本文章

预编译后,会动态解析成一个参数标记符?:

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>

猜你喜欢

转载自blog.csdn.net/sinat_33212645/article/details/85096083