1.<if>
2.<where>
3.<set>
4.<trim>
5.<foreach> 1.list 集合 2.array 数组
6.<choose>
首先,我们需要一些配置,当然前面你自己可能已经配置好了,那么久简单来一些数据
使用sql 添加一些数据,那么我们开始吧
create table useradd(id bigint primary key auto_increment comment 'id',username varchar(50) comment '用户名',
password varchar(64) comment '密码',nickname varchar(50) comment '昵称',gender varchar(250) comment '势力'
)comment '用户' charset =utf8;
insert into useradd( username, password, nickname, gender) VALUES
('rod','123456','可莉','蒙德'),
('feng','123456','风神','蒙德'),
('gen','123456','刻晴','璃月'),
('mager','123','神里凌华','稻妻'),
('lei','123','雷电将军','稻妻'),
('chong','123','八重子','稻妻')
1. <if> 标签
mapper 接口上: List<UserDto> getByUser(UserDto dto);
sql 语句上:
<select id="getByUser" resultMap="ResMap"> select <include refid="add" /> from useradd <if test="nickname !=null and nickname !=''"> where nickname=#{nickname} </if> <if test="gender !=null and gender !=''"> or gender=#{gender} </if> </select>
在sql 中的 <if>里的判断,只要判断有为空,或者错误时,就不会进行条件查询了,也就是不会执行这里的sql语句了
<if> 类似于 and 所有你想全部进行条件查询 就改成 or
查询为:
@Test void getById(){ UserDto dto =new UserDto(); dto.setNickname("可莉"); dto.setGender("稻妻"); List<UserDto> list = mapper.getByUser(dto); list.forEach(System.out::println); System.out.println("<if> 方式的选项 类似于 and "); }
2. <where> 语句的用法
mapper 接口: List<UserDto> getWhere(UserDto dto);
sql 语句:
<select id="getWhere" resultMap="ResMap"> select <include refid="add" /> from useradd <where> <if test="nickname !=null and nickname !=''"> nickname=#{nickname} </if> <if test="gender!=null and gender !=''"> or gender=#{gender} </if> <if test="id !=null and id !=''"> or id=#{id} </if> </where> </select>
当数值为null或" "的时候,我们依然可以进行where条件的判断,可以查询; 如果不想的话,
把 or 该成 and 就可以了,
由于参数是Java的实体类,所以我们可以把所有条件都附加上,使用时比较灵活, new一个这样的实体类,我们需要限制那个条件,只需要附上相应的值就会where这个条件,相反不去赋值同样在where中判断,但依然可以进行查询 ;
查询为:
void getById01(){ UserDto dto =new UserDto(); dto.setNickname("可莉"); dto.setGender("璃月"); List<UserDto> list = mapper.getWhere(dto); list.forEach(System.out::println); System.out.println("<if> 方式的选项 类似于 and "); }
3. < set > 语句的用法
mapper 接口: void updateName(UserDto dto);
sql 语句:
<update id="updateName" > update useradd <set> <if test="username !=null and username !=''"> username=#{username}, </if> <if test="password !=null and password !=''"> password=#{password}, </if> <if test="nickname !=null and nickname!=''"> nickname=#{nickname}, </if> <if test="gender !=null and gender !=''"> gender=#{gender} </if> </set> where id=#{id} </update>
当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set 标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。
没有使用if标签时,如果有一个参数为null,都会导致错误 ;使用 set+if 标签修改后,如果某项为null则不进行更新,而是保持数据库原值 ;
查询为:
@Test void getUpdateById() { UserDto dto = new UserDto(); dto.setId(7L); dto.setUsername("keq"); dto.setNickname("刻晴-雷"); dto.setGender("稻妻-神里"); dto.setPassword("456789"); mapper.updateName(dto); System.out.println("修改成功!"); List<UserDto> list = mapper.getWhere(dto); list.forEach(System.out::println); }
4. <trim> 语句的用法
trim是更灵活的去处多余关键字的标签,他可以实践where和set的效果。mapper 接口: List<UserDto> getWhere02(UserDto dto);void updateName02(UserDto dto);sql 语句:
<select id="getWhere02" resultMap="ResMap"> select <include refid="add" /> from useradd <trim prefix="where" prefixOverrides="and| or"> <if test="nickname !=null and nickname !=''"> nickname=#{nickname} </if> <if test="gender!=null and gender !=''"> or gender=#{gender} </if> <if test="id !=null and id !=''"> or id=#{id} </if> </trim> </select>
prefi= 指定代替的类型 where 用:prefixocerrides= " " 类型 里面判断类型 可以自己添加
trim 指定 < set> 的用法 : 这里就是 suffixOverrides="," 用逗号
<update id="updateName02" > update useradd <trim prefix="set" suffixOverrides="," > <if test="username !=null and username !=''"> username=#{username}, </if> <if test="password !=null and password !=''"> password=#{password}, </if> <if test="nickname !=null and nickname!=''"> nickname=#{nickname}, </if> <if test="gender !=null and gender !=''"> gender=#{gender} </if> </trim> where id=#{id} </update>
查询:
@Test void getById03() { UserDto dto = new UserDto(); dto.setId(7L); dto.setUsername("keq"); dto.setNickname("刻晴-雷"); dto.setGender("稻妻-神里"); dto.setPassword("456789"); mapper.updateName02(dto); System.out.println("修改成功!"); List<UserDto> list = mapper.getWhere02(dto); list.forEach(System.out::println); }
这个两个一起使用了 , trim -> 指定的类型不用,后面的类型也需要使用不同的类型
5. <foreach> 语句的用法
对于动态SQL 非常必须的,主是要迭代一个集合,通常是用于IN 条件。
List 实例将使用“list”做为键,数组实例以“array” 做为键。
List 集合方式的使用
Mapper 接口: List<UserDto> getList(List<String> name);sql 语句:
<select id="getList" resultMap="ResMap"> select <include refid="add" /> from useradd where nickname in <foreach collection="list" item="name" open="(" separator="," close=")"> #{name} </foreach> </select>
查询为:
@Test void getList(){ List<String> list =new ArrayList<>(); list.add("可莉"); list.add("神里凌华"); List<UserDto> dtos = mapper.getList(list); dtos.forEach(System.out::println); System.out.println( "list 集合 方式,多查询"); }
<Array> 语句的用法
mapper 接口: List<UserDto> getArray(String[] name);
sql 语句:
<select id="getArray" resultMap="ResMap"> select <include refid="add" /> from useradd where nickname in <foreach collection="array" item="name" open="(" separator="," close=")"> #{name} </foreach> </select>
查询为:
@Test void getArray(){ String[] list =new String[3]; list[0] ="可莉"; list[1] ="神里凌华"; list[2] ="神里凌华527"; List<UserDto> dtos = mapper.getArray(list); dtos.forEach(System.out::println); System.out.println( "Array 数组 方式,多查询"); }
这当中的 List 跟 array 是非常相似的
6.< choose > 的用法
接口: List<UserDto> getWhere03(UserDto dto);
sql 语句:
<select id="getWhere03" resultMap="ResMap"> select <include refid="add" /> from useradd <where> <choose> <when test="nickname !=null and nickname !=''"> nickname=#{nickname} </when> <when test="gender!=null and gender !=''"> and gender=#{gender} </when> <when test="id !=null and id !=''"> and id=#{id} </when> <otherwise> </otherwise> </choose> </where> </select>
查询为:
@Test void getChoos() { UserDto dto = new UserDto(); dto.setId(7L); dto.setNickname("刻晴-雷"); dto.setGender("稻妻-神里"); List<UserDto> list =mapper.getWhere03(dto); list.forEach(System.out::println); System.out.println(" 查询也跟前面也是比较相似的! "); }
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis提供了choose 元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。
if 是与(and)的关系,而choose是或(or)的关系。