返回顶部
首页 > 资讯 > 精选 >Mybatis框架的作用有哪些
  • 904
分享到

Mybatis框架的作用有哪些

mybatis 2023-05-31 08:05:43 904人浏览 独家记忆
摘要

今天就跟大家聊聊有关mybatis框架的作用有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。mybatis基本架构mybatis的源码应该算是比较容易阅读的,首先mybatis核

今天就跟大家聊聊有关mybatis框架的作用有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

mybatis基本架构

mybatis的源码应该算是比较容易阅读的,首先mybatis核心功能就是执行sql语句,但在其基础上又有许多增强的地方(动态Sql,ORM等)。看一个框架的时候,第一步是对整个框架有一个大体的了解。例如mybatis,我们可以从初始化到完成一个sql请求为主线,看一下涉及了哪些类。我个人总结了一下,mybatis的框架主要的核心类有4个

Mybatis框架的作用有哪些

Configuration

Configuration就是用于解析、保存、处理Mybatis的配置内容,包括了

  • mybatis基本配置,例如支持数据库中的字段支持下标转驼峰mapUnderscoreToCamelCase=true等等,参看Mybatis配置说明

  • SqlMapper管理,也就是通过xml或者注解写的一些sql映射。相关的类可以查看源码中MappedStatement类。

  • 创建类,Configuration还有一些创建类的功能,例如Executor、StatementHandler。这个2个类后面还会说到

小节Configuration

总结Configuration的功能,当然,如何读取和解析相关文件是Configuration中大部分代码做的事。这些都是为了准备后面mybatis运行的基本条件。Configuration中创建类是因为创建的这些类都依赖于Configuration(但这样做数据和逻辑没有做到分离)。

SqlSession

SqlSession可能是mybatis中我们最常用的类,其实他是一个门面类,直接对外提供服务

public interface SqlSession extends Closeable { <T> T selectOne(String statement); <E> List<E> selectList(String statement, Object parameter); int delete(String statement); void rollback(); void commit(); ...}

这些方法都是直接提供给外部调用的。看到这些方法是不是很亲切。(我个人在看源码的时候看到一些自己用过的一些类或方法的时候都有种莫名的亲近感。感觉终于和我的认知世界有交集了)

SqlSession的创建

SqlSessionFactor是用于创建SqlSession建造者,提供给外部快速创建一个SqlSession。是一个工厂类,而SqlSessionFactor的创建则是由SqlSessionFactorBuilder。

Mybatis框架的作用有哪些

Executor

前面说了SqlSession只是一个门面类,Executor才是负责Sql语句执行的。因此Executor才是整个mybatis核心。Executor的实现类有

Mybatis框架的作用有哪些

  • BaseExecutor:看名字知道是最基础Executor,其他的Executor都和这个类有一定的关系

  • CachingExecutor:每次查询的时候会先从缓存中获取,每次有增删改的时候会让缓存失效。CachingExecutor其实是一个代理内,内部代理了BaseExecutor(或其子类)。在BaseExecutor基础上增加了缓存操作。

相关类

我们看一个Executor参数最多的一个方法

<E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey cacheKey, BoundSql boundSql) throws SQLException;

这些类都对执行Sql有一定关系

MappedStatement

具体点来理解就是我们定义的Sql映射语句,例如我们xml定义的:

<select id="selectCountByPath" parameterType="java.lang.String" resultType="java.lang.Long"> select count(1) FROM config WHERE path = #{path}</select>

paramter

这个就是传递给sql映射的参数,用于生成和填充动态sql语句

RowBound

限定一次查询数据量,类很简单,看代码就明白,不多说

public class RowBounds { public static final int NO_ROW_OFFSET = 0; public static final int NO_ROW_LIMIT = Integer.MAX_VALUE; public static final RowBounds DEFAULT = new RowBounds(); private int offset; private int limit; public RowBounds() { this.offset = NO_ROW_OFFSET; this.limit = NO_ROW_LIMIT; } public RowBounds(int offset, int limit) { this.offset = offset; this.limit = limit; }}

ResultHandler

这个和本地缓存有关,用于保存一个查询语句的缓存对象,下次有相同的查询语句的时候就会先尝试从本地缓存中获取。 注意:

,mybatis有2级缓存,第一级是CachingExecutor,第二级缓存就是mybatis的本地缓存,也就是和ResultHandler

缓存失效策略是和一级缓存一样,任何增删改都会清空本地缓存

CacheKey

一个查询语句的在本地缓存中的key,根据sql语句,参数等等组成

BoundSql

这个对象就是本次实际需要执行的sql语句有关的信息,

public class BoundSql { private String sql; private List<ParameterMapping> parameterMappings; private Object parameterObject; private Map<String, Object> additionalParameters; private MetaObject metaParameters; ...

如果说parameter参数是实际传入的参数,那么BoundSql就是根据传入参数进行相关解析后的结果。他的创建在MappedStatement中,根据parameter和当前执行MappedStatement生成

public BoundSql getBoundSql(Object parameterObject) { BoundSql boundSql = sqlSource.getBoundSql(parameterObject); List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); if (parameterMappings == null || parameterMappings.isEmpty()) {  boundSql = new BoundSql(configuration, boundSql.getSql(), parameterMap.getParameterMappings(), parameterObject); } // check for nested result maps in parameter mappings (issue #30) for (ParameterMapping pm : boundSql.getParameterMappings()) {  String rmId = pm.getResultMapid();  if (rmId != null) {  ResultMap rm = configuration.getResultMap(rmId);  if (rm != null) {   hasNestedResultMaps |= rm.hasNestedResultMaps();  }  } } return boundSql;}

Interceptor

Mybatis提供了Interceptor用于在执行Executor之前进行一些操作,mybatis是怎么使用Interceptor。其实就是在创建Executor时候,会

public Executor newExecutor(Transaction transaction, ExecutorType executorType) { executorType = executorType == null ? defaultExecutorType : executorType; executorType = executorType == null ? ExecutorType.SIMPLE : executorType; Executor executor; if (ExecutorType.BATCH == executorType) {  executor = new BatchExecutor(this, transaction); } else if (ExecutorType.REUSE == executorType) {  executor = new ReuseExecutor(this, transaction); } else {  executor = new SimpleExecutor(this, transaction); } if (cacheEnabled) {  executor = new CachingExecutor(executor); } //看这里!!! executor = (Executor) interceptorChain.pluginAll(executor); return executor; }

这里主要是通过jdk动态代理实现的

public class Plugin implements InvocationHandler { ... public static Object wrap(Object target, Interceptor interceptor) { Map<Class<?>, Set<Method>> signatureMap = getSignatureMap(interceptor); Class<?> type = target.getClass(); Class<?>[] interfaces = getAllInterfaces(type, signatureMap); if (interfaces.length > 0) {  return Proxy.newProxyInstance(   type.getClassLoader(),   interfaces,   new Plugin(target, interceptor, signatureMap)); } return target; }  ... @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try {  Set<Method> methods = signatureMap.get(method.getDeclarinGClass());  if (methods != null && methods.contains(method)) {  return interceptor.intercept(new Invocation(target, method, args));  }  return method.invoke(target, args); } catch (Exception e) {  throw ExceptionUtil.unwrapThrowable(e); } }

这样在调用Executor的时候就会先判断是否满足Interceptor的执行条件,满足则会先执行Intercepter#intercept()方法

最底层的Handler

要说直接和Jdbc打交道的就是各种Handler类,例如

  • StatementHandler: 处理java.sql.Statement

  • ParameterHandler: 向PreparedStatement中设置参数

  • ResultSetHandler:处理sql执行结果,并转换成指定的类对象 上面的这些其实都不复杂,所以代码还是比较好理解的

Transaction

每个Executor生成的时候都会把Transaction传入,在BaseExecutor中Transaction是其成员变量,那Transaction的作用是什么呢?

public interface Transaction { Connection getConnection() throws SQLException; void commit() throws SQLException; void rollback() throws SQLException; void close() throws SQLException; Integer getTimeout() throws SQLException;}

其实之前一直都没提到过Connect谁来管理,这里可以看出来,Transaction负责了Connection的获取,以及对这次Connect的提交和回滚等操作。这个类也是比较好理解的。Executor的commit或者rollback最后都是调用Transaction的

看完上述内容,你们对Mybatis框架的作用有哪些有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: Mybatis框架的作用有哪些

本文链接: https://lsjlt.com/news/224426.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Mybatis框架的作用有哪些
    今天就跟大家聊聊有关Mybatis框架的作用有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。mybatis基本架构mybatis的源码应该算是比较容易阅读的,首先mybatis核...
    99+
    2023-05-31
    mybatis
  • mybatis框架的优点有哪些
    MyBatis框架的优点主要包括以下几点:1. 灵活性高:MyBatis通过XML或注解的方式,可以灵活地编写SQL语句,使开发人员...
    99+
    2023-09-20
    mybatis
  • ajax框架的作用有哪些
    Ajax框架的作用主要体现在以下几个方面:1. 异步加载:Ajax框架可以通过异步加载数据,从而减少页面刷新的次数,提高页面加载速度...
    99+
    2023-09-21
    ajax
  • thinkphp框架的作用有哪些
    ThinkPHP框架的作用主要有以下几个方面:1. 提高开发效率:ThinkPHP框架提供了一系列的功能和工具,可以帮助开发者快速构...
    99+
    2023-10-18
    thinkphp
  • Brainstorm框架的作用有哪些
    Brainstorm框架的作用主要包括以下几个方面: 帮助整理思绪:Brainstorm框架可以帮助人们将头脑中的各种想法和概念...
    99+
    2024-03-07
    Brainstorm
  • springboot框架有哪些作用
    这篇“springboot框架有哪些作用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springboot框架有哪些作用”文...
    99+
    2023-06-08
  • mybatis框架有哪些优缺点
    MyBatis是一个开源的Java持久层框架,它有以下优点和缺点: 优点: 灵活性高:MyBatis相对于其他ORM框架更加灵活...
    99+
    2023-10-23
    mybatis
  • java常用工作流框架有哪些
    Java常用的工作流框架有以下几种:1. Activiti:Activiti是一个开源的BPM工作流引擎,它提供了一套完整的业务流程...
    99+
    2023-09-25
    java
  • mybatis框架的作用是什么
    MyBatis框架是一个用于Java语言的持久层框架,它的主要作用是简化数据库访问代码的开发。具体来说,MyBatis可以帮助开发者...
    99+
    2023-08-12
    mybatis
  • python中Scrapy爬虫框架的作用有哪些
    本文章向大家介绍python中Scrapy爬虫框架的作用有哪些,主要包括python中Scrapy爬虫框架的作用有哪些的使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。python可以做什么Py...
    99+
    2023-06-06
  • 实用的JavaScript框架有哪些
    本篇内容主要讲解“实用的JavaScript框架有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“实用的JavaScript框架有哪些”吧!IconicIco...
    99+
    2024-04-02
  • 有哪些好用的Node.js框架
    这篇文章主要介绍“有哪些好用的Node.js框架”,在日常操作中,相信很多人在有哪些好用的Node.js框架问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些好用的Node...
    99+
    2024-04-02
  • php的框架有哪些
    php的框架有:1、国内框架:ThinkPHP、Canphp、KYPHP、InitPHP、SpeedPHP、CdvPHP 等等。2、国外框架:Zend Framework、Codelgniter、CakePHP、Symfony 、Yii、S...
    99+
    2024-04-02
  • Flex应用框架有哪些
    这篇文章给大家分享的是有关Flex应用框架有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  Flex应用框架开发软件框架的目的在于实现常见的软件开发模式以提高编程生产率及改善质量。2008年推出的一些Fle...
    99+
    2023-06-17
  • android常用框架有哪些
    Android开发中常用的框架有:1. Android Jetpack:Android官方推出的一套组件库,包括了一系列的库,如Li...
    99+
    2023-10-08
    Android
  • c++常用框架有哪些
    c++框架包括:跨平台gui组件qt、工具库集合boost、通用数据结构stl、计算机视觉opencv、线性代数eigen、单元测试google test和优化库ceres solver...
    99+
    2024-04-22
    c++ 代码可读性
  • nodejs有哪些框架
    本篇内容主要讲解“nodejs有哪些框架”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“nodejs有哪些框架”吧! nodejs框架...
    99+
    2024-04-02
  • 有哪些vue框架
    本篇内容主要讲解“有哪些vue框架”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些vue框架”吧! vue框架:1、elemen...
    99+
    2024-04-02
  • 有哪些PHP框架?
    PHP 是一个被广泛使用的来进行Web开发的脚本语言。虽然有很多其它可供选择的Web开发语言,像:ASP 和Ruby,但是PHP是目前为止世界上最为流行的。那么,是什么让PHP如此流行?PHP 如此之流行是因为比起别的语言来,它更容易学习,...
    99+
    2024-04-02
  • ajax有哪些框架
    本篇内容介绍了“ajax有哪些框架”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作