目录
- if标签
- trim标签
- where标签
- set标签
- foreach标签
动态SQL就是根据不同的条件或需求动态地生成查询语句,比如动态搜索条件、动态表或列名、动态排序等。
if标签
在我们填写一些信息时,有些信息是必填字段,有的则是非必填的,这些信息的传入就需要使⽤动态标签 if来判断了
创建这样想学生表就可以进行测试了
drop table if exists stu;
create table stu(id int primary key auto_increment,name varchar(100) ,sex varchar(10) ) default charset 'utf8mb4';
下面是xml语句
<insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.example.mybatisdemo.model.User">INSERT INTO stu(name<if test="sex != null">, sex</if>) VALUES (#{name}<if test="sex != null">, #{sex}</if>)</insert>
通过结果我们发现,数据已经被插入进入数据库了,并且sex为空。
trim标签
如果所有字段都是⾮必填项,可以考虑使⽤trim标签结合if标签,对多个字段都采取动态⽣成的⽅式。
trim标签中有如下属性:
- prefix:表示整个语句块,以prefix的值作为前缀
- suffix:表示整个语句块,以suffix的值作为后缀
- prefixOverrides:表示整个语句块要去除掉的前缀
- suffixOverrides:表示整个语句块要去除掉的后缀
通过对前面的xml代码进行修改结果如下:
<insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.example.mybatisdemo.model.User">INSERT INTO stu<trim prefix="(" suffix=")" suffixOverrides=","><if test="name != null ">name,</if><if test="sex != null">sex</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="name != null">#{name},</if><if test="sex != null">#{sex}</if></trim></insert>
数据添加成功,依旧只添加了姓名。
where标签
根据属性做 where 条件查询,⽤户对象中属性不为 null 的,都为查询条件。
写一个查询方法:
@RequestMapping("selectByCondition")public List<User> selectByCondition(User user){return userService.selectByCondition(user);}
xml代码如下:
</insert><select id="selectByCondition" parameterType="com.example.mybatisdemo.model.User" >select id,name,sex from stu<where><if test="name != null "> and name=#{name} </if><if test=" sex != null"> and sex= #{sex} </if></where></select>
根据name进行查询
<where>标签也可以使⽤ <trim prefix="where" prefixOverrides="and"> 替换。
set标签
根据传⼊的⽤户对象属性来更新⽤户数据,可以使⽤set标签来指定动态内容。
UserMapper 接⼝中修改⽤户⽅法:根据传⼊的⽤户 id 属性,修改其他不为 null 的属性:
int updateById(User user);
在xml中添加更新⽤户 sql:
<update id="updateById" parameterType="com.example.mybatisdemo.model.User" >update stu<set><if test="name != null">name=#{name},</if><if test="sex != null">sex=#{sex},</if></set>where id=#{id}</update>
查看数据库发现修改成功
<set>标签也可以使⽤ <trim prefix="set" suffixOverrides=","> 替换
foreach标签
对集合进⾏遍历时可以使⽤该标签。foreach标签有如下属性:
- collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
- item:遍历时的每⼀个对象
- open:语句块开头的字符串
- close:语句块结束的字符串
- separator:用于指定循环迭代时元素之间的分隔符
例如一次性删除多个id对应的用户
ArticleMapper 中新增接⼝⽅法:
int deleteByIds(List<Integer> ids);
UserMapper.xml 中新增删除 sql:
<delete id="deleteByIds">delete from stuwhere id in<foreach collection="list" item="item" open="(" close=")" separator=",">#{item}</foreach></delete>
我们删除id为1,2,3的用户信息
通过查看数据库我们知道,删除已经成功。
以上就是我记录的一些动态SQL,如果想了解更多可前往mybatis官网查看 。