MyBatis - 基础学习9 - 动态sql(sql片段,foreach)

一.sql片段

为什么要使用sql片段:

我么在编写一些大规模的sql语句时,总会面临所写的sql语句在几个增删改语句中反复出现,它们都做着相同的事,我们却要反复的编写(虽然可以复制粘贴),为了简化我们的sql结构

所以mybatis衍生出来了sql片段,用来对重复的sql语句进行集中放置,然后按需调用

我们在没有使用sql片段时:语句中的if判断在我们的查询语句中反复出现,这个时候呢,我们就可以去使用我们的sql片段

 

 

如下图:

我们把复用的sql语句单独提取出来,然后在需要使用的地方使用 <include>标签导入即可

 

 

 

 

 

 sql片段的使用大大的提高了代码的复用性,使得代码的开起来结构更加的简明了

二.动态sql之foreach

1.编写接口

 List<Blog> selectForeach(Map map);

 

2.在mapper.xml中编写sql语句

    <select id="selectForeach" parameterType="map" resultType="blog">
        SELECT * FROM blog
        <where>
            <foreach collection="tit" item="title" open="(" close=")" separator="or">
                title = #{title}
            </foreach>
        </where>
    </select>

 

 foreach的强大之处在于它可以在mysql层次遍历查询,重点:灵活查询数据库记录,帮助简化我们的本质sql语句:

例如:查询数据库第1,2,3条数据

  • sql : where (id = 1) or (id =2  )or(id =3)
  • mybatis优化: 

                            <where>

                            <foreach collection="tit" item="title" open="(" close=")" separator="or">

                            title = #{title}

                            </foreach>

                            </where>

一眼看上去可能是sql语句看上去简单;但是foreach的重点在于动态查询,我们可以通过传入的 map 集合,在不改动sql语句的情况下,想查那条数据就查那条数据

collection:传入的集合,既然是动态查询就需要知道查哪里,可能一条,可能多条,所以是集合;一般用ArrayList< >进行封装map传入

item:对应的是我们要根据那个字段进行查询,一定是数据库的字段名

open:一般用来表示区间的开始 常用“  and ( ”

close:表示区间关闭                   常用“  )”

separator:区间内的字段条件的连接词  常用 “  and  |  or  ”

然后主体就是sql查询条件了,和一般的sql语句一样

3.测试

@Test
    public void TestselectForeach(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    HashMap map = new HashMap();
    ArrayList<String> tit = new ArrayList<String>();
    tit.add("Java");
    map.put("tit",tit);
    List<Blog> blogs = mapper.selectForeach(map);


    for (Blog blog : blogs) {
        System.out.println(blog);
    }
    sqlSession.close();
}

 

由于在foreach语法中,我们需要传入的是一个集合(collection 标签需要的),所以我们在封装map的时候就需要封装一个数组进去,就可以传入很多个数据了

注:collection一定需要一个集合,就算我们只查一条数据,都要创建一个数据,然后封装map进去,反而言之,查询一条记录为什么要使用foreach呢

 

posted @ 2022-11-22 17:45  回忆也交给时间  阅读(289)  评论(0编辑  收藏  举报