转载:https://blog.kuangstudy.com/index.php/archives/506/
1 官网描述: 2 MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 3 虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。 4 动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。 5 6 ------------------------------- 7 - if 8 - choose (when, otherwise) 9 - trim (where, set) 10 - foreach 11 -------------------------------
1 CREATE TABLE `blog` ( 2 `id` varchar(50) NOT NULL COMMENT ‘博客id‘, 3 `title` varchar(100) NOT NULL COMMENT ‘博客标题‘, 4 `author` varchar(30) NOT NULL COMMENT ‘博客作者‘, 5 `create_time` datetime NOT NULL COMMENT ‘创建时间‘, 6 `views` int(30) NOT NULL COMMENT ‘浏览量‘ 7 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 import org.junit.Test; 2 3 import java.util.UUID; 4 5 public class IDUtils { 6 7 public static String getId(){ 8 return UUID.randomUUID().toString().replaceAll("-",""); 9 } 10 11 @Test 12 public void test(){ 13 System.out.println(IDUtils.getId()); 14 System.out.println(IDUtils.getId()); 15 System.out.println(IDUtils.getId()); 16 } 17 }
1 import lombok.Data;
2
3 import java.util.Date;
4
5 @Data
6 public class Blog {
7
8 private String id;
9 private String title;
10 private String author;
11 private Date createTime; //属性名和数据库字段名不一致,数据库字段名为create_time 需要开启驼峰命名转换
12 private int views;
13 }
1 import edu.ustc.wzh.pojo.Blog; 2 3 public interface BlogMapper { 4 5 //插入数据 6 int addBlog(Blog blog); 7 }
1 <!--namespace用于绑定一个对应的Dao/Mapper接口--> 2 <mapper namespace="edu.ustc.wzh.dao.BlogMapper"> 3 4 <insert id="addBlog" parameterType="Blog"> 5 insert into mybatis.blog(id, title, author, create_time, views) 6 value (#{id},#{title},#{author},#{createTime},#{views}); 7 </insert> 8 9 10 </mapper>
1 @Test 2 public void addInitBlog(){ 3 SqlSession session = MybatisUtils.getSession(); 4 BlogMapper mapper = session.getMapper(BlogMapper.class); 5 6 Blog blog = new Blog(); 7 blog.setId(IDUtils.getId()); 8 blog.setTitle("Mybatis如此简单"); 9 blog.setAuthor("狂神说"); 10 blog.setCreateTime(new Date()); 11 blog.setViews(9999); 12 13 mapper.addBlog(blog); 14 15 blog.setId(IDUtils.getId()); 16 blog.setTitle("Java如此简单"); 17 mapper.addBlog(blog); 18 19 blog.setId(IDUtils.getId()); 20 blog.setTitle("Spring如此简单"); 21 mapper.addBlog(blog); 22 23 blog.setId(IDUtils.getId()); 24 blog.setTitle("微服务如此简单"); 25 mapper.addBlog(blog); 26 27 session.close(); 28 }
1 //根据传入的属性查询博客(例如传入作者就查作者,传入title就查title) 2 List<Blog> queryBlogIF(Map map);
1 <select id="queryBlogIF" parameterType="map" resultType="blog"> 2 select * from mybatis.blog where 1=1 3 <if test="title != null"> 4 and title = #{title} 5 </if> 6 <if test="author != null"> 7 and author = #{author} 8 </if> 9 </select>
1 @Test 2 public void queryBlogIFTest(){ 3 SqlSession session = MybatisUtils.getSession(); 4 BlogMapper mapper = session.getMapper(BlogMapper.class); 5 6 7 Map<String,String> map = new HashMap<String,String>(); 8 map.put("title","Mybatis如此简单"); 9 10 List<Blog> blogs = mapper.queryBlogIF(map); 11 12 for (Blog blog : blogs) { 13 14 System.out.println(blog); 15 } 16 17 session.close(); 18 }
1 <select id="queryBlogIF" parameterType="map" resultType="blog"> 2 select * from mybatis.blog 3 <where> 4 <if test="title != null"> 5 and title = #{title} 6 </if> 7 <if test="author != null"> 8 and author = #{author} 9 </if> 10 </where> 11 </select>
1 List<Blog> queryBlogChoose(Map map);
1 <select id="queryBlogChoose" parameterType="map" resultType="blog"> 2 select * from mybatis.blog 3 <where> 4 <choose> 5 <when test="title != null"> 6 title = #{title} 7 </when> 8 <when test="author != null"> 9 and author = #{author} 10 </when> 11 <otherwise> 12 and views = #{views} 13 </otherwise> 14 </choose> 15 </where> 16 </select>
1 @Test 2 public void queryBlogChooseTest(){ 3 SqlSession session = MybatisUtils.getSession(); 4 BlogMapper mapper = session.getMapper(BlogMapper.class); 5 6 7 Map<String,String> map = new HashMap<String,String>(); 8 map.put("title","Mybatis如此简单"); 9 10 List<Blog> blogs = mapper.queryBlogChoose(map); 11 12 for (Blog blog : blogs) { 13 14 System.out.println(blog); 15 } 16 17 session.close(); 18 }
1 int updateBlogSet(Map map);
1 <update id="updateBlogSet" parameterType="map"> 2 update mybatis.blog 3 <set> 4 <if test="title != null"> 5 title = #{title}, 6 </if> 7 <if test="author != null"> 8 author = #{author} 9 </if> 10 </set> 11 where id = #{id} 12 </update>
1 @Test 2 public void updateBlogSetTest(){ 3 SqlSession session = MybatisUtils.getSession(); 4 BlogMapper mapper = session.getMapper(BlogMapper.class); 5 6 7 Map<String,String> map = new HashMap<String,String>(); 8 map.put("title","我学习Mybatis如此简单"); 9 map.put("id","5a95b31cb1494aa68c498c5c54243439"); 10 11 int res = mapper.updateBlogSet(map); 12 13 if (res > 0){ 14 System.out.println("更新成功!"); 15 } 16 17 session.close(); 18 }
<trim prefix="" prefixOverrides="" suffix="" suffixOverrides=""></trim>
<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>
<trim prefix="SET" suffixOverrides=","> ... </trim>
1 <sql id="if-title-author"> 2 <if test="title != null"> 3 title = #{title} 4 </if> 5 <if test="author != null"> 6 and author = #{author} 7 </if> 8 </sql>
1 <select id="queryBlogIF" parameterType="map" resultType="blog"> 2 select * from mybatis.blog 3 <where> 4 <!-- 引用 sql 片段,如果refid 指定的不在本文件中,那么需要在前面加上 namespace --> 5 <include refid="if-title-author"></include> 6 <!-- 在这里还可以引用其他的 sql 片段 --> 7 </where> 8 </select>
select * from blog where 1=1 and (id=1 or id=2 or id=3)
1 collection:指定输入对象中的集合属性 2 item:每次遍历生成的对象 3 open:开始遍历时的拼接字符串 4 close:结束时拼接的字符串 5 separator:遍历对象之间需要拼接的字符串
1 List<Blog> queryBlogForeach(Map map);
1 <select id="queryBlogForeach" parameterType="map" resultType="blog"> 2 select * from blog 3 <where> 4 <!-- 5 collection:指定输入对象中的集合属性 6 item:每次遍历生成的对象 7 open:开始遍历时的拼接字符串 8 close:结束时拼接的字符串 9 separator:遍历对象之间需要拼接的字符串 10 select * from blog where 1=1 and (id=1 or id=2 or id=3) 11 --> 12 <foreach collection="ids" item="blogId" open="and (" close=")" separator="or"> 13 id=#{blogId} 14 </foreach> 15 </where> 16 </select>
1 @Test 2 public void queryBlogForeachTest(){ 3 SqlSession session = MybatisUtils.getSession(); 4 BlogMapper mapper = session.getMapper(BlogMapper.class); 5 6 HashMap map = new HashMap(); 7 List<Integer> ids = new ArrayList<Integer>(); 8 ids.add(1); 9 ids.add(2); 10 ids.add(3); 11 map.put("ids",ids); 12 13 List<Blog> blogs = mapper.queryBlogForeach(map); 14 15 System.out.println(blogs); 16 17 session.close(); 18 }
原文:https://www.cnblogs.com/zhihaospace/p/12301873.html