1:parameterType、resultType
无非就是对象,map,其他类型
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
select id, supplier_id, member_id, province_code, province, city_code, city, district_code
from member_address
where id = #{id,jdbcType=INTEGER}
</select>
2:#{}和${}区别
- 将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
- $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
- 方式能够很大程度防止sql注入。
- $方式无法防止Sql注入。
- $方式一般用于传入数据库对象,例如传入表名.
- 一般能用#的就别用$.
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
<if test="is_default != null">
and is_default = #{is_default}
</if>
<if test="name!= null and name!= ''">
and namelike '${name}%'
</if>
3:转义字符
在xml的sql语句中,不能直接用大于号、小于号要用转义字符
转义字符 | 符号 | 解释 |
---|---|---|
<; | < | 小于号 |
>; | > | 大于号 |
&; | & | 和 |
&apos; | ' | 单引号 |
" ; | " | 双引号 |
例如:
<if test="end_time != null and end_time != ''">
and created_at >= #{created_at}
</if>
4:choose 元素
MyBatis 提供了 choose 元素。if标签是与(and)的关系,而 choose 是或(or)的关系,choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中 的 choose 很类似。
<select id="selectLimitProductByActivityId" parameterType="java.util.Map" resultType="java.lang.Long" >
SELECT
<choose>
<when test="visitSource != null and visitSource==1">
product_outer_id
</when>
<otherwise>
product_id
</otherwise>
</choose>
FROM
core_coupon
<where>
<if test="supplier_id != null">
AND supplier_id = #{supplier_id}
</if>
<if test="activity_id != null">
AND activitie_id = #{activity_id}
</if>
</where>
</select>
5:trim 标签
<trim prefix="" suffix="" suffixOverrides="" prefixOverrides=""></trim>
prefix:在trim标签内sql语句加上前缀。
suffix:在trim标签内sql语句加上后缀。
suffixOverrides:指定去除多余的后缀内容,如:suffixOverrides=",",去除trim标签内sql语句多余的后缀","。
prefixOverrides:指定去除多余的前缀内容
<update id="updateByParams" parameterType="java.util.Map" >
update core_member_group
<trim prefix="set" suffixOverrides="," >
<if test="operator_id != null ">
operator_id = #{operator_id} ,
</if>
<if test="user_num != null ">
user_num = #{user_num} ,
</if>
<if test="group_name != null and group_name != ''">
group_name = #{group_name} ,
</if>
<if test="query != null and query != ''">
query = #{query} ,
</if>
</trim>
where group_id = #{group_id} and supplier_id = #{supplier_id}
and operator_id = #{operator_id}
and is_delete = 0
</update>
6:foreach 标签
例如where id in (1,2,3,4)必须放到数组里面,顺便提一下如果id的数组特别大的话,尽量不要用where in,in的返回是有上线的
<select id="selectListByParams" parameterType="java.util.Map"
resultType="com.sdc.common.address.model.CoreMemberAddress">
select id, supplier_id, member_id, province_code, province, city_code, city
from core_member_address
<where>
<if test="id != null">
and id = #{id}
</if>
<if test="member_ids != null and member_ids.size()>0">
and member_id in
<foreach item="item" index="index" collection="member_ids" open="("
separator="," close=")">
#{item}
</foreach>
</if>
</where>