mybatis的生命周期

目录

项目配置

pom.xml

mybatis-config.xml

加载配置信息

创建 SqlSessionFactory

创建 SqlSession 对象

获取 Mapper 实例


工作了这些年,每次看到书籍、文档以及他人嘴上说到软件工程的生命周期,我是不赞成的,之前在高中读书的时候,生物课上讲到生命是与蛋白质相关的,然而软件跟蛋白质没有关系,就是一些数据在计算机中创建和销毁,用运行周期来形容更好一些,但是用生命来形容就有点不可理解了。

以一个简单的maven项目来描述这个事情

https://mybatis.org/mybatis-3/zh_CN/getting-started.html

按照官网的讲解,使用mybatis需要做如下几步

项目配置

pom.xml



    4.0.0

    org.example
    mybatis-maven
    1.0.0

    
        8
        8
        UTF-8
    

    
        
            com.mysql
            mysql-connector-j
            8.0.33
        

        
            org.mybatis
            mybatis
            3.3.0
        

        
            log4j
            log4j
            1.2.17
        

    

    
        
            
            
                src/main/java
                
                    **/*.xml
                    **/application*.yml
                    **/application*.yaml
                    **/application*.properties
                
            
        
    

mybatis-config.xml





    
    

    
        
    

    
    
        
    

    
    
        
            
            
            
            
                
                
                
                
            
        
    

    
    
        
    

进行一些基础配置,例如数据库、环境、mapper 。

节点 environments 的 default 的值必须是子节点 environment 的其中任何一个,不然会报错。

配置信息有先后顺序,不然会报错。

加载配置信息

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

通过 mybatis 自带的文件加载方式转换为 InputStream。

创建 SqlSessionFactory

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactory 是一个接口,最终使用 SqlSessionFactoryBuilder 通过工厂模式来创建 SqlSessionFactory 的实现类 DefaultSqlSessionFactory。

在整个应用中只需要创建一个,可以使用单例模式来实现。

mybatis的生命周期_第1张图片 SqlSessionFactory创建流程

在第二步中完成了一个很重要的事情,将配置文件解析为 mybatis 可用的配置,最终解析的对象为 Configuration,这个很重要,贯穿了 mybatis 的始终。一些运行过程中需要的信息在这里可以获取到

mybatis的生命周期_第2张图片 SqlSessionFactory的实现类

创建 SqlSession 对象

mybatis的生命周期_第3张图片 DefaultSqlSessionFactory中创建SqlSession对象

鉴于 SqlSession 是一个接口,继承了 Closeable,在使用结束后需要将其关闭。

SqlSession  是线程级别的,非线程安全。

mybatis的生命周期_第4张图片 SqlSession的实现类

封装的工具类如下

package cn.hahaou.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MybatisUtils {

    public static SqlSessionFactory sqlSessionFactory = null;
    public static String resource = "mybatis-config.xml";

    static {
        try (InputStream inputStream = Resources.getResourceAsStream(resource);){
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
        }
    }

    public static SqlSession openSession() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
}

SqlSessionFactory 单例模式,全局共享,SqlSession 使用的话需要每次创建。

获取 Mapper 实例

LevelOneRoleMapper roleMapper = sqlSession.getMapper(LevelOneRoleMapper.class);

通过 SqlSession 获取创建的 Mapepr 实例,返回的是一个类型为 MapperProxy 的动态代理类。

mybatis的生命周期_第5张图片

mybatis的生命周期_第6张图片

mybatis的生命周期_第7张图片

在 MapperProxyFactory 中通过工厂模式创建 MapperProxy 对象,里面包含了 DefaultSqlSession、Mapper 接口类、Method 和 MapperMethod 的 map 映射关系。

mybatis的生命周期_第8张图片

mybatis的生命周期_第9张图片

最终在调用对应的方法时通过反射来执行具体的操作。

整理的时序图如下

mybatis的生命周期_第10张图片 mybatis运行周期

至此,整个步骤就完成了,接下来就是具体的业务操作了。

你可能感兴趣的:(mybatis,mybatis)