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呢