Mybatis之动态sql

举报
游坦之 发表于 2022/10/13 19:27:11 2022/10/13
【摘要】 ​目录一、if标签1、写一个方法2、配置.xml文件3、测试类二、Choose1、配置xml2、测试三、trim、where、set1、where、set1、配置xml2、调用方法,测试四、ForEach1、SQL片段2、Foreach1、xml配置2、测试类一、if标签1、写一个方法 List<Blog> getBlog(Map map);2、配置.xml文件<select id="get...

目录



一、if标签

1、写一个方法

2、配置.xml文件

3、测试类

二、Choose

1、配置xml

2、测试

三、trim、where、set

1、where、set

1、配置xml

2、调用方法,测试

四、ForEach

1、SQL片段

2、Foreach

1、xml配置

2、测试类



一、if标签

1、写一个方法

 List<Blog> getBlog(Map map);



2、配置.xml文件

<select id="getBlog"  parameterType="map" resultType="com.feng.pojo.Blog">
        select * from blog where 1=1
        <if test="title != null">
            and title = #{title}
        </if>
        <if test="author != null">
            and author = #{author}
        </if>
</select>


3、测试类

@Test
    public void getBlogTest()
    {
        SqlSession sqlSession = MybatisUtil.getSqlSessionFactory();
        BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
        HashMap map  = new HashMap();
        map.put("title","JAVA");
        List<Blog> blogs = mapper.getBlog(map);
        for (Blog blog : blogs) {
            System.out.println(blog);
        }
        sqlSession.close();
    }
}

​ ​ ​ ​

二、Choose

MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

还是上面的例子,但是策略变为:传入了 “title” 就按 “title” 查找,传入了 “author” 就按 “author” 查找的情形。若两者都没有传入,就返回标记为 featured 的 BLOG(这可能是管理员认为,与其返回大量的无意义随机 Blog,还不如返回一些由管理员精选的 Blog)。

1、配置xml

<select id="queryBlog" parameterType="map" resultType="com.feng.pojo.Blog">
        select * from blog
        <where>
            <choose>
                <when test="title != null">
                    title = #{title}
                </when>
                <when test="author != null">
                    and author =#{author}
                </when>
                <otherwise>
                    views = #{views}
                </otherwise>
            </choose>
        </where>
</select>


2、测试

@Test
    public void queryBlogTest()
    {
        SqlSession sqlSession = MybatisUtil.getSqlSessionFactory();
        BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
        HashMap map = new HashMap();
​
        map.put("author","狂神说");
        map.put("title","Spring");
        List<Blog> blogs = mapper.queryBlog(map);
        for (Blog blog : blogs) {
            System.out.println(blog);
        }
        sqlSession.close();
    }


三、trim、where、set

1、where、set

where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。


set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。

1、配置xml

<update id="updateBlog" parameterType="map">
        update  blog
        <set>
            <if test="title != null">
                title = #{title},
            </if>
             <if test="author != null">
                 author = #{author}
             </if>
        </set>
        where id = #{id}
    </update>

2、调用方法,测试


@Test
    public void updateBlogTest()
    {
        SqlSession sqlSession = MybatisUtil.getSqlSessionFactory();
        BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
        HashMap map = new HashMap();
​
        map.put("title","JAVA永远的神");
        map.put("author","努力挣钱的小画家");
        map.put("id","45b0393ebe4a43e19120e45222831991");
        mapper.updateBlog(map);
        sqlSession.close();
    }

如果不传<set></set>里面的参数,会报错



四、ForEach

它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。


1、SQL片段

有时候我们可以把代码的公共部分提取出来,方便复用

<sql id="if-test">
        <if test="title != null">
            title = #{title},
        </if>
        <if test="author != null">
            author = #{author}
        </if>
</sql>

可以通过<include>调用改公共代码快,最好基于单表查询,不要存在where标签(SQL片段里面)

<update id="updateBlog" parameterType="map">
        update  blog
        <set>
            <include refid="if-test"></include>
        </set>
        where id = #{id}
</update>

2、Foreach

1、xml配置

<select id="queryBlog" parameterType="map" resultType="com.feng.pojo.Blog">
        select * from blog
        <where>
            <foreach collection="ids" item="id" open="(" separator="or" close=")">
                id=#{id}
            </foreach>
        </where>
</select>

编辑



collection是集合,item是集合里的元素,open是开始的位置,separotor是间隔符,close是关闭

2、测试类

 @Test
    public void queryBlogTest2()
    {
        SqlSession sqlSession = MybatisUtil.getSqlSessionFactory();
        BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
        HashMap map = new HashMap();
        ArrayList<Integer> ids = new ArrayList<Integer>();
        ids.add(1);
        ids.add(2);
        ids.add(3);
        map.put("ids",ids);
        List<Blog> blogs = mapper.queryBlog(map);
        for (Blog blog : blogs) {
            System.out.println(blog);
        }
        sqlSession.close();
    }




动态SQL就是在拼接SQL语句,我们只需要保证SQL的正确性,按照SQL格式去拼装组合,所以可以现在mySQL中写出完整的SQL,在改写成动态SQL

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。