首页 > 其他分享 >第四章 Mybatis 核心组件介绍

第四章 Mybatis 核心组件介绍

时间:2024-09-10 21:22:46浏览次数:14  
标签:语句 Java MyBatis MappedStatement 组件 类型 SQL Mybatis 第四章

一、Configuration Executor MappedStatement

MyBatis 3 的核心组件中,ConfigurationExecutor 和 MappedStatement 是非常关键且相互关联的部分,它们共同构成了 MyBatis 框架的基础架构,用于管理 SQL 映射和执行数据库操作。

Configuration

Configuration 类是 MyBatis 所有配置信息的封装。它包含了 MyBatis 运行时所需的所有配置,如数据库连接信息(DataSource)、事务管理器(TransactionManager)、类型处理器(TypeHandlers)、映射器(Mapper)的注册信息等。

  • 数据源(DataSource):用于获取数据库连接。
  • 事务管理器(TransactionManager):管理数据库事务。
  • 映射器(Mappers):注册了所有的 Mapper 接口和对应的 XML 映射文件。
  • 类型别名(Type Aliases):用于简化类型名称的引用。
  • 插件(Plugins):允许用户自定义拦截器,以修改 MyBatis 的行为。

Executor

Executor 是 MyBatis 用来执行 SQL 语句的接口。它是 MyBatis 框架中所有数据库操作的核心。Executor 接口定义了多个方法来执行不同类型的 SQL 语句,如更新(update)、查询(query)、获取映射器(getMapper)等。

MyBatis 提供了几种不同类型的 Executor 实现,以适应不同的应用场景,如:

  • SimpleExecutor:简单执行器,它每次执行更新或查询时,都会开启一个新的 SqlSession。
  • ReuseExecutor:重用执行器,它会对 SqlSession 内的所有操作使用同一个 Statement。
  • BatchExecutor:批处理执行器,它用于将多个更新操作组合成一个批次执行,以减少与数据库的交互次数。

MappedStatement

MappedStatement 是 MyBatis 中最重要的一个类,它封装了 SQL 语句的所有信息,包括 SQL 语句本身、输入参数的类型、返回结果的类型、是否使用缓存等。在 MyBatis 中,每一个 <select><insert><update><delete> 标签都会被解析成一个 MappedStatement 对象,并存储在 Configuration 对象中。

当执行 SQL 语句时,MyBatis 会根据 Mapper 接口的方法名和参数类型等信息,在 Configuration 中查找对应的 MappedStatement 对象,然后利用 Executor 来执行这个 MappedStatement 封装的 SQL 语句。

总结

ConfigurationExecutor 和 MappedStatement 是 MyBatis 框架中的核心组件,它们共同协作以完成 SQL 语句的映射和执行。Configuration 提供了框架的全局配置信息,Executor 负责执行 SQL 语句,而 MappedStatement 则封装了具体的 SQL 语句信息和执行参数。这三个组件的紧密配合,使得 MyBatis 能够以灵活且高效的方式处理数据库操作。

二、StatementHandler TypeHandler ParameterHandler ResultSetHandler

在 MyBatis 3 中,StatementHandlerTypeHandlerParameterHandler 和 ResultSetHandler 是四个关键的处理器(Handler)接口,它们在执行 SQL 语句和处理结果集的过程中扮演着重要的角色。这些处理器共同协作,确保 MyBatis 能够高效地将 Java 对象与数据库进行交互。

StatementHandler

StatementHandler 是 MyBatis 中用于处理 SQL 语句的执行的接口。它封装了 JDBC 的 Statement 或 PreparedStatement,并提供了执行 SQL 语句的方法。StatementHandler 负责配置 SQL 语句的参数、执行 SQL 语句,并处理执行过程中可能出现的异常。

TypeHandler

TypeHandler 是 MyBatis 中用于处理 Java 类型和 JDBC 类型之间转换的接口。它定义了如何将 Java 类型转换为 JDBC 类型(用于设置 SQL 语句的参数),以及如何将 JDBC 类型转换为 Java 类型(用于从结果集中获取数据)。MyBatis 提供了许多内置的 TypeHandler 实现,用于处理常见的 Java 类型和 JDBC 类型的转换,同时也支持用户自定义 TypeHandler 以满足特殊需求。

ParameterHandler

ParameterHandler 是 MyBatis 中用于处理 SQL 语句参数的接口。它负责将用户传递的参数值设置到 SQL 语句的占位符中。ParameterHandler 通过与 TypeHandler 的协作,将 Java 类型的参数转换为 JDBC 类型的参数,并设置到 PreparedStatement 的相应位置。

ResultSetHandler

ResultSetHandler 是 MyBatis 中用于处理 SQL 查询结果集的接口。它负责将 JDBC 的 ResultSet 转换为 Java 对象或集合。ResultSetHandler 通过与 TypeHandler 的协作,从 ResultSet 中读取数据,并将其转换为 Java 类型的值。然后,它根据 Mapper 接口方法的返回类型,将这些值组装成相应的 Java 对象或集合。

总结

这四个处理器在 MyBatis 的执行流程中各司其职,共同完成了 SQL 语句的执行和结果集的处理。StatementHandler 负责 SQL 语句的执行,ParameterHandler 负责处理 SQL 语句的参数,ResultSetHandler 负责处理 SQL 查询的结果集,而 TypeHandler 则在它们之间起到了桥梁的作用,负责 Java 类型和 JDBC 类型之间的转换。这四个组件的紧密配合,使得 MyBatis 能够以高效且灵活的方式处理数据库操作。

--end--

标签:语句,Java,MyBatis,MappedStatement,组件,类型,SQL,Mybatis,第四章
From: https://blog.csdn.net/FlyingJiang/article/details/142069368

相关文章

  • Chapter 12 Vue CLI脚手架组件化开发
    欢迎大家订阅【Vue2+Vue3】入门到实践专栏,开启你的Vue学习之旅!文章目录前言一、项目目录结构二、组件化开发1.组件化2.Vue组件的基本结构3.依赖包less&less-loader前言组件化开发是Vue.js的核心理念之一,VueCLI为开发者提供了便捷的工具和结构来实现组......
  • 17个Mybatis Plugs注解:Mybatis Plugs插件架构设计与注解案例(必须收藏)
    MyBatisPlugins框架提供了一种强大而灵活的机制,允许开发者通过实现Interceptor接口来扩展MyBatis的核心功能。这种插件化的方法无需修改MyBatis源码,即可引入诸如性能监控、日志记录、数据加密、查询缓存等额外功能。通过注解如@Intercepts、@Signature等,开发者可以精确地......
  • 23个Mybatis注解:Mybatis架构分析与注解案例(必须收藏)
    MyBatis是一款优秀的持久层框架,它通过提供数据访问对象(DAO)和数据访问层(DAL)的抽象,简化了数据库交互的复杂性。利用注解如@Select、@Insert、@Update、@Delete,MyBatis支持定制化SQL、存储过程以及高级映射,使得开发者能够灵活地处理数据库操作。其核心特性包括动态SQL构......
  • 第四章 视图(views)
    4.视图4.1文件or文件夹4.2相对和绝对导入urls注意实现:不要再项目根目录做相对导入。原则:绝对导入相对导入(层级深)4.3视图参数urlpatterns=[path('login/',account.login,name="login"),path('auth/',order.auth,name='auth'),]fromdjango.sho......
  • [Vue] 高阶组件和套一层父组件的区别
    前言App.vue的套一层布局组件MainLayout,MainLayout做一些统一的布局之外,再做一些子路由相同的逻辑,比如子路由需要权限访问。但是不灵活,如果一堆路由组件中有一个不需要这个功能,就不能通过父组件嵌套统一逻辑。高阶组件比起套一层父组件复用逻辑更灵活一些。高阶组件高阶组......
  • 鸿蒙界面开发——组件(7):组件导航 & 页面路由
    组件导航(Navigation)(推荐)Navigation()Navigation(pathInfos:NavPathStack)Navigation是路由容器组件,一般作为首页的根容器,包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。Navigation组件适用于模块内和跨模块的路由切换,一次开发,多端部署场景。通过组件......
  • Taro 小程序父组件基于Class如何拿到子组件基于Hooks的实例对象
    如果父组件不是基于Hooks写法(类组件),而子组件是基于Hooks写法(函数组件),你依然可以通过ref访问子组件中的方法或状态。为此,你需要使用forwardRef和useImperativeHandle在子组件中自定义要暴露的内容。具体步骤在子组件中使用forwardRef将ref传递给它。在子组件中使......
  • .NET 8 微软免费开源的 Blazor UI 组件库
    前言.NET8的发布,微软推出了官方免费且开源的BlazorUI组件库——FluentUIBlazor。组件库提供了Web应用程序所需的工具,确保应用程序能够与Microsoft产品保持一致的外观和感觉。FluentUIBlazor不仅包含了对微软官方FluentUIWebComponents的封装,还提供了额外的组......
  • LLog:Spring轻量级请求日志监控组件,集成管理面板,支持多条件查询检索
    开源地址https://gitee.com/lboot/LLog简介LLog是基于AOP构建的请求日志记录和查询工具库,通过引入该工具库,完成配置,实现对接口请求日志的记录、查询检索等功能。请求状态、时间、来源、耗时,请求参数,响应结果,作用接口记录支持与鉴权服务结合,记录请求来源为用户ID通过注解......
  • Mybatis踩坑记录:探究Mybatis源码为何当传入参数Integer类型为0时,if条件生效
    目录前言 ​编辑问题背景 深入源码 解决问题方案一方案二方案三 结果结语前言在MyBatis中,<if>标签用于动态生成SQL查询条件。然而,在一些特定的场景下,<if>标签的条件判断可能会出现意料之外的结果。例如,当传入的Integer参数为0时,条件判断可能不会如......