MyBatis 是一个优秀的持久化框架,支持自定义 SQL、存储过程和高级映射。 那么,它是如何工作的呢?以及如何使用基础知识?本文将带您了解 Mybatis 的工作原理和使用方法。
工作原理图:
1. 读取 mybatis 配置文件
mybatis-config.XML 是 MyBatis 的全局配置文件,包含 MyBatis 的运行环境等信息,如数据库连接信息等。
2. 加载映射文件(sql映射文件,一般为xxxmapper.)。xml)
操作数据库的 SQL 语句在此文件中配置,需要在 mybatis 配置文件中配置 mybatis-config 文件xml文件。
xxxmapper.XML 可以在 mybatis-config 中找到一个 XML 文件可以加载多个映射文件,每个映射文件对应于数据库中的一个表。
3. 构建会话工厂
使用 Mybatis 环境等配置信息构建会话工厂 sqlsessionfactory。
4. 创建会话对象
会话工厂创建一个 sqlsession 对象,其中包含用于执行 SQL 语句的所有方法。
5. 遗嘱执行人 遗嘱执行人
Mybatis 定义了一个 Executor 接口来操作数据库,该接口会根据 sqlsession 传递的参数动态生成要执行的 SQL 语句,并负责查询缓存的维护。
6. MappedStatement 对象
在执行器接口的执行方法中有一个 mappedstatement 类型的参数,它是映射信息的封装,用于存储待映射的 SQL 语句的 id、参数等信息。
7. 输入参数映射
输入参数类型可以是集合类型(如 map 和 list),也可以是基本数据类型或 pojo 类型。 输入参数映射过程类似于 JDBC 为 PreparedStatement 对象设置参数的过程。
8. 输出结果映射
输出结果可以是集合类型(如 map 和 list),也可以是基本数据类型或 pojo 类型。 输出映射过程类似于 JDBC 对结果集的解析过程。
API 接口层
供外部使用的接口 API,开发人员可以通过这些 API 操作数据库。 接口层一旦收到调用请求,就会调用数据处理层完成具体的数据处理。
有两种方式可以与数据库进行交互:使用传统的 Mybatis API 和使用 mapper 接口。
1)使用传统Mybatis提供的API
这是将语句 id 和查询参数传递给 sqlsession 对象,并使用 sqlsession 对象完成与数据库交互的传统方式
MyBatis 提供了一个非常方便和简单的 API,供用户在数据库中添加、删除、修改和查询数据,以及维护数据库连接信息和 MyBatis 配置信息。
例:
上面使用 mybatis 的方法,就是创建一个处理数据库的 sqlsession 对象,然后根据语句 id 和参数操作数据库,简单实用,但不符合面向对象语言的概念和面向接口编程的编程习惯。sqlsession session = sqlsessionfactory.opensession();category c = new category();c.setname("新增类别");session.insert("addcategory",c);
2)使用mapper接口
Mybatis 将配置文件中的每个节点抽象成一个 mapper 接口,该接口中声明的方法对应节点中的节点项,即节点的 id 值是 mapper 接口中的方法名称,parametertype 值表示映射器对应方法的输入参数类型, ResultMap 值对应 Mapper 接口表示的返回值类型或返回结果集的元素类型。
例:
按照 Mybatis 的配置规范配置完成后,运行 sqlsessiongetmapper(xxxmapper.class) 方法,MyBatis 会根据对应接口声明的方法信息,通过动态 ** 机制生成一个映射器实例。sqlsession session = sqlsessionfactory.opensession();categorymapper mapper = session.getmapper(categorymapper.class);list cs = mapper.list();for (category c : cs)
当使用 mapper 接口的方法时,MyBatis 会根据方法名和方法的参数类型来确定语句 ID,底层仍然通过 sqlsessionselect(“statementId”,parameterObject) 或 sqlsessionupdate(“statementId”, parameterObject) 等。
Mybatis 指的是 mapper 接口,纯粹是为了面向接口的编程。
数据处理层
负责具体的SQL查找、SQL解析、SQL执行、执行结果映射处理。 其主要目的是根据请求的请求完成数据库操作。
1)参数映射和动态SQL语句生成
动态语句生成可以说是 MyBatis 框架设计得非常优雅,MyBatis 使用 OGNL 表达式通过输入参数值动态构造 SQL 语句,这使得 MyBatis 具有很强的灵活性和扩展性。
参数映射是指 j**a 数据类型和 jdbc 数据类型之间的转换,这里有两个过程:
在查询阶段,我们需要将 J**A 类型的数据转换为 JDBC 类型的数据,并传递 PreparedStatementsetxxx();
另一种是将结果集查询结果集的jdbctype数据转换为j**a数据类型。
2)SQL语句的执行和列表的集成
生成动态 SQL 语句后,MyBatis 会执行该 SQL 语句,并将可能返回的结果集转换为列表
在结果集的处理中,mybatis 支持结果集关系的一对多和多对一转换,支持的方式有两种,一种是嵌套查询语句的查询,另一种是嵌套结果集的查询。
基础支撑层
负责最基本的功能支持,包括连接管理、事务管理、配置加载、缓存处理等都是常见的东西,并提取出来作为最基本的组件。 它为上层数据处理层提供了最基本的支持。
MyBatis 层次结构
遗嘱执行人的类别
Mybatis 有三个基本的 Executor 执行器:Executor、ReuseExecutor 和 BatchExecutor。
1、**executor
每次执行更新或选择时,都会启用一个语句对象,并且该语句对象在使用后会立即关闭。
2、reuseexecutor
运行 update 或 select,以 SQL 为键查找语句对象,如果存在就使用,不存在就创建,下次用完时将语句对象放在映射中。 简而言之,它是关于重用语句对象。
3、batchexecutor
执行update(无select,jdbc批处理不支持select),将所有SQL添加到批处理中(addbatch())并等待统一执行(executebatch())缓存多个语句对象,每个语句对象为addbatch()完成后,等待executebatch()批处理逐个执行。 与 JDBC 批处理相同。
作用域:执行程序的这些功能严格限制在 SQLStaph 生命周期中。
执行程序的配置
有两种方法可以指定执行程序:
1. 在配置文件中指定
2. 在 ** 中指定获取 sqlsession 时需要注意的是,如果选择批量执行器,则需要手动提交事务(默认情况下,不会向 ***executor 传递任何参数)。
例:
什么是延迟加载mybatis 中的延迟加载,也称为延迟加载,是指在查询表时,根据设置的延迟规则,推迟对关联对象的 select 查询。获取指定执行程序的 sqlsessionsqlsession sqlsession = sqlsessionfactoryopensession(executortype.batch);当你得到一个批处理执行器时,你需要手动提交事务sqlsessioncommit();
例如,在进行一对多查询时,只查询一方,当程序需要多方数据时,MyBatis 会发出 SQL 语句进行查询,这样子延迟加载可以减轻数据库的压力。
mybatis 的延迟加载只对关联对象的查询有延迟设置,直接对主加载对象执行查询语句。
假设 clazz 班主任中有一个孩子。 两者之间的关系:
是否找到相关对象的示例:public class clazz
延迟加载设置在 mybatis 中,延迟加载可以分为两种类型:属性的延迟加载和集合的延迟加载,关联关联和集合对象的集合,关联是指一对一,集合是指一对多查询。@test public void testclazz()
在 mybatis 配置文件中,可以配置是否开启延时加lazyloadingenabled=true|false
1) 延迟加载的全局设置
默认情况下,延迟加载处于关闭状态。 如果你需要打开它,你需要在 mybatis-config 中打开它XML格式:
例如,班级和学生之间存在一对多关系。 加载时,我们可以先加载班级数据,在需要使用学生数据时再加载学生相关数据。
侵入式延迟加载:**表示只要加载主表的任意属性,就会触发延迟加载,例如,会加载班级名称,触发学生信息。
深度延迟加载:仅当加载关联的从表信息时才会触发延迟加载。 一般来说,深度延迟加载是首选。
2) 延迟加载的本地设置
如果您已经设置了全局加载,但不希望对 SQL 语句查询应用延迟策略,则可以配置本地加载策略。
例:
蚀刻类型值有 2 种类型,eager:立即加载;
lazy:延迟加载。
因为本地负载策略优先于全局负载策略。 指定属性时,在映射中将忽略全局配置参数 lazyloadingenabled,并使用该属性的值。
延迟加载的原理
Mybatis 使用 ja dynamic 为查询对象生成一个对象。 当访问对象的属性时,mybatis 会检查该属性是否需要延迟加载。
如果需要延迟加载,MyBatis 会再次执行 SQL 查询,并将查询结果填充到 ** 对象中。
首先,我们需要在项目中添加 mybatis 依赖。 如果您使用的是 M**en 项目,则可以在 Pom 中使用它XML 文件:
假设我们有一个 user 表,我们可以创建一个对应的实体类 user:org.mybatis mybatis 3.5.6
在 mybatis 映射文件中,我们需要定义一个与实体类对应的接口。 例如,我们可以创建一个名为 usermapper 的接口:public class user
接下来,我们需要创建一个与映射文件对应的接口。 例如,我们可以创建一个名为 usermapper 的接口:select * from user where id = #
最后,我们可以在业务中使用 mybatis 进行数据库操作。 例如,我们可以在一个名为 UserService 的类中调用 UserMapper 接口的方法:package com.example;import com.example.user;import org.apache.ibatis.annotations.param;import org.apache.ibatis.annotations.select;public interface usermapper ") user getuserbyid(@param("id") int id);}
MyBatis 是一个非常强大的持久化层框架,可以帮助我们简化数据库操作,提高开发效率。 在实际开发中,我们也可以使用 mybatis 进行更复杂的数据库操作,比如插入、更新、删除等。 希望本文能帮助你更好地理解和使用 Mybatis。public class userservice }