1.SQL片段
有的时候我们会将一些公共的部分抽取出来,方便复用
如图,上面就已经出现了重复的代码,而SQL片段就是用来实现这些SQL代码的复用的
使用SQL片段使用方法
- 使用sql标签抽取公共部分
- 使用include标签引入复用的sql代码
就使用SQL片段来改造上图中的那个例子
- 测试
@Test public void testQureryBlogIf(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); BlogMapper mapper = sqlSession.getMapper(BlogMapper.class); Map<String,Object> map = new HashMap<String,Object>(); map.put("author","作者2"); List<Blog> blogList = mapper.qureryBlogIf(map); for (Blog blog : blogList) { System.out.println(blog); } sqlSession.close(); }
使用的注意事项
- 最好是基于单表的简单SQL操作才抽取为SQL片段,因为SQL片段本来就是为了实现代码的复用,如果功能很复杂,那么功能的指向性就很明确了,这个时候抽取的sql片段是没有什么重用意义的
- SQL片段中不要有where标签,SQL片段中最好只包含一些 if 判断即可
2.Foreach
案例:通过blog的title实现按照集合属性查询
- 接口
package com.thhh.dao; import com.thhh.pojo.Blog; import java.util.List; import java.util.Map; public interface BlogMapper { //1、添加一条博客信息 int addBlog(Blog blog); //2、使用IF标签来查询博客 List<Blog> qureryBlogIf(Map<String,Object> map); //3、使用choose标签来查询博客 List<Blog> qureryBlogChoose(Map<String,Object> map); //4、使用SET标签来实现博客修改 int updateBlog(Map<String,Object> map); //5、使用FOREACH标签实现查询博客 List<Blog> queryBlogForeach(Map map); }
- mapper.xml
<select id="queryBlogForeach" parameterType="map" resultType="blog"> select * from blog <where> <foreach collection="titles" item="title" index="index" open="(" separator="or" close=")"> title = #{title} </foreach> </where> </select>
- 测试
@Test public void testQueryBlogForeach(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); BlogMapper mapper = sqlSession.getMapper(BlogMapper.class); Map map = new HashMap(); List titleList = new ArrayList(); titleList.add("标题2"); titleList.add("标题3"); map.put("titles",titleList); List<Blog> blogList = mapper.queryBlogForeach(map); for (Blog blog : blogList) { System.out.println(blog); } }
3.小结
动态SQL本质还是在拼接SQL,只是mybatis通过封装,让我们使用标签/节点的形式来进行拼接,在使用的时候只要我们保证SQL的正确性,按照SQL的格式取排列组合即可
在使用的时候,我们应该先分析需求,然后使用SQL去数据库中运行一下,看看能不能实现对应的功能,然后再去程序中通过mapper.xml中的节点拼出来和我们写的SQL语句一样的SQL即可,或者说去mapper.xml中实现动态SQL即可