一、parameterType 属性
1、作用
在XXXMapper.xml中<select><delete>等标签的 parameterType 可以控制参数类型
2、在mapper.xml中通过 #{} 获取参数
- 使用索引,从0开始,#{0}表示第一个参数。
- 使用#{param1}获取第一个参数。
- 如果只有一个参数 (基本类型或String类型),对#{}里面的内容没有要求,只要写内容即可。
- 如果参数是对象类型,写成#{属性名}。
- 如果参数是map类型,写成#{key}。
3、#{} 和 ${} 的区别
- #{}获取参数的内容支持,索引获取,param1 获取指定位置参数,并且 SQL 中使用 “?” 占位。
- ${}字符串拼接不使用 “?” 拼接,默认找${内容}的 get/set 方法,如果是数字,就是一个数字。
4、xml转义标签
如果在xml文件中出现 “<”、“>”、双引号等特殊字符时可以使用 xml 转义标签 <![CDTA[内容]]>
二、定义 sql 语句
1、select标签
属性介绍:
id:唯一的标识符。
parameterType:传给此语句的参数的全路径名或别名(例:com.pojo.User 或 user)。
resultType:语句返回值类型或别名。注意,如果是集合,那么这里填写的是集合的泛型,而不是集合本身(resultType 与 resultMap 不能并用)
示例 :
<resultMap type="com.pojo.User" id="mymap">
<!-- 主键使用 id 标签配置映射关系 -->
<id column="id" property="id1" />
<!-- 其他列使用 result 标签配置映射关系 -->
<result column="name" property="name1"/>
<result column="sex" property="sex1"/>
</resultMap>
<select id="selectByPrimaryKey" resultMap="myMap" parameterType="int">
select * from user where id=#{0}
</select>
<!--
resultMap:将查询结果与实体类映射
使用resultMap属性引用<resultMap>标签
-->
2、insert标签
属性介绍:
id:唯一的标识符。
parameterType:传给此语句的参数的全路径名或别名(例:com.pojo.User) 。
示例:
<insert id="insertUser" parameterType="com.pojo.MyUser">
insert into user(name,sex) values(#{name},#{sex})
</insert>
3、delete标签
属性介绍:
id:唯一的标识符。
parameterType:传给此语句的参数的全路径名或别名(例:com.pojo.User) 。
示例:
<delete id="deleteUser" parameterType="Integer">
delete from user where id=#{id}
</delete>
4、update标签
属性介绍:
id:唯一的标识符。
parameterType:传给此语句的参数的全路径名或别名(例:com.pojo.User) 。
示例:
<update id="updateUser" parameterType="com.pojo.MyUser">
update user set uname = #{uname},usex = #{usex} where uid = #{uid}
</update>
三、resultMap标签
1、resultMap标签的使用
基本作用:
- 建立 SQL 查询结果字段与实体属性的映射关系。
- 查询结果集转换为 java 对象,方便进一步操作。
- 将结果集中的列与 java 对象中的属性对应起来并将值填充进去。
定义查询结果集对应关系:
<resultMap id="mymap" type="com.pojo.User">
<!-- 主键使用 id 标签配置映射关系 -->
<id column="id" property="id1" />
<!-- 其他列使用 result 标签配置映射关系 -->
<result column="name" property="name1"/>
<result column="sex" property="sex1"/>
</resultMap>
属性说明:
id:该<resultMap>标签的标志。
type:返回值的类名,此例中返回 User 类。
查询时引用<resultMap>标签:
<select id="selectByPrimaryKey" resultMap="myMap" parameterType="int">
select * from user where id=#{0}
</select>
四、动态sql拼接
1、概述
根据不同条件需要执行不同 sql 命令,称为动态 sql。
MyBatis 中动态 SQL 在 mapper.xml 中添加逻辑判断等。
2、if 标签
if 标签通常用于 WHERE 语句、UPDATE 语句、INSERT 语句中,通过判断参数值来决定是否使用某个查询条件、判断是否更新某一个字段、判断是否插入某个字段的值。
<select id="selByAccinAccout" resultType="log">
select * from log where 1=1
<!-- OGNL 表达式,直接写 key 或对象的属性.不需要添加任何特字符号 -->
<if test="accin!=null and accin!=''">
and accin=#{accin}
</if>
<if test="accout!=null and accout!=''">
and accout=#{accout}
</if>
</select>
3、where 标签
如果 where 标签中包含的标签中有返回值的话,它就自动插入一个 where 连接 sql 语句。如果标签返回的内容是 AND 或者 OR 开头的,则它就会被自动剔除掉。比直接使用 if 标签少写一个where 1 = 1。
<select id="selByAccinAccout" resultType="log">
select * from log
<where>
<if test="accin!=null and accin!=''">
and accin=#{accin}
</if>
<if test="accout!=null and accout!=''">
and accout=#{accout}
</if>
</where>
</select>
4、choose…when…otherwise 标签
按顺序判断 when 中的条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when的条件都不满足时,则执行 otherwise 中的 sql。类似于 Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
<select id="selByAccinAccout" resultType="log">
select * from log
<where>
<choose>
<when test="accin!=null and accin!=''">
and accin=#{accin}
</when>
<when test="accout!=null and accout!=''">
and accout=#{accout}
</when>
<otherwise>
and id = 10
</otherwise>
</choose>
</where>
</select>
5、set标签
作用:
- 去掉最后一个逗号。
- 如果<set>标签里面有内容,就生成 set 关键字,没有就不生成 set 关键字。
示例:
<update id="upd" parameterType="log" >
update log
<set>
id=#{id},
<if test="accIn!=null and accIn!=''">
accin=#{accIn},
</if>
<if test="accOut!=null and accOut!=''">
accout=#{accOut},
</if>
</set>
where id=#{id}
</update>
6、trim 标签
属性介绍:
- prefix:在前面添加内容。
- prefixOverrides:去掉前面的内容。
- suffix:在后面添加内容。
- suffixOverrides:去掉后面的内容
- 执行顺序:去掉内容后添加内容
示例:
<update id="upd" parameterType="log">
update log
<trim prefix="set" suffixOverrides=",">
a=a,
</trim>
where id=100
</update>
7、bind 标签
作用:
给参数重新赋值
适用场景:
- 模糊查询
- 在原内容前后添加内容
示例:
<select id="selByLog" parameterType="log" resultType="log">
<bind name="user_name" value="'%'+accin+'%'"/>
select * from user where username like #{user_name}
</select>
8、foreach 标签
作用:
主要用于构建 in 条件,可以在 sql 中对集合进行迭代。也常用到批量删除、添加等操作中。
属性介绍:
- collection:collection 属性的值有三个分别是 list、array、map 三种,分别对应的参数类型为:List、数组、map 集合。
- item :表示在迭代过程中每一个元素的别名。通过 #{迭代变量名} 获取内容。
- index :表示在迭代过程中每次迭代到的位置(下标)。
- open :前缀,循环后左侧添加的内容。
- close :后缀,循环后右侧添加的内容。
- separator :分隔符,表示迭代时每个元素之间以什么分隔。
示例:
<select id="selectIn" resultMap="myMap">
select * from user where id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
9、sql 标签
作用:
当多种类型的查询语句的查询字段或者查询条件相同时,可以将其定义为常量,方便调用。
示例:
<!-- 查询字段 -->
<sql id="user_field">
id,name,age,sex
</sql>
<!-- 查询条件 -->
<sql id="user_field_where">
where 1=1
<trim suffixOverrides=",">
<if test="id != null and id !=''">
and id = #{id}
</if>
<if test="name != null and name != ''">
and name = #{name}
</if>
<if test="age != null ">
and age = #{age}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</trim>
</sql>
10、include 标签
作用:
用于引用 sql 标签定义的常量
示例:
<!-- 按条件字段查询所有 -->
<select id="selectAll" resultMap="myMap">
SELECT
<include refid="user_field" />
from user
<include refid="user_field_where" />
</select>
11、concat函数
作用: 对于 mybatis 中的 like
关键字查询,使用like concat()
组合,可以防止SQL注入。
格式:
like concat('%/',#{dataPath,jdbcType=VARCHAR},'/%')
<!--
参数说明:
第一个参数,就是 '%',其中 % 后边可以加上一些常量字符比如 ‘/’。
第二个参数,传递过来的参数。
第三个参数,是结尾的 '%',其中 % 前边可以加一些常量字符比如 ‘/’。
常量字符:0-9 a-z A-Z _ / ? * ,等
-->
示例:
select * from user where name like concat('%','#{username}','%')