资讯专栏INFORMATION COLUMN

Mybatis是如何工作的(一)

shiina / 2389人阅读

摘要:本文目标使用纯框架获取数据理清的工作过程。创建项目并运行首先创建项目,过程不再赘述。做的事情主要有三步从配置文件中生成从中获取获取对应的,执行。小结本文主要介绍了如何使用纯操作数据库,然后介绍了加载配置的过程。

本文目标:

使用纯Mybatis框架获取数据;

理清Mybatis的工作过程。

创建项目并运行

首先创建maven项目,过程不再赘述。依赖如下:


    
      org.mybatis
      mybatis
      3.4.6
    
    
      mysql
      mysql-connector-java
      5.1.46
    
  

下面准备一张表:

CREATE TABLE `clips` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT "主键",
  `content` varchar(256) NOT NULL DEFAULT "" COMMENT "内容",
  `deleted` tinyint(1) NOT NULL DEFAULT "0" COMMENT "删除标识:0正常,1删除",
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间",
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新时间",
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT="clips";

添加一条数据:

对应的实体类:

public class ClipsEntity {
    private Integer id;
    private String content;
    private Integer deleted;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
    
    // 省略getter和setter
}

DAO:

public interface ClipsDAO {
    ClipsEntity selectById(@Param("id") Integer id);
}

mapper文件:





  

Mybatis配置文件:




  
    
    
    
    
    
    
    
    
  
  
    
  
  
    
      
      
        
        
        
        
      
    
  
  
    
  

下面写个测试:

public class Main {

    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        try {
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession session = factory.openSession();
            ClipsDAO clipsDAO = session.getMapper(ClipsDAO.class);
            ClipsEntity clipsEntity = clipsDAO.selectById(1);
            System.out.println(clipsEntity);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

运行结果:

运行成功。
那么,在这个过程中,程序具体做了什么事呢?一步一步来看。
首先,我们用配置文件生成了一个InputStream;然后用InputStream生成了生成SqlSessionFactory;然后获取Session;获取对应的mapper,执行SQL获取结果。Mybatis做的事情主要有三步:

从配置文件中生成SqlSessionFactory;

从SqlSessionFactory中获取session;

获取对应的mapper,执行SQL。

下面逐步看源码。

加载mybatis配置,生成SqlSessionFactory
  // 首先调用的是这个方法:
  public SqlSessionFactory build(InputStream inputStream) {
    return build(inputStream, null, null);
  }
  // 然后是这个:
    public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
    // 根据参数获取一个XMLConfigBuilder,这部分是重点
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        inputStream.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }
  
  // 返回的build方法如下,可以看出实现是DefaultSqlSessionFactory
  public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
  }

注释部分已经很清楚了,下面重点看下XMLConfigBuilder,Mybatis通过这个类来解析mybatis对应的配置。

  // 解析configuration节点下面的子节点,并返回最终的配置。
  public Configuration parse() {
    if (parsed) {
      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    parsed = true;
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
  }

  private void parseConfiguration(XNode root) {
    try {
      //issue #117 read properties first
      // 加载properties节点下的属性,
      propertiesElement(root.evalNode("properties"));
      // 加载settings节点下的属性
      Properties settings = settingsAsProperties(root.evalNode("settings"));
      loadCustomVfs(settings);
      // 加载别名配置
      typeAliasesElement(root.evalNode("typeAliases"));
      // 加载插件配置
      pluginElement(root.evalNode("plugins"));
      // 加载objectFactory配置
      objectFactoryElement(root.evalNode("objectFactory"));
      // 加载objectWrapperFactory配置
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      // 加载reflectorFactory配置
      reflectorFactoryElement(root.evalNode("reflectorFactory"));
      settingsElement(settings);
      // read it after objectFactory and objectWrapperFactory issue #631
      // 加载environment配置,这里会配置事务管理器
      environmentsElement(root.evalNode("environments"));
      // 加载databaseIdProvider配置
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
      // 加载typeHandler是配置,自定义的typeHandler会在这注册
      typeHandlerElement(root.evalNode("typeHandlers"));
      // 加载mapper配置
      mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
  }
  

至此,mybatis配置加载完成。

小结

本文主要介绍了如何使用纯Mybatis操作数据库,然后介绍了Mybatis加载配置的过程。内容相对粗浅,深入分析在下文。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72905.html

相关文章

  • 面试官都会问Mybatis面试题,你会这样回答吗?

    摘要:最终能和面试官聊的开心愉快投缘的叫面霸。能够与很好的集成提供映射标签,支持对象与数据库的字段关系映射提供对象关系映射标签,支持对象关系组件维护。使用可以有效的防止注入,提高系统安全性。 showImg(https://segmentfault.com/img/bVbsSlt?w=358&h=269); 一、概述 面试,难还是不难?取决于面试者的底蕴(气场+技能)、心态和认知及沟通技巧。...

    seanHai 评论0 收藏0
  • Mybatis常见面试题

    摘要:执行没有,批处理不支持,将所有都添加到批处理中,等待统一执行,它缓存了多个对象,每个对象都是完毕后,等待逐一执行批处理。 Mybatis常见面试题 #{}和${}的区别是什么? #{}和${}的区别是什么? 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递进来的参数原样拼接在SQL中 #{}是预编译处理,${}是字符串替换。 使用#{}可以有效的防止...

    liuchengxu 评论0 收藏0
  • 手撕面试官系列(二):开源框架面试题Spring+SpringMVC+MyBatis

    摘要:跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来期间也没有准备充分,到底是因为技术原因影响自己的发展,偏移自己规划的轨迹,还是钱给少了,不受重视。 跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技...

    Flink_China 评论0 收藏0
  • 教你手写Mybatis框架

    摘要:前言嗨,小伙伴们,这篇博文将带大家手写,让大家对的核心原理以及工作流程有更加深刻的理解。模块顾名思义,就是框架配置类,用于解析配置文件加载相关环境。配置模块这里的对框架的配置使用了简单的,主要原因还是简单易懂然后节省时间。 前言 (。・∀・)ノ゙嗨,小伙伴们,这篇博文将带大家手写mybatis,让大家对mybaits的核心原理以及工作流程有更加深刻的理解。在上篇Spring-Mybat...

    antyiwei 评论0 收藏0
  • Java深入-框架技巧

    摘要:从使用到原理学习线程池关于线程池的使用,及原理分析分析角度新颖面向切面编程的基本用法基于注解的实现在软件开发中,分散于应用中多出的功能被称为横切关注点如事务安全缓存等。 Java 程序媛手把手教你设计模式中的撩妹神技 -- 上篇 遇一人白首,择一城终老,是多么美好的人生境界,她和他历经风雨慢慢变老,回首走过的点点滴滴,依然清楚的记得当初爱情萌芽的模样…… Java 进阶面试问题列表 -...

    chengtao1633 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<