9、SpringBoot+Mybatis整合------动态sql
开发工具:STS
前言:
mybatis框架中最具特色的便是sql语句中的自定义,而动态sql的使用又使整个框架更加灵活。
动态sql中的语法:
where标签
if标签
trim标签
set标签
switch\when标签
foreach标签
一、搭建项目
1.创建用户表:
2.添加实体:
- package com.xm.pojo;
- /**
- * 用户实体
- * @author xm
- *
- */
- public class User {
- private int id;
- private String name;
- private String username;
- private int age;
- private String phone;
- private String email;
- //无参构造函数必须有,ORM框架调用的就是无参构造函数
- public User() {
- }
- public User(int id, String name, String username, int age, String phone, String email) {
- super();
- this.id = id;
- this.name = name;
- this.username = username;
- this.age = age;
- this.phone = phone;
- this.email = email;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getPhone() {
- return phone;
- }
- public void setPhone(String phone) {
- this.phone = phone;
- }
- public String getEmail() {
- return email;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- @Override
- public String toString() {
- return "User [id=" + id + ", name=" + name + ", username=" + username + ", age=" + age + ", phone=" + phone
- + ", email=" + email + "]";
- }
- }
User.java
3.添加mapper接口:
- package com.xm.mapper;
- /**
- * 用户mapper接口
- * @author xm
- *
- */
- public interface UserMapper {
- }
UserMapper.java
4.添加mapper映射:
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
- <!--用户mapper关系映射 -->
- <mapper namespace="com.xm.mapper.UserMapper">
- </mapper>
UserMapper.xml
5.添加测试类:
- package com.xm;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.test.context.junit4.SpringRunner;
- import com.xm.mapper.UserMapper;
- @RunWith(SpringRunner.class)
- @SpringBootTest
- public class UserTest {
- @Autowired
- private UserMapper userMapper;
- }
UserText.java
二、动态sql
1.if标签的使用
(1)添加mapper接口:
- /**
- * 根据条件查出学生
- * @param user
- * @return
- */
- public List<User> getUser(User user);
(2)添加mapper映射:
- <select id="getUser" resultType="user">
- select * from user where 1=1
- <if test="id != null">and id=#{id} </if>
- <if test="age != null">and age=#{age} </if>
- <if test="name != null">and name=#{name}</if>
- </select>
(3)添加测试:
- @Autowired
- private UserMapper userMapper;
- @Test
- public void getUserTest() {
- User user = new User(null , "小明" , null , 12 , null , null);
- List<User> users = userMapper.getUser(user);
- System.out.println(users);
- }
(4)测试结果:
(5)思考:
where 1=1 在这里的作用是什么呢?可以不用它吗?
2.where标签的使用
(1)更改mapper映射:
- <select id="getUser" resultType="user">
- select * from user
- <where>
- <if test="id != null">and id=#{id} </if>
- <if test="age != null">and age=#{age} </if>
- <if test="name != null">and name=#{name}</if>
- </where>
- </select>
(2)测试结果:
(3)思考:
and id=#{id} 换成 id=#{id} and 会怎样?
3.trim标签的使用
(1)更改mapper映射:
- <select id="getUser" resultType="user">
- select * from user
- <trim prefix="where" suffixOverrides="and">
- <if test="id != null">id=#{id} and</if>
- <if test="age != null">age=#{age} and</if>
- <if test="name != null">name=#{name} and</if>
- </trim>
- </select>
(2)测试结果:
(3)分析:
trim标签下的四个属性:
prefix:在标签开始添加上该字符串
suffixOverrides:在标签末尾去除上该字符串
suffix:在标签末尾添加上该字符串
prefixOverrides:在标签开始去除上该字符串
4.set标签的使用
(1)描述需求:
用在update语句中,如果字段参数不为null,则修改此参数
(2)添加mapper接口:
- /**
- * 根据id修改所有非空字段
- * @param user
- */
- public void updateUserById(User user);
(3)添加mapper映射:
- <update id="updateUserById">
- update user
- <set>
- <if test="name != null">name=#{name},</if>
- <if test="age != null">age=#{age},</if>
- <if test="username != null">username=#{username},</if>
- <if test="email != null">email=#{email},</if>
- <if test="phone != null">phone=#{phone}</if>
- </set>
- <where>
- id=#{id}
- </where>
- </update>
(4)添加测试方法:
- @Test
- public void updateUserTest() {
- User user = new User(1, null, null, null, "12545564454", "14548445@qq.com");
- userMapper.updateUserById(user);
- }
(5)测试结果
5.switch\when标签的使用
(1)描述需求:
满足id!=null查询id,
否则,看满足age否,
接着,看name是否满足,
最后,按age>10查询
(2)更改mapper映射:
- <select id="getUser" resultType="user">
- select * from user where
- <choose>
- <when test="id != null">id=#{id} </when>
- <when test="age != null">age=#{age}</when>
- <when test="name != null">name=#{name} </when>
- <otherwise>age>10</otherwise>
- </choose>
- </select>
(3)测试结果:
6.foreach标签的使用
(1)需求描述:
查出多个id的user
(2)添加mapper接口:
- /**
- * 根据id批量查询
- * @param ids
- * @return
- */
- public List<User> listById(List<Integer> ids);
(3)添加mapper映射:
- <select id="listById" resultType="user" parameterType="list">
- select * from user where id in
- <foreach collection="list" item="id" separator="," open="(" close=")">
- #{id}
- </foreach>
- </select>
(4)添加测试用例:
- @Test
- public void listTest() {
- List<User> users = userMapper.listById(Arrays.asList(1));
- System.out.println(users);
- }
(5)分析:
foreach标签下的所有属性:
collection:获取的集合名,如果是list集合,springboot会把它的key值默认封装为list
item:遍历的单个属性值
separator:拼接隔离的字符串
open:在循环的开始拼接的字符串
close:在循环的结束拼接的字符串
index:索引,在map中作为key
2018-07-04
9、SpringBoot+Mybatis整合------动态sql的更多相关文章
- 一分钟带你了解下MyBatis的动态SQL!
MyBatis的强大特性之一便是它的动态SQL,以前拼接的时候需要注意的空格.列表最后的逗号等,现在都可以不用手动处理了,MyBatis采用功能强大的基于OGNL的表达式来实现,下面主要介绍下. 一. ...
- Mybatis解析动态sql原理分析
前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...
- MyBatis的动态SQL详解
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...
- mybatis 使用动态SQL
RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...
- MyBatis框架——动态SQL、缓存机制、逆向工程
MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...
- 使用Mybatis实现动态SQL(一)
使用Mybatis实现动态SQL 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面: *本章节适合有Mybatis基础者观看* 前置讲解 我现在写一个查询全部的 ...
- MyBatis探究-----动态SQL详解
1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不 ...
- SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版)
SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版) ================================ ©Copyright 蕃薯耀 2 ...
- mybatis中的.xml文件总结——mybatis的动态sql
resultMap resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功. 如果sql查询字段名和pojo的属性名不一致,可以通过re ...
随机推荐
- iTween 不能两个游戏对象同时用一个Hashtable
两个游戏对象,点击其中一个,两个对象一起旋转,再点一下,两个都旋转到原来角度. 如图:两个游戏对象不能用一个Hashtable,会出错,达不到两个一起转的效果. 每个对象要有自己的Hashtable来 ...
- Missing artifact jdk.tools:jdk.tools:jar:1.6
今天从svn上面下载了一个mavan项目,出现Missing artifact jdk.tools:jdk.tools:jar:1.6 这个错误. 怎么解决了,在我的根pom.xml 下加入这个依赖就 ...
- linux内核态和用户态小结
一 内核态和用户态的区别 当进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核状态.此时处理器处于特权级最高的(0级)内核代码.当进程处于内核态时,执行的内核代码会使用当前的内核栈.每个进程 ...
- 【snmp】测试流程
一.SNMP协议概述 SNMP是基于TCP/IP协议族的网络管理标准,是一种在IP网络中管理网络节点(如服务器.工作站.路由器.交换机等)的标准协议.SNMP能够使网络管理员提高网络管理效能,及时发现 ...
- C#使用MediaInfo查看媒体信息
1.将MediaInfo.dll放入可执行目录. 2.将官网Demo里的MediaInfoDLL.cs放入项目中.(http://mediainfo.sourceforge.net/en/Downlo ...
- Ajax实现跨域访问的三种方法
转载自:http://www.jb51.net/article/68424.htm 一.什么是跨域 我们先回顾一下域名地址的组成: http:// www . google : 8080 / scri ...
- JavaScript 函数 (function)
//声明(有参数.有返回值) function fun() { var name = '小黑'; ) { name = arguments[]; //接受参数 } alert(name); retur ...
- 异步对象(XMLHttpRequest)的帮助脚本
异步对象五部曲 这是post请求的. //1.00创建异步对象 var xhr = new XMLHttpRequest(); //2.0 xhr.open("post", url ...
- 【起航计划 002】2015 起航计划 Android APIDemo的魔鬼步伐 01
本文链接:[起航计划 002]2015 起航计划 Android APIDemo的魔鬼步伐 01 参考链接:http://blog.csdn.net/column/details/mapdigitap ...
- 使用C#实现计划任务(corn job)
维基百科上是这样描述计划任务的: “Cron is a time-based job scheduler in Unix-like computer operating systems. Cron i ...