? ? ? Mybati的动态SQL在XML中支持的几种标签。
- if
- choose(when、otherswise)
- trim(where、set)
- foreach
- bind
数据准备
INSERT INTO `sys_user` (`id`, `user_name`, `user_password`, `user_email`, `user_info`, `head_img`, `create_time`) VALUES (1, 'admin', '123456', 'admin@mybatis.tk', '管理员', NULL, '2021-09-30 20:53:21');
INSERT INTO `sys_user` (`id`, `user_name`, `user_password`, `user_email`, `user_info`, `head_img`, `create_time`) VALUES (3, 'admin_test', '1234567', 'admin_test@qq.com', 'test1 info', 0x010203, '2021-10-01 12:27:37');
INSERT INTO `sys_user` (`id`, `user_name`, `user_password`, `user_email`, `user_info`, `head_img`, `create_time`) VALUES (6, 'test2', '12345672', 'test2@qq.com', 'test2 info', 0x010203, '2021-10-01 12:59:03');
INSERT INTO `sys_user` (`id`, `user_name`, `user_password`, `user_email`, `user_info`, `head_img`, `create_time`) VALUES (10, 'test1', '1234567', 'test111@qq.com', 'test1111 info', 0x010203, '2021-10-01 13:15:29');
INSERT INTO `sys_user` (`id`, `user_name`, `user_password`, `user_email`, `user_info`, `head_img`, `create_time`) VALUES (1001, 'test', '123456', 'test@mybatis.tk', '测试用户', NULL, '2021-09-30 20:54:03');
if用法
1.1 需求 根据输入的条件去检索用户信息:当输入用户名时,需要根据用户名进行模糊查询;当只输入邮箱的时,根据邮箱进行完全匹配;当同时输入用户名和邮箱的时候,用这两个条件去查询用户。 1.2 对应的文件的编写 接口的相关编写
/**
* 根据动态条件查询用户信息
* @param sysUser
* @return
*/
public List<SysUser> selectByUser(SysUser sysUser);
对应的UserMapper.xml文件的编写
<select id="selectByUser" resultType="com.wei.entity.SysUser">
select id, user_name, user_password, user_email,user_info, head_img, create_time
from sys_user
where 1 = 1
<if test="userName != null and userName != ''">
and user_name like concat('%',#{userName},'%')
</if>
<if test="userEmail != null and userEmail != ''">
and user_email = #{userEmail}
</if>
</select>
if标签无法实现if···else的逻辑,要想要实现对应的可以使用choose··when choose用法 2.1 需求 ??当id有值的时候,优先从id中取值,当没有id值的时候从username中取值,如果都没有,则返回空。 2.2对应的文件的编写
/**
* 根据用户id或用户名进行查询
* @param sysUser
* @return
*/
public SysUser selectByIdOrUserName(SysUser sysUser);
对应的UserMapper.xml文件的编写
<select id="selectByIdOrUserName" resultType="com.wei.entity.SysUser">
select * from sys_user
where 1 = 1
<choose>
<when test="id != null">
and id =#{id}
</when>
<when test="userName != null and userName != ''">
and user_name = #{userName}
</when>
<otherwise>
and 1 = 2
</otherwise>
</choose>
</select>
where、set、trim的用法 3.1 基本使用 ??where标签的作用:如果改标签包含的元素有返回值,就插入一个where,如果where后面的字符串是以AND和OR开头的,则将他们剔除。 改写1.2对应的xml文件
<select id="selectByUser1" resultType="com.wei.entity.SysUser">
select id, user_name, user_password, user_email,user_info, head_img, create_time
from sys_user
<where>
<if test="userName != null and userName != ''">
and user_name like concat('%',#{userName},'%')
</if>
<if test="userEmail != null and userEmail != ''">
and user_email = #{userEmail}
</if>
</where>
</select>
??当if语句中的内容都没有值的时候,SQL语句中不会出现where。 foreach的使用 4.1使用场景 ??用foreach实现in集合 4.2对应的文件的编写
/**
* 根据用户id集合进行查询
* @param idList
* @return
*/
public List<SysUser> selectByIdList(List<Long> idList);
UserMapper.xml文件的编写
<select id="selectByIdList" resultType="com.wei.entity.SysUser">
select * from sys_user
where id in
<foreach collection="list" open="(" close=")" separator=","
item="id" index="i">
#{id}
</foreach>
</select>
4.3相关字段及其属性说明 foreach包含以下属性:
- collection:必填,值为迭代循环的属性名
- item:变量名,值为从迭代对象取出的每一个值
- index:索引的属性名
- open:整个循环内容开头的字符串
- close:整个循环内容结尾的字符串
- separator:每次循环的分割符
|