MyBatis+Springboot 启动到SQL执行全流程(1)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
简介: MyBatis+Springboot 启动到SQL执行全流程

前言

本文我们将讲解Mybatis的动态sql是什么,以及如何解析,最终执行的全流程


一、MyBatis的Sql类型

1. 静态SQL

mybatis 静态sql 在编译期就已经确定其样子,就是可直接执行,或者填入参数即可执行的,如


SELECT * FROM users WHERE username = 'admin' AND password = #{password};

这种静态的sql在程序启动时,扫描到就可以生成对应的sqlsource。


2. 动态SQL

MyBatis的动态Sql是指在编写Sql语句时根据不同的条件动态地生成不同的Sql语句的技术。它可以根据不同的条件来选择不同的查询语句、修改语句、插入语句和删除语句等,减少了Sql语句的重复编写和维护成本,提高了Sql语句执行的效率。


MyBatis的动态Sql包括 if、choose、when、otherwise、trim、set、where、foreach 等标签,通过这些标签可以构建出多样化的Sql语句。因为语句最终样子不确定,需要根据入参的情况来动态生成不同样子的sql,所以叫动态sql


示例:

<select id="getUser" resultMap="UserMap">
  SELECT * FROM user
  <where>
    <if test="id != null">
      AND id = #{id}
    </if>
    <if test="name != null and name != ''">
      AND name = #{name}
    </if>
    <if test="age != null">
      AND age = #{age}
    </if>
  </where>
</select>
<insert id="addUser" parameterType="com.example.seeu.entity.User" >
        insert  into user(id,username,password) values
        <foreach collection="list" item="item" separator=",">
            (#{item.id}, #{item.username},#{item.password})
        </foreach>
</insert>

如上图,就是一段动态Sql,其中的 if 语句会先进行判断入参字段是否为空,如果不为空,才会在Sql中添加对应的的筛选条件;同时,我们也关注下 where 标签,这也是个动态标签,会帮我们检查筛选条件,帮我们补齐多个条件之间的 AND,如果是首条件前面带AND,也会自动帮我们去除。


二、流程1 —— 文件扫描并解析

1. 扫描xml文件

第一步肯定是先寻找,并加载到所有文件,但在此之前,我们必须配置好路径,否则Mybatis是无法加载到文件的。

#mybatis的相关配置
mybatis:
  #mapper配置文件【重点】
  mapper-locations: classpath:mapper/*.xml
  #开启驼峰命名
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: true

下图为SqlSessionFactoryBean.java 源码的主方法 buildSqlSessionFactory(),负责了遍历与解析xml的功能。

8ca960563f8345bbaf0f4737ad480fe7.png

我们这里强调两个步骤,

第一个就是命名空间绑定,这里主要是通过xml文件里的命名空间,找到其对应的Mapper接口,解析接口上的各类注解,最终将该Mapper接口及信息注册给Mybatis,需要注意的是,这里的注册与这些Mapper接口上的@Mapper注解无关,这里主要是收集Mapper实际的配置,注册进MyBatisConfiguration,最终会生成一个代理对象,并交由Mybatis管理和操作。而@Mapper则是一个桥梁,使得Spring容器也能获得该代理对象,进而在Spring的体系下,能使用上Mybatis的成果

第二个,就是对xml文件内容的解析,主要还是各个标签进行解析,我们下面会说到。

142aecda30e2411089694e38a3dc4788.png


2. 动态Sql解析

bfb5f5bc91ae48e2891ecd9b9646ae57.png

handler.handleNode 里面其实也调用 parseDynamicTags 方法,实现递归,此处实际上是将这些动态内容处理完后拼接成正常语法的Sql,如果嵌套的内容为动态,那么本层也标记为动态,注意,此时#{} 内容仅判断为动态SQL,并未做任何操作,所以拼接完仍然以#{} 形式存在

a4a36b3a35984ebc84fcf735adde2270.png

我们拿个简单的例子来说明

    <insert id="addUser" parameterType="com.zhanfu.springboot.demo.entity.User" >
        insert  into user(id,username,password) values
        <foreach collection="list" item="item">
            (#{item.id}, #{item.username},#{item.password})
        </foreach>
    </insert>

很明显,我们能看到这里面用了foreach标签,意味着是一个动态Sql,那么它最终会被解析成什么样呢?我们来看下图


492f0efd8e26442881bdeb220a9f0fe6.png

3. 保存解析结果

我们上面看到的最后,对每一个Mapper层的方法,都能解析出一个MappedStatement,这个东西最后会存在哪呢?其实它们会以Map的形式存在一个MyBatis单例配置类 Configuration 里。而这个配置类,毫无疑问也载入了容器中。

57a607bb4f904df29a510ac973465f2e.png

8a285874aafe4bd2ad2cc1fbd4842daa.png



目录
相关文章
|
16天前
|
Java 数据库连接 数据库
大事件后端项目05-----springboot整合mybatis
大事件后端项目05-----springboot整合mybatis
大事件后端项目05-----springboot整合mybatis
|
4天前
|
SQL Java 数据库连接
mybatis动态SQL常用语法总结
MyBatis 使用 OGNL 表达式语言处理动态SQL,如 `if` 标签进行条件判断,`choose`、`when`、`otherwise` 实现多条件选择,`where`、`set` 管理SQL关键字,`trim` 提供通用修剪功能,`foreach` 遍历集合数据。`sql` 和 `include` 用于代码重用,`selectKey` 处理插入后的返回值。参数传递支持匿名、具名、列表、Map、Java Bean和JSON方式。注意SQL转义及使用合适的jdbcType映射Java类型。
21 7
|
11天前
|
Java 数据库连接 Maven
文本,使用SpringBoot工程创建一个Mybatis-plus项目,Mybatis-plus在编写数据层接口,用extends BaseMapper<User>继承实体类
文本,使用SpringBoot工程创建一个Mybatis-plus项目,Mybatis-plus在编写数据层接口,用extends BaseMapper<User>继承实体类
|
12天前
|
Java 数据库连接 mybatis
SpringBoot配置Mybatis注意事项,mappers层下的name命名空间,要落实到Dao的video类,resultType要落到bean,配置好mybatis的对应依赖。
SpringBoot配置Mybatis注意事项,mappers层下的name命名空间,要落实到Dao的video类,resultType要落到bean,配置好mybatis的对应依赖。
|
18天前
|
SQL Java 数据库连接
深入探索MyBatis Dynamic SQL:发展、原理与应用
深入探索MyBatis Dynamic SQL:发展、原理与应用
|
17天前
|
SQL 缓存 Java
Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件
Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件
|
17天前
|
SQL Java 数据库连接
MyBatis动态SQL
MyBatis动态SQL
19 0
|
17天前
|
XML Java 数据库连接
|
前端开发 druid Java
SpringBoot 整合 MyBatis
文本是基于MVC前后端分离模式的一个SpringBoot整合MyBatis的项目,不过没有用到前端页面,使用了更方便的Apifox请求工具。SpringBoot+MyBatis使用起来更方便,更舒服。掌握SpingBoot整合MyBatis,要比Spring整合简单的多,少了很多繁琐的配置。......
183 0
SpringBoot 整合 MyBatis
|
XML 数据可视化 Java
Springboot整合mybatis(注解而且能看明白版本)
这篇文章主要讲解Springboot整合Mybatis实现一个最基本的增删改查功能,整合的方式有两种一种是注解形式的,也就是没有Mapper.xml文件,还有一种是XML形式的,我推荐的是使用注解形式,为什么呢?因为更加的简介,减少不必要的错误。
549 0
Springboot整合mybatis(注解而且能看明白版本)