动态SQL就是根据不同的条件或需求动态地生成查询语句,比如动态搜索条件、动态表或列名、动态排序等。
在我们填写一些信息时,有些信息是必填字段,有的则是非必填的,这些信息的传入就需要使⽤动态标签 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">, sexif>) VALUES (#{name}
<if test="sex != null">, #{sex}if>)
insert>
通过结果我们发现,数据已经被插入进入数据库了,并且sex为空。
如果所有字段都是⾮必填项,可以考虑使⽤trim标签结合if标签,对多个字段都采取动态⽣成的⽅式。
trim标签中有如下属性:
通过对前面的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">sexif>
trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="name != null">#{name},if>
<if test="sex != null">#{sex}if>
trim>
insert>
根据属性做 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>
<where>标签也可以使⽤ <trim prefix="where" prefixOverrides="and"> 替换。
根据传⼊的⽤户对象属性来更新⽤户数据,可以使⽤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标签有如下属性:
例如一次性删除多个id对应的用户
ArticleMapper 中新增接⼝⽅法:
int deleteByIds(List<Integer> ids);
UserMapper.xml 中新增删除 sql:
<delete id="deleteByIds">
delete from stu
where id in
<foreach collection="list" item="item" open="(" close=")" separator=","
>
#{item}
foreach>
delete>
我们删除id为1,2,3的用户信息
通过查看数据库我们知道,删除已经成功。
以上就是我记录的一些动态SQL,如果想了解更多可前往mybatis官网查看 。