前言:

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

创建User表

/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`username` varchar(20) NOT NULL,
`age` int(3) NOT NULL,
`phone` varchar(11) NOT NULL,
`email` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; /*Data for the table `user` */ insert into `user`(`id`,`name`,`username`,`age`,`phone`,`email`) values (1,'张三','zs',18,'','4567899@qq.com'),(2,'李四','ls',19,'','567657642@qq.com'),(3,'王五','ww',20,'','2323248@qq.com'); /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

if标签

User实体

package cn.cnki.ref.pojo;

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 + "]";
}
}

UserMapper

package cn.cnki.ref.mapper;

import cn.cnki.ref.pojo.User;

import java.util.List;

public interface UserMapper {
public List<User> getUser(User user);
}

UserMapper.xml

<?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="cn.cnki.ref.mapper.UserMapper"> <select id="getUser" resultType="cn.cnki.ref.pojo.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> </mapper>

UserController

package cn.cnki.ref.controller;

import cn.cnki.ref.mapper.UserMapper;
import cn.cnki.ref.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController
public class UserController {
@Autowired
private UserMapper UserMapper; @GetMapping("/getUser")
public List<User> getUser() {
User user = new User(1, "张三", null, 18, null, null);
List<User> users = UserMapper.getUser(user);
System.out.println(users);
return users;
} }

测试

http://localhost:8080/getUser

choose (when, otherwise)标签

  choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。

  例如下面例子,同样把所有可以限制的条件都写上,方面使用。choose会从上到下选择一个when标签的test为true的sql执行。安全考虑,我们使用where将choose包起来,放置关键字多于错误。

<!--  choose(判断参数) - 按顺序将实体类 User 第一个不为空的属性作为:where条件 -->
<select id="getUserList_choose" resultMap="resultMap_user" parameterType="com.yiibai.pojo.User">
SELECT *
FROM User u
<where>
<choose>
<when test="username !=null ">
u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%')
</when >
<when test="sex != null and sex != '' ">
AND u.sex = #{sex, jdbcType=INTEGER}
</when >
<when test="birthday != null ">
AND u.birthday = #{birthday, jdbcType=DATE}
</when >
<otherwise>
</otherwise>
</choose>
</where>
</select>

where标签

<select id="getUser" resultType="cn.cnki.ref.pojo.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>

输出sql语句

trim标签

 <select id="getUser" resultType="cn.cnki.ref.pojo.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>

trim标签下的四个属性:

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

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

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

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

set标签

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

UserMapper

public interface UserMapper {
public int updateUserById(User user);
}

UserMapper.xml

<?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="cn.cnki.ref.mapper.UserMapper"> <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> </mapper>

UserController

package cn.cnki.ref.controller;

import cn.cnki.ref.mapper.UserMapper;
import cn.cnki.ref.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController
public class UserController {
@Autowired
private UserMapper UserMapper; @GetMapping("/updateUserById")
public int updateUserById() {
User user = new User(1, null, null, 21, "12545564454", "14548445@qq.com");
return UserMapper.updateUserById(user);
}
}

测试结果

switch\when标签

1描述需求:

  满足id!=null查询id,

  否则,看满足age否,

  接着,看name是否满足,

  最后,按age>10查询

2.改mapper映射

<select id="getUser" resultType="cn.cnki.ref.pojo.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.测试结果

foreach标签

1.需求描述:

  查出多个id的user

2.添加mapper接口

 public List<User> listById(List<Integer> ids);

3添加mapper映射

<select id="listById" resultType="cn.cnki.ref.pojo.User" parameterType="list">
select * from user where id in
<foreach collection="list" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</select>

4.测试

 @GetMapping("/listById")
public List<User> listById() {
List<User> users = UserMapper.listById(Arrays.asList(1,2));
System.out.println(users);
return users;
}

5.foreach标签下的所有属性:

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

  item:遍历的单个属性值

  separator:拼接隔离的字符串

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

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

  index:索引,在map中作为key

bind

bind标签可以使用OGNL表达式创建一个变量并将其绑定到上下文中。

使用concat函数连接字符串,在MySQL中,这个函数支持多个参数,但是在Oracle中只支持两个参数。 由于不同数据库之间的语法差异,如果更换了数据库,有些SQL语句可能就需要重写。 针对这种情况,可以使用bind标签来避免由于更换数据库带来的一些麻烦。

Java SSM框架之MyBatis3(八)MyBatis之动态SQL的更多相关文章

  1. Java SSM框架之MyBatis3(一)MyBatis入门

    MyBatis3介绍 mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的o ...

  2. Java SSM框架之MyBatis3(二)MyBatis之Mapper代理的开发方式

    Mapper代理的开发规范 1. mapper接口的全限定名要和mapper映射文件的namespace值一致. 2. mapper接口的方法名称要和mapper映射文件的statement的id一致 ...

  3. Java SSM框架之MyBatis3(四)MyBatis之一对一、一对多、多对多

    项目搭建Springboot 1.5  pom.xml <?xml version="1.0" encoding="UTF-8"?> <pro ...

  4. Java SSM框架之MyBatis3(七)MyBatis之参数取值

    在mybatis中,参数取值方式有两种:#{ } 和 ${ } 一.#{ } select * from student where name=#{name} 编译后执行的sql语句: select ...

  5. Java SSM框架之MyBatis3(六)MyBatis之参数传递

    一.单个参数  StudentParamsMapper package cn.cnki.ref.mapper; import cn.cnki.ref.pojo.Student; public inte ...

  6. Java SSM框架之MyBatis3(五)MyBatis之ResultMap详解

    resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中. resultMap包含的元素: <!--column不做限制,可以为任意 ...

  7. Java SSM框架之MyBatis3(三)Mybatis分页插件PageHelper

    引言 对于使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真不想花双倍的时间写count和select ...

  8. Java SSM框架之MyBatis3(十)MyBatis批量插入数据(MySql)

    插入成功后返回自增主键 <insert id="insertRole" parameterType="role" useGeneratedKeys=&qu ...

  9. java ssm框架 mapper文件里的#符号和$符号的区别

    Java SSM框架里面,Mapper.xml文件 (一)#符号生成的sql语句是作为传参的 <!-- 获得数据列表(包括课程相关信息) --> <select id="G ...

随机推荐

  1. Unity 2D相机公式换算(从其他博客上抄的)

    2d camera, unit坐标,单位换算 2d游戏可以使用平行投影的camera,这种camera需要设置size (orthographicSize),size的含义为屏幕高度的一半,不过单位不 ...

  2. 《unity 3D 游戏开发 第二版》宣雨松 分享 pdf下载

    链接:https://pan.baidu.com/s/1LfRTGUmaE_lGdcmd6QiZkg 提取码:e2sn

  3. 区块链Hyperledger Fabric 学习记录(一)开发环境搭建(ubuntu16.04/ubuntu18.04)

    目录 Fabric开发环境搭建 更新说明 教程环境及软件版本 Docker 安装Docker 配置用户组 配置Aliyun Docker加速器 安装docker-compose Go 下载源码 安装源 ...

  4. 小学四则运算APP 第一个冲刺阶段 第三天

    团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第一次冲刺阶段时间:11.17~11.27 本次发布是在与团队成员解决了昨天问题的基础上,再增加了几个界面,增加了一些功能,修改与增加的代 ...

  5. ELK 性能(1) — Logstash 性能及其替代方案

    ELK 性能(1) - Logstash 性能及其替代方案 介绍 当谈及集中日志到 Elasticsearch 时,首先想到的日志传输(log shipper)就是 Logstash.开发者听说过它, ...

  6. 微软必应词典UWP -2017春

    必应UWP调研,评测 软件平台:windows10 软件名称:微软必应词典 软件类型:UWP Bug Bug1 当在文本框中进行输入时,在谷歌拼音输入法状态下,无法使用Shift键切换到谷歌拼音的纯英 ...

  7. [专贴]Xshell 以及 shell 的快捷键

    Ctrl + a 切换到命令行开始Ctrl + e 切换到命令行末尾Ctrl + l 清除屏幕内容Ctrl + u 清除光标之前的内容Ctrl + k 清除光标之后的内容Ctrl + h 类似于退格键 ...

  8. php面试问答

    结合实际PHP面试,汇总自己遇到的问题,以及网上其他人遇到的问题,尝试提供简洁准确的答案 包含MySQL.Redis.Web.安全.网络协议.PHP.服务器.业务设计.线上故障.个人简历.自我介绍.离 ...

  9. mybatis 注解和xml 优缺点

    xml: 增加了xml文件,修改麻烦,条件不确定(ifelse判断),容易出错,特殊转义字符比如大于小于 注释: 复杂sql不好用,搜集sql不方便,管理不方便,修改需重新编译 #和$区别: 相同 都 ...

  10. Delphi DBGrid记录全选和反选拖动处理

    DBGrid1.DragMode   :=   dmManual;//留意这个设置不要变 procedure ApplicationEvents1Message(var Msg: tagMSG; va ...