概念

  • 根据不同环境生成不同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>

常用标签

  1. where&set

  • 取代死板的关键字【WHERE】和【SET】,提供灵活的SQL语句拼接,在满足条件后才加上对应SQL关键字
  1. 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>
  1. 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的更多相关文章

  1. mybatis学习 十 动态 SQL

    1.  根据方法传入的参数不同执行不同的 SQL 命令.称为动态 SQL, MyBatis 中动态 SQL 就是在 mapper.xml 中添加逻辑判断等. 2. <if>标签 <s ...

  2. mybatis学习之动态sql

    mybatis的动态sql语句很强大,在mapper映射文件中使用简单的标签即可实现该效果,下面一个个记录: 1.select查询 简单的select类似如下: <select id=" ...

  3. mybatis 学习五 动态SQL语句

    3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的selectKey ...

  4. Mybatis进阶学习笔记——动态sql

    1.if标签 <select id="queryByNameAndTelephone" parameterType="Customer" resultTy ...

  5. Mybatis学习笔记17 - sql标签和include标签

    示例代码: 接口定义: package com.mybatis.dao; import com.mybatis.bean.Employee; import org.apache.ibatis.anno ...

  6. Mybatis学习笔记导航

    Mybatis小白快速入门 简介 本人是一个Java学习者,最近才开始在博客园上分享自己的学习经验,同时帮助那些想要学习的uu们,相关学习视频在小破站的狂神说,狂神真的是我学习到现在觉得最GAN的老师 ...

  7. MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)——动态SQL

  8. Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)

    一.输入映射和输出映射 1.1 parameterType(输入类型) [传递简单类型] 详情参考Mybatis学习笔记之一(环境搭建和入门案例介绍) 使用#{}占位符,或者${}进行sql拼接. [ ...

  9. mybatis 学习笔记(二):mybatis SQL注入问题

    mybatis 学习笔记(二):mybatis SQL注入问题 SQL 注入攻击 首先了解下概念,什么叫SQL 注入: SQL注入攻击,简称SQL攻击或注入攻击,是发生于应用程序之数据库层的安全漏洞. ...

随机推荐

  1. android动画系列

    Android 属性动画(Property Animation) 完全解析 (上 动画系列 - 传统View动画与Property动画基础及比较 [Android 基础]Animation 动画介绍和 ...

  2. js笔记4

    1.js数据类型分析 (1)基础类型:string.number.boolean.null.undefined (2)引用类型:object-->json.array... 2.点运算  xxx ...

  3. win7旗舰版任务栏窗口不合并显示,鼠标移至窗口时可预览应用内容

    1.鼠标移至任务栏--右键--属性: 2.选择"当任务栏被占满时合并"或"从不合并",第一个选项更优: 3.右键桌面"计算机"的" ...

  4. 什么是OSI的第7层

    1.什么是Internet的第7层? 第7层是指Internet的7层OSI模型的顶层,也称为"应用程序层".这是数据处理的顶层,位于用户与之交互的软件应用程序的表面之下或幕后.例 ...

  5. Kubernetes之DaemonSet

    1.DaemonSet在每个节点上运行一个pod K8s中Replicationcontroller和ReplicaSet都用于在Kubernetes集群上运行部署特定数量的pod.但是,当希望pod ...

  6. 其他:IDEA插件无法安装——网络代理设置

    1.网络代理设置 IDEA配置代理,是在File-> Setting-> plugins中设置 查看自己主机的IP地址 文章转载至:https://www.jianshu.com/p/62 ...

  7. [心得笔记]spring常用的三种依赖注入方式

    一.目前使用最广泛的 @Autowired:自动装配 基于@Autowired的自动装配,默认是根据类型注入,可以用于构造器.接口.方法注入,使用方式如下: @Autowired 构造方法.方法.接口 ...

  8. Linux date 获取时间

    获取当前日期: ubuser@ubuser-OptiPlex-7010:~$ date +%Y_%m_%d2020_12_16 获取当前时间: ubuser@ubuser-OptiPlex-7010: ...

  9. Nginx 实践:location 路径匹配

    1. 目标 nginx 反向代理,路径映射的过程是什么?如何配置路径映射规则? 2.location 路径匹配 2.1 匹配规则: location 路径正则匹配: 符号 说明 ~ 正则匹配,区分大小 ...

  10. [小技巧] 在bash中生成随机数

    译至:http://d.hatena.ne.jp/anmino/20091017/1255705586 bash的SHELL参数RANDOM可以生成0-32767的随机数.想设定从1到N的随机数范围的 ...