目录
动态Sql概述
Mybatis框架主要通过标签的配合使用实现SQL语句的动态拼接、前后缀格式化处理 、复杂参数处理等功能。
实现动态SQL的主要元素主要有:
- if
- where
- choose
- foreach
- set
- trim
MyBatis常用动态Sql标签
常用标签
- if
- where
- choose
- foreach
- set
- trim
if标签
if 标签通常用于 WHERE 语句、UPDATE 语句、INSERT 语句中,通过判断参数值来决定是否使用某个查询条件、判断是否更新某一个字段、判断是否插入某个字段的值。if可以和很多的标签一起使用!
Mapper接口
/**
* 根据id和realName查询
* @param id
* @param realName
* @return
*/
List<SysUser> selectByIdAndRealName(@Param("id") int id,@Param("realName") String realName);
Mapper.xml
<select id="selectByIdAndRealName" resultType="SysUser">
SELECT * FROM t_sysuser
<if test="id != null"> /*如果传入进来的id不等于空*/
where id=#{id}
</if>
<if test="realName != null">
and realName like concat('%',#{realName},'%')
</if>
</select>
test
private SqlSession sqlSession=MyBatisUtil.createSqlSession(); //Mybatis帮助类
@Test
public void selectByIdAndRealName() {
List<SysUser> userList = sqlSession.getMapper(SysUserMapper.class).selectByIdAndRealName(2, "张");
System.out.println(userList.toString());
}
where标签
以上面的示例为例。当我们不传入id (id为空),realName给张。那么,这时的sql语句就有问题少了where,所以,接下来就需要用到我们的where标签。
注:只需要修改我们的mapper.xml文件就行了。它会自动帮我们加上where标签,智能处理and、or等关键字 (第一个if的and不能加上)
<select id="selectByIdAndRealName" resultType="SysUser">
SELECT * FROM t_sysuser
<where>
<if test="id != null"> /*如果传入进来的id不等于空*/
id=#{id}
</if>
<if test="realName != null">
and realName like concat('%',#{realName},'%')
</if>
</where>
</select>
foreach标签
oreach 标签主要用于构建 in 条件,只要看见in就要马上想到foreach。可在 sql 中对集合进行迭代。也常用到批量删除、添加等操作中。
/**
* 查询在指定地址里面的用户
* @param addressList
* @return
*/
List<SysUser> selectByAddress(@Param("addressList") List<String> addressList);
<select id="selectByAddress" resultType="SysUser">
SELECT * FROM t_sysuser
where address in
<foreach collection="addressList" item="address" open="(" separator="," close=")">
#{address}
</foreach>
</select>
private SqlSession sqlSession=MyBatisUtil.createSqlSession(); //Mybatis帮助类
@Test
public void selectByAddress() {
List<String> addressList=new ArrayList<>();
addressList.add("北京市海淀区学院路61号");
addressList.add("北京市海淀区西二旗辉煌国际16层");
List<SysUser> userList = sqlSession.getMapper(SysUserMapper.class).selectByAddress(addressList);
System.out.println(userList.toString());
sqlSession.close();
}
set标签
更新用户表数据时,除重新赋值的属性外,其他属性的值都更新为null,简化SQL语句中set子句处理,智能忽略更新语句尾部多出来的逗号。
/**
* 修改用户信息
* @param sysUser
* @return
*/
int updateById(SysUser sysUser);
<update id="updateById" parameterType="SysUser">
update t_sysuser
<set>
<if test="account !=null">
account=#{account},
</if>
<if test="realName !=null">
realName=#{realName},
</if>
<if test="sex !=null">
sex=#{sex}
</if>
</set>
where id=#{id}
</update>
trim标签
添加前后缀,智能忽略标签前后多余的and、or或逗号等字符
语法:
<trim prefix = "前缀" suffix = "后缀" prefixOverrides = "忽略前缀" suffixOverrides = "忽略后缀" >
…
</trim>
<update id="updateById" parameterType="SysUser">
update t_sysuser
<trim prefix="set" suffix="where id=#{id}" suffixOverrides=",">
<if test="account !=null">
account=#{account},
</if>
<if test="realName !=null">
realName=#{realName},
</if>
<if test="sex !=null">
sex=#{sex}
</if>
</trim>
</update>