MyBatis动态SQL:打造灵活可变的数据库操作

目录

  • 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">, sexif>) VALUES (#{name}
        <if test="sex != null">, #{sex}if>)
    insert>

MyBatis动态SQL:打造灵活可变的数据库操作_第1张图片
MyBatis动态SQL:打造灵活可变的数据库操作_第2张图片
通过结果我们发现,数据已经被插入进入数据库了,并且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">sexif>
        trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="name != null">#{name},if>
            <if test="sex != null">#{sex}if>
        trim>


    insert>

MyBatis动态SQL:打造灵活可变的数据库操作_第3张图片
MyBatis动态SQL:打造灵活可变的数据库操作_第4张图片
数据添加成功,依旧只添加了姓名。

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进行查询
MyBatis动态SQL:打造灵活可变的数据库操作_第5张图片
MyBatis动态SQL:打造灵活可变的数据库操作_第6张图片

<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>

MyBatis动态SQL:打造灵活可变的数据库操作_第7张图片
查看数据库发现修改成功
MyBatis动态SQL:打造灵活可变的数据库操作_第8张图片

<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 stu
        where id in
        <foreach collection="list" item="item" open="(" close=")" separator=","
        >
            #{item}
        foreach>
    delete>

我们删除id为1,2,3的用户信息
在这里插入图片描述
MyBatis动态SQL:打造灵活可变的数据库操作_第9张图片
通过查看数据库我们知道,删除已经成功。

以上就是我记录的一些动态SQL,如果想了解更多可前往mybatis官网查看 。

你可能感兴趣的:(JavaEE,数据库,mybatis,sql,学习,java)