Mybatis

背景

学习一个东西的时候我们要明确没有他的时候我们是如何做的,当有了这个工具以后,我们减少了多少工作量。如当前的mybatis,没有mybatis的时候我们需要做什么工作,有了以后我们还需要做什么。

步骤

宏观

Mybatis是如何工作的呢??

在这里插入图片描述MyBatis理解为后端服务连接数据库的一个工具或框架。更准确地说,MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原始类型、接口和Java POJO(Plain Old Java Objects,普通的Java对象)为数据库中的记录。

在这里插入图片描述
我们的后端服务想要找到数据库,如果没有mybatis的时候我们需要先在项目中配置数据库的一些参数,然后根据这些参数进行连接,连接以后在实际工作中要注入一些参数,还有返回的数据也要按照某些类的格式进行接收。所以上边一共分为两部分,一部分是前置工作,一部分是为了真正运行的时候使用的。
Executor 是管连接的,StatementHandler 是管真正运行的时候查询的。
在这里插入图片描述

微观

5w2h

在这里插入图片描述

优点:
Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高

缺点:
SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写 SQL 语句的功底有一定要求
SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

历史角度分析

传统JDBC连接步骤:

在这里插入图片描述
这些动作需要手动执行完成。

Hibernate 和 MyBatis 有什么区别:

都是对 jdbc 的封装,都是应用于持久层的框架。

Hibernate 是标准的 ORM 框架,SQL 编写量较少,但不够灵活,适合于需求相对稳定,中小型的软件项目,比如:办公自动化系统
MyBatis 是半 ORM 框架,需要编写较多 SQL,但是比较灵活,适合于需求变化频繁,快速迭代的项目,比如:电商网站

Statement与PreparedStatement的区别(是否复用),和$ 和 # 区别这个问题如出一辙。

下边从两个维度去思考这个问题。

  1. 预编译(复用
    ①、Statement:每次执行Statement对象的executeQuery或executeUpdate方法时,SQL 语句在数据库端都需要重新编译和执行。这适用于一次性执行的 SQL 语句。

②、PreparedStatement:代表预编译的 SQL 语句的对象。这意味着 SQL 语句在PreparedStatement对象创建时就被发送到数据库进行预编译。

之后,可以通过设置参数值来多次高效地执行这个 SQL 语句。这不仅减少了数据库编译 SQL 语句的开销,也提高了性能,尤其是对于重复执行的 SQL 操作。

  1. 参数化查询(防止sql注入
    Statement:不支持参数化查询。如果需要在 SQL 语句中插入变量,通常需要通过字符串拼接的方式来实现,这会增加 SQL 注入攻击的风险。
    PreparedStatement:支持参数化查询,即可以在 SQL 语句中使用问号(?)作为参数占位符。通过setXxx方法(如setString、setInt)设置参数,可以有效防止 SQL 注入。
    总的来说,PreparedStatement相比Statement有着更好的性能和更高的安全性,是执行 SQL 语句的首选方式,尤其是在处理含有用户输入的动态查询时。

自动加单引号的话如果用索引的话不会索引失效吗?????

使用

后端如何和数据库说上话的, 为什么 Mapper 接口不需要实现类

在这里插入图片描述

获取 Mapper
我们都知道定义的 Mapper 接口是没有实现类的,Mapper 映射其实是通过动态代理实现的(这里是基于接口实现的,cjlib是基于继承实现的)。MapperProxyFactory 的作用是生成 MapperProxy(Mapper 代理对象)。MapperMethod 里的 excute 方法,会真正去执行 sql。这里用到了命令模式,其实绕一圈,最终它还是通过 SqlSession 的实例去运行对象的 sql。

在 mapper 中如何传递多个参数

在这里插入图片描述

参数名不一致如何做
Mybatis 是否支持延迟加载?原理

MyBatis 主要使用 JDK 动态代理来创建 Mapper 接口的代理对象,而不是直接用于实现延迟加载关联对象的功能(延迟加载通常使用 CGLIB 或其他增强技术)。

Mybatis 支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询。在 Mybatis 配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。
它的原理是,使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是 null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用。这就是延迟加载的基本原理。
当然了,不光是 Mybatis,几乎所有的包括 Hibernate,支持延迟加载的原理都是一样的。

总结

相关推荐

  1. <span style='color:red;'>MyBatis</span>

    MyBatis

    2024-05-01 16:22:04      59 阅读
  2. <span style='color:red;'>Mybatis</span>

    Mybatis

    2024-05-01 16:22:04      70 阅读
  3. Mybatis

    2024-05-01 16:22:04       61 阅读
  4. <span style='color:red;'>MyBatis</span>

    MyBatis

    2024-05-01 16:22:04      44 阅读
  5. <span style='color:red;'>Mybatis</span>

    Mybatis

    2024-05-01 16:22:04      53 阅读
  6. Mybatis

    2024-05-01 16:22:04       55 阅读
  7. <span style='color:red;'>Mybatis</span>

    Mybatis

    2024-05-01 16:22:04      47 阅读
  8. <span style='color:red;'>Mybatis</span>

    Mybatis

    2024-05-01 16:22:04      32 阅读
  9. <span style='color:red;'>MyBatis</span>

    MyBatis

    2024-05-01 16:22:04      37 阅读
  10. <span style='color:red;'>MyBatis</span>

    MyBatis

    2024-05-01 16:22:04      33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-01 16:22:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-01 16:22:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-01 16:22:04       87 阅读
  4. Python语言-面向对象

    2024-05-01 16:22:04       96 阅读

热门阅读

  1. ubuntu20.04下Stable Video Diffusion安装和测试

    2024-05-01 16:22:04       32 阅读
  2. 【NetTopologySuite类库】计算三点所在平面的法向量

    2024-05-01 16:22:04       24 阅读
  3. 机器学习之sklearn基础教程

    2024-05-01 16:22:04       33 阅读
  4. 设计模式的原则与分类

    2024-05-01 16:22:04       30 阅读
  5. 中国南玻集团(三面)

    2024-05-01 16:22:04       28 阅读
  6. selenium4.x 之POM概况

    2024-05-01 16:22:04       33 阅读
  7. 【QT教程】QT6图形渲染与OpenGL编程

    2024-05-01 16:22:04       26 阅读