mybatis中的动态SQL(if,trim,where,set,foreach标签)

目录

  • mybatis中的动态SQL的使用
    • if标签
      • if标签总结
    • trim标签
      • trim标签总结
    • where标签
      • where标签总结
    • set标签
      • set标签总结
    • foreach标签
      • 总结

mybatis中的动态SQL的使用

if标签

  1. mapper层中的查询方法
 //现在不确定哪个参数是必填的,哪个参数是非必填的
    public List<ArticleInfo> getArticleInfo(@Param("title") String title, @Param("content") String content, @Param("state") int state);
  1. mapper.xml中的sql方法
   <select id="getArticleInfo" resultMap="BaseResultMap">
        select * from articleinfo where 1=1
        <if test="title!=null">
            and title=#{title}
        </if>
        <if test="content!=null">/*这个test中的content是mapper层传进来的@Param中设置的参数的值*/
            and content=#{content}
        </if>
        <if test="state!=0">
            and state=#{state}
        </if>
    </select>
  1. 测试结果
 @Test
    void getArticleInfo() {
        List<ArticleInfo> list = articleInfoMapper.getArticleInfo(null,null,0);
        list.forEach(System.out::println);
    }

在这里插入图片描述

if标签总结

  1. 这里为了避免输入的三个参数都为空,语法出错,所以使用1=1,这样没问题,但是有点不雅,下面的trim标签可以解决这个问题。
  2. 要注意/*这个test中的content是mapper层传进来的@Param中设置的参数的值

trim标签

  1. mapper层中的查询方法:
//这三个参数是非必填的
    public List<ArticleInfo> getArticleInfo2(@Param("title") String title,@Param("content") String content,@Param("state") int state);
  1. mapper.xml中的sql方法:
    <select id="getArticleInfo2" resultMap="BaseResultMap">
        select * from articleinfo
        <trim prefix="where" prefixOverrides="and">
            <if test="title!=null">
                and title=#{title}
            </if>
            <if test="content!=null">
                and content=#{content}
            </if>
            <if test="state!=0">
                and state=#{state}
            </if>
        </trim>
    </select>
  1. 测试结果:
    在这里插入图片描述在这里插入图片描述

trim标签总结

  1. 当trim标签中的所有if都为false时,那么trim标签的前缀和后缀属性值都不会生效(prefix,prefixOverrides,suffix,suffixOverrides)

where标签

  1. mapper查询方法
//这三个参数是非必填的
    public List<ArticleInfo> getArticleInfo3(@Param("title") String title,@Param("content") String content,@Param("state") int state);

  1. mapper.xml中的sql方法
 <select id="getArticleInfo3" resultMap="BaseResultMap">
        select * from articleinfo
        <where>
            <if test="title!=null">
               and title=#{title}
            </if>
            <if test="content!=null">
               and content=#{content}
            </if>
            <if test="state!=0">
               and state=#{state}
            </if>
        </where>
    </select>
  1. 测试结果:测试结果成功
    在这里插入图片描述mybatis中的动态SQL(if,trim,where,set,foreach标签)_第1张图片

where标签总结

  1. where标签很优雅,在查询语句中,只需要在if标签里全部加上and关键字即可,它会自动去掉第一个if中的and关键字,并且如果所有if都不满足的话,整个where标签都不会执行
    mybatis中的动态SQL(if,trim,where,set,foreach标签)_第2张图片

set标签

  1. mapper中的查询方法
    在这里插入图片描述
  2. mapper.xml中的sql方法
  <update id="upArticle">
        update articleinfo
        <set>
           <if test="title!=null">
               title=#{title},
           </if>
            <if test="content!=null">
                content=#{content},
            </if>
        </set>
        where id=#{id}
    </update>
  1. 测试结果
    mybatis中的动态SQL(if,trim,where,set,foreach标签)_第3张图片在这里插入图片描述

set标签总结

  1. 这个是用于修改的一个标签,和where标签类似,很优雅,只需要在里面所有if标签里都加上“,”,它会自动把最后一个逗号去掉
  2. set标签里的所有if标签不能都为false,否则sql语法错误

foreach标签

  1. mapper中的查询方法
    在这里插入图片描述
  2. mapper.xml中的sql方法
    mybatis中的动态SQL(if,trim,where,set,foreach标签)_第4张图片
  3. 测试结果:
    mybatis中的动态SQL(if,trim,where,set,foreach标签)_第5张图片
    在这里插入图片描述

总结

mybatis中的动态SQL(if,trim,where,set,foreach标签)_第6张图片

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