Mybatis学习笔记-动态SQL
概念
根据不同环境生成不同SQL语句,摆脱SQL语句拼接的烦恼【doge】
本质:SQL语句的拼接
环境搭建
- 搭建数据库
CREATE TABLE `blog`(
`id` VARCHAR(50) NOT NULL COMMENT 博客id,
`title` VARCHAR(100) NOT NULL COMMENT 博客标题,
`author` VARCHAR(30) NOT NULL COMMENT 博客作者,
`create_time` DATETIME NOT NULL COMMENT 创建时间,
`views` INT(30) NOT NULL COMMENT 浏览量
)ENGINE=INNODB DEFAULT CHARSET=utf8
- 创建一个基础Maven工程
- 编写配置文件(略)
- 编写实体类
package cn.iris.pojo;
import java.util.Date;
public class Blog {
private String id;
private String title;
private String author;
private Date creatTime;
private int views;
public Blog() {
}
public Blog(String id, String title, String author, Date creatTime, int views) {
this.id = id;
this.title = title;
this.author = author;
this.creatTime = creatTime;
this.views = views;
}
Getter&Setter
@Override
public String toString()
}
- 编写实体类对应Mapper接口以及Mapper.xml文件
IF语句
- Mapper.xml
<select id="queryBlogIF" parameterType="map" resultType="Blog">
SELECT * FROM blog WHERE 1=1
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null">
AND author like #{author}
</if>
<if test="views != 0">
AND views >= #{views}
</if>
</select>
常用标签
where&set
取代死板的关键字【WHERE】和【SET】,提供灵活的SQL语句拼接,在满足条件后才加上对应SQL关键字
choose&when&otherwise
类似于Java中的switch-case-default结构
匹配when则执行
- Mapper.xml
<select id="queryBlogChoose" parameterType="map" resultType="Blog">
SELECT * FROM blog
<where>
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null">
AND author like #{author}
</when>
<otherwise>
1=1
</otherwise>
</choose>
</where>
</select>
trim
提供自定义【WHERE】或【SET】标签内容
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
<trim prefix="SET" suffixOverrides=",">
...
</trim>
SQL片段
某些可复用的功能片段
- 定义SQL片段【sql标签抽取部分sql代码】
<sql id="if-title-author">
...
</sql>
- 引用SQL片段【include标签引用对应id的sql代码片段】
<include refid="if-title-author"></include>
- 注意事项:
- 最好基于单表定义SQL片段
- 不要存在where标签
Foreach
对集合遍历,通常是构建IN语句时
- open 第一个拼接的字符【'('】, separator 分隔符【','】,close 结尾拼接符【')'】,等同于IN(?,?,?)
- collection对应传入的集合,index为下标,item则为集合内对应下标元素,从而遍历集合内元素
- 若传入类型为【Map】或者【Map.Entry 对象】的集合,index传入键,item传入值
- Mapper.xml
<!--
sql: SELECT * FROM blog WHERE 1=1 AND (id=1 OR id=2 OR id=3)
在传递Map时,Map中可存在集合
-->
<select id="queryByForeach" parameterType="map" resultType="Blog">
SELECT * FROM blog
<where>
<foreach collection="ids" item="id" index=""
open="AND (" separator="OR" close=")">
id = #{id}
</foreach>
</where>
</select>
- 测试方法
@Test
public void queryBlogByForeach() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
HashMap<Object, Object> hashMap = new HashMap<>();
ArrayList<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(4);
hashMap.put("ids",ids);
List<Blog> blogs = mapper.queryByForeach(hashMap);
for ( Blog blog : blogs) {
System.out.println(blog);
}
sqlSession.close();
}
小结
- 动态SQL即是在拼接SQL语句,只要保证SQL的正确性,依照SQL的格式排列即可。
- 编写代码前应先实现SQL语法查询,然后依照SQL规则实现动态SQL。
Mybatis学习笔记-动态SQL的更多相关文章
- mybatis学习 十 动态 SQL
1. 根据方法传入的参数不同执行不同的 SQL 命令.称为动态 SQL, MyBatis 中动态 SQL 就是在 mapper.xml 中添加逻辑判断等. 2. <if>标签 <s ...
- mybatis学习之动态sql
mybatis的动态sql语句很强大,在mapper映射文件中使用简单的标签即可实现该效果,下面一个个记录: 1.select查询 简单的select类似如下: <select id=" ...
- mybatis 学习五 动态SQL语句
3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的selectKey ...
- Mybatis进阶学习笔记——动态sql
1.if标签 <select id="queryByNameAndTelephone" parameterType="Customer" resultTy ...
- Mybatis学习笔记17 - sql标签和include标签
示例代码: 接口定义: package com.mybatis.dao; import com.mybatis.bean.Employee; import org.apache.ibatis.anno ...
- Mybatis学习笔记导航
Mybatis小白快速入门 简介 本人是一个Java学习者,最近才开始在博客园上分享自己的学习经验,同时帮助那些想要学习的uu们,相关学习视频在小破站的狂神说,狂神真的是我学习到现在觉得最GAN的老师 ...
- MyBatis:学习笔记(4)——动态SQL
MyBatis:学习笔记(4)——动态SQL
- Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)
一.输入映射和输出映射 1.1 parameterType(输入类型) [传递简单类型] 详情参考Mybatis学习笔记之一(环境搭建和入门案例介绍) 使用#{}占位符,或者${}进行sql拼接. [ ...
- mybatis 学习笔记(二):mybatis SQL注入问题
mybatis 学习笔记(二):mybatis SQL注入问题 SQL 注入攻击 首先了解下概念,什么叫SQL 注入: SQL注入攻击,简称SQL攻击或注入攻击,是发生于应用程序之数据库层的安全漏洞. ...
随机推荐
- redis 客户端实现读写分离实现
背景 (1) redis单机的读写性能轻松上大几万,不过线上环境不会只部署光秃秃的一个节点,还是会配合 sentinel 再部署一个 slave作为高可用节点的: 但是standby的slave节点是 ...
- 关于开箱即用的文档静态网站生成器VuePress
关于VuePress 一个由Vue驱动的静态文档网站生成框架,具有开箱即用的优点. 给项目添加.gitignore .gitignore是git用来排除目录的清单,我们把以下目录加入其中,以便每次操作 ...
- frp+nginx内网穿透
frp+nginx内网穿透 背景:自己有台内网Linux主机,希望被外网访问(ssh.http.https): 准备工作 内网Linux主机-c,可以访问c主机和外网的主机-s(windows/lin ...
- 初识Sonarqube
Sonarqube 官方网站地址: 官方网站地址:https://www.sonarqube.org/ Sonarqube 官方介绍: 使用 SonarQube 静态分析,您可以在一个地方衡量项目中所 ...
- 锁分析 Lock
锁分析 Lock NonReentrantLock ReadLock 共享锁 ReentrantLock 重入锁 排他锁 sync.lock 返回值为void,表示如无异常发生都认为锁获取成功 Fai ...
- mybatis常用标签(转)
1. 定义sql语句 select 标签 属性介绍: id :唯一的标识符. parameterType:传给此语句的参数的全路径名或别名 例:com.test.poso.User或user resu ...
- MQTT介绍与使用(转载)
物联网是新一代信息技术的重要组成部分,也是"信息化"时代的重要发展阶段.其英文名称是:"Internet of things(IoT)".顾名思义,物联网就是物 ...
- npm run start失败&Node.js 查询指定端口运行情况及终止占用端口办法
缘由: node.js项目中运行npm run start命令脚本报错,No such file or directory 最开始以为是命令脚本找不到所谓的执行路径,但后面发现不是,是package. ...
- Linux | 文本编辑器vim
vim 编辑器介绍 vim 编辑器是一款非常棒的文本处理工具,它会默认安装在当前所有的 Linux 操作系统上面. vim 编辑器中设置了三种模式,可以极大的提高我们的工作效率: 命令模式:控制光标移 ...
- Socket 编程介绍
Socket 编程发展 Linux Socket 编程领域,为了处理大量连接请求场景,需要使用非阻塞 I/O 和复用.select.poll 和 epoll 是 Linux API 提供的 I/O 复 ...