开发工具:STS

前言:

mybatis框架中最具特色的便是sql语句中的自定义,而动态sql的使用又使整个框架更加灵活。

动态sql中的语法:

where标签

if标签

trim标签

set标签

switch\when标签

foreach标签


一、搭建项目

1.创建用户表:

    

2.添加实体:   

  1. package com.xm.pojo;
  2. /**
  3. * 用户实体
  4. * @author xm
  5. *
  6. */
  7. public class User {
  8.  
  9. private int id;
  10. private String name;
  11. private String username;
  12. private int age;
  13. private String phone;
  14. private String email;
  15. //无参构造函数必须有,ORM框架调用的就是无参构造函数
  16. public User() {
  17.  
  18. }
  19. public User(int id, String name, String username, int age, String phone, String email) {
  20. super();
  21. this.id = id;
  22. this.name = name;
  23. this.username = username;
  24. this.age = age;
  25. this.phone = phone;
  26. this.email = email;
  27. }
  28. public int getId() {
  29. return id;
  30. }
  31. public void setId(int id) {
  32. this.id = id;
  33. }
  34. public String getName() {
  35. return name;
  36. }
  37. public void setName(String name) {
  38. this.name = name;
  39. }
  40. public String getUsername() {
  41. return username;
  42. }
  43. public void setUsername(String username) {
  44. this.username = username;
  45. }
  46. public int getAge() {
  47. return age;
  48. }
  49. public void setAge(int age) {
  50. this.age = age;
  51. }
  52. public String getPhone() {
  53. return phone;
  54. }
  55. public void setPhone(String phone) {
  56. this.phone = phone;
  57. }
  58. public String getEmail() {
  59. return email;
  60. }
  61. public void setEmail(String email) {
  62. this.email = email;
  63. }
  64.  
  65. @Override
  66. public String toString() {
  67. return "User [id=" + id + ", name=" + name + ", username=" + username + ", age=" + age + ", phone=" + phone
  68. + ", email=" + email + "]";
  69. }
  70.  
  71. }

User.java

3.添加mapper接口:

  1. package com.xm.mapper;
  2.  
  3. /**
  4. * 用户mapper接口
  5. * @author xm
  6. *
  7. */
  8. public interface UserMapper {
  9.  
  10. }

UserMapper.java

4.添加mapper映射:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <!--用户mapper关系映射 -->
  4. <mapper namespace="com.xm.mapper.UserMapper">
  5.  
  6. </mapper>

UserMapper.xml

5.添加测试类:

  1. package com.xm;
  2.  
  3. import org.junit.runner.RunWith;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import org.springframework.test.context.junit4.SpringRunner;
  7.  
  8. import com.xm.mapper.UserMapper;
  9.  
  10. @RunWith(SpringRunner.class)
  11. @SpringBootTest
  12. public class UserTest {
  13.  
  14. @Autowired
  15. private UserMapper userMapper;
  16.  
  17. }

UserText.java

二、动态sql

1.if标签的使用 

(1)添加mapper接口:

  1. /**
  2. * 根据条件查出学生
  3. * @param user
  4. * @return
  5. */
  6. public List<User> getUser(User user);

(2)添加mapper映射:

  1. <select id="getUser" resultType="user">
  2. select * from user where 1=1
  3. <if test="id != null">and id=#{id} </if>
  4. <if test="age != null">and age=#{age} </if>
  5. <if test="name != null">and name=#{name}</if>
  6. </select>

(3)添加测试:

  1. @Autowired
  2. private UserMapper userMapper;
  3.  
  4. @Test
  5. public void getUserTest() {
  6. User user = new User(null , "小明" , null , 12 , null , null);
  7. List<User> users = userMapper.getUser(user);
  8. System.out.println(users);
  9.  
  10. }

(4)测试结果:

(5)思考:

where 1=1 在这里的作用是什么呢?可以不用它吗?

2.where标签的使用

(1)更改mapper映射:

  1. <select id="getUser" resultType="user">
  2. select * from user
  3. <where>
  4. <if test="id != null">and id=#{id} </if>
  5. <if test="age != null">and age=#{age} </if>
  6. <if test="name != null">and name=#{name}</if>
  7. </where>
  8. </select>

(2)测试结果:

(3)思考:

and id=#{id} 换成 id=#{id} and 会怎样?

3.trim标签的使用

(1)更改mapper映射:

  1. <select id="getUser" resultType="user">
  2. select * from user
  3. <trim prefix="where" suffixOverrides="and">
  4. <if test="id != null">id=#{id} and</if>
  5. <if test="age != null">age=#{age} and</if>
  6. <if test="name != null">name=#{name} and</if>
  7. </trim>
  8. </select>

(2)测试结果:

(3)分析:

trim标签下的四个属性:

prefix:在标签开始添加上该字符串

suffixOverrides:在标签末尾去除上该字符串

suffix:在标签末尾添加上该字符串

prefixOverrides:在标签开始去除上该字符串

4.set标签的使用

(1)描述需求:

用在update语句中,如果字段参数不为null,则修改此参数

(2)添加mapper接口:

  1. /**
  2. * 根据id修改所有非空字段
  3. * @param user
  4. */
  5. public void updateUserById(User user);

(3)添加mapper映射:

  1. <update id="updateUserById">
  2. update user
  3. <set>
  4. <if test="name != null">name=#{name},</if>
  5. <if test="age != null">age=#{age},</if>
  6. <if test="username != null">username=#{username},</if>
  7. <if test="email != null">email=#{email},</if>
  8. <if test="phone != null">phone=#{phone}</if>
  9. </set>
  10. <where>
  11. id=#{id}
  12. </where>
  13. </update>

(4)添加测试方法:

  1. @Test
  2. public void updateUserTest() {
  3.  
  4. User user = new User(1, null, null, null, "12545564454", "14548445@qq.com");
  5. userMapper.updateUserById(user);
  6.  
  7. }

(5)测试结果

5.switch\when标签的使用

(1)描述需求:

满足id!=null查询id,

否则,看满足age否,

接着,看name是否满足,

最后,按age>10查询

(2)更改mapper映射:

  1. <select id="getUser" resultType="user">
  2. select * from user where
  3. <choose>
  4. <when test="id != null">id=#{id} </when>
  5. <when test="age != null">age=#{age}</when>
  6. <when test="name != null">name=#{name} </when>
  7. <otherwise>age>10</otherwise>
  8. </choose>
  9. </select>

(3)测试结果:

6.foreach标签的使用

(1)需求描述:

查出多个id的user

(2)添加mapper接口:

  1. /**
  2. * 根据id批量查询
  3. * @param ids
  4. * @return
  5. */
  6. public List<User> listById(List<Integer> ids);

(3)添加mapper映射:

  1. <select id="listById" resultType="user" parameterType="list">
  2. select * from user where id in
  3. <foreach collection="list" item="id" separator="," open="(" close=")">
  4. #{id}
  5. </foreach>
  6. </select>

(4)添加测试用例:

  1. @Test
  2. public void listTest() {
  3.  
  4. List<User> users = userMapper.listById(Arrays.asList(1));
  5. System.out.println(users);
  6.  
  7. }

(5)分析:

foreach标签下的所有属性:

collection:获取的集合名,如果是list集合,springboot会把它的key值默认封装为list

item:遍历的单个属性值

separator:拼接隔离的字符串

open:在循环的开始拼接的字符串

close:在循环的结束拼接的字符串

index:索引,在map中作为key


                                                                                2018-07-04

9、SpringBoot+Mybatis整合------动态sql的更多相关文章

  1. 一分钟带你了解下MyBatis的动态SQL!

    MyBatis的强大特性之一便是它的动态SQL,以前拼接的时候需要注意的空格.列表最后的逗号等,现在都可以不用手动处理了,MyBatis采用功能强大的基于OGNL的表达式来实现,下面主要介绍下. 一. ...

  2. Mybatis解析动态sql原理分析

    前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...

  3. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

  4. mybatis 使用动态SQL

    RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...

  5. MyBatis框架——动态SQL、缓存机制、逆向工程

    MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...

  6. 使用Mybatis实现动态SQL(一)

    使用Mybatis实现动态SQL 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面:        *本章节适合有Mybatis基础者观看* 前置讲解 我现在写一个查询全部的 ...

  7. MyBatis探究-----动态SQL详解

    1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不 ...

  8. SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版)

    SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版) ================================ ©Copyright 蕃薯耀 2 ...

  9. mybatis中的.xml文件总结——mybatis的动态sql

    resultMap resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功. 如果sql查询字段名和pojo的属性名不一致,可以通过re ...

随机推荐

  1. iTween 不能两个游戏对象同时用一个Hashtable

    两个游戏对象,点击其中一个,两个对象一起旋转,再点一下,两个都旋转到原来角度. 如图:两个游戏对象不能用一个Hashtable,会出错,达不到两个一起转的效果. 每个对象要有自己的Hashtable来 ...

  2. Missing artifact jdk.tools:jdk.tools:jar:1.6

    今天从svn上面下载了一个mavan项目,出现Missing artifact jdk.tools:jdk.tools:jar:1.6 这个错误. 怎么解决了,在我的根pom.xml 下加入这个依赖就 ...

  3. linux内核态和用户态小结

    一 内核态和用户态的区别 当进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核状态.此时处理器处于特权级最高的(0级)内核代码.当进程处于内核态时,执行的内核代码会使用当前的内核栈.每个进程 ...

  4. 【snmp】测试流程

    一.SNMP协议概述 SNMP是基于TCP/IP协议族的网络管理标准,是一种在IP网络中管理网络节点(如服务器.工作站.路由器.交换机等)的标准协议.SNMP能够使网络管理员提高网络管理效能,及时发现 ...

  5. C#使用MediaInfo查看媒体信息

    1.将MediaInfo.dll放入可执行目录. 2.将官网Demo里的MediaInfoDLL.cs放入项目中.(http://mediainfo.sourceforge.net/en/Downlo ...

  6. Ajax实现跨域访问的三种方法

    转载自:http://www.jb51.net/article/68424.htm 一.什么是跨域 我们先回顾一下域名地址的组成: http:// www . google : 8080 / scri ...

  7. JavaScript 函数 (function)

    //声明(有参数.有返回值) function fun() { var name = '小黑'; ) { name = arguments[]; //接受参数 } alert(name); retur ...

  8. 异步对象(XMLHttpRequest)的帮助脚本

    异步对象五部曲 这是post请求的. //1.00创建异步对象 var xhr = new XMLHttpRequest(); //2.0 xhr.open("post", url ...

  9. 【起航计划 002】2015 起航计划 Android APIDemo的魔鬼步伐 01

    本文链接:[起航计划 002]2015 起航计划 Android APIDemo的魔鬼步伐 01 参考链接:http://blog.csdn.net/column/details/mapdigitap ...

  10. 使用C#实现计划任务(corn job)

    维基百科上是这样描述计划任务的: “Cron is a time-based job scheduler in Unix-like computer operating systems. Cron i ...