MyBatis原理剖析

01.openSession到底做了什么

1.1 SqlSessionFactory 接口的方法,得找接口的实现类

1.2DefaultSqlSessionFactory implements SqlSessionFactory

 进而找到了DefaultSqlSessionFactory 的openSession(),openSession方法的原型如下:

public SqlSession openSession() {
    return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
}

 

1.3openSessionFromDataSource方法原型如下:

private SqlSession openSessionFromDataSource(ExecutorTypeexecType, TransactionIsolationLevel level, booleanautoCommit){
    Transaction tx = null;
DefaultSqlSession var8;
    try {
        Environment e = this.configuration.getEnvironment();
        TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(e);
        tx = transactionFactory.newTransaction(e.getDataSource(), level, autoCommit);
        Executor executor = this.configuration.newExecutor(tx, execType, autoCommit);
        var8 = new DefaultSqlSession(this.configuration, executor);
    } catch (Exception var12) {
        this.closeTransaction(tx);
        throw ExceptionFactory.wrapException("Error opening session.  Cause: " + var12, var12);
    } finally {
        ErrorContext.instance().reset();
    }

    return var8;
}
 
 

1.4DefaultSqlSession方法原型如下

public DefaultSqlSession(Configuration configuration, Executor executor) {
    this.configuration = configuration;
    this.executor = executor;
    this.dirty = false;
}

 
 
 

02.insert和delete底层到底是什么?

Session.insert(“xxx”)

public int insert(String statement) {
    return this.insert(statement, (Object)null);//调度2个参数的insert
}

public int insert(String statement, Object parameter) {
    return this.update(statement, parameter);//底层调用update
}


03.为什么session.commit()引起事务的提交?

session.commit();

最终调度到事务的commit

this.transaction.commit();


04.session.close()为什么可以回滚事务


1.从session.insert()开始

public int insert(String statement, Objectparameter) {

       return this.update(statement, parameter);

    }

         --->update

         publicint update(String statement, Object parameter) {

      

           this.dirty = true;//注意这里将dirty设置成真,内存数据和DB数据库数据不一致

           MappedStatement e = this.configuration.getMappedStatement(statement);

      

    }

        

 session.close()

   this.executor.close(this.isCommitOrRollbackRequired(false));

         ------>isCommitOrRollbackRequired

         privateboolean isCommitOrRollbackRequired(boolean force) {

       return this.dirty || force;  //这里得到的是true

    }

        

         ------>Executor的close()

          public void close(boolean forceRollback) {

       

               this.rollback(forceRollback);//true

     }

           ------>rollback

            public void rollback(boolean required)throws SQLException {

                if(required) {

                   this.transaction.rollback();

       }

    }



MyBatis是一款优秀的持久层框架,采用了ORM(对象关系映射)的思想,将Java对象和数据库表结构进行映射,使得操作数据库更加方便和简洁。 MyBatis的源码原理主要包括以下几个方面: 1. SqlSessionFactory的创建和初始化:SqlSessionFactory是MyBatis的核心接口,它负责创建SqlSession对象,SqlSession是与数据库交互的主要接口。SqlSessionFactory的创建是通过XML或Java代码配置文件来实现的,其中包括数据源、事务管理器等。SqlSessionFactory的初始化过程是通过解析配置文件,将配置信息加载到Configuration对象中,然后创建SqlSessionFactoryBuilder对象,通过它来构建SqlSessionFactory。 2. SqlSession的创建和生命周期管理:SqlSession是与数据库交互的主要接口,它封装了对数据库的操作,包括查询、插入、更新、删除等。SqlSession的创建是通过SqlSessionFactory来实现的,它采用了工厂模式,通过SqlSessionFactory.openSession()方法获取SqlSession对象。SqlSession的生命周期管理包括开启事务、提交事务、回滚事务等操作。 3. Mapper接口的代理实现:Mapper接口是MyBatis的另一个核心接口,它定义了数据库操作的方法,例如查询、插入、更新、删除等。Mapper接口的实现是通过动态代理来实现的,MyBatis会根据Mapper接口的定义生成一个代理类,代理类会拦截Mapper接口的方法调用,并将其转化为对SqlSession的调用,最终将操作转化为对数据库的操作。 4. SQL语句的解析和执行:MyBatis支持通过XML或注解的方式定义SQL语句,通过SqlSession对象调用Mapper接口的方法时,MyBatis会根据Mapper接口的定义和XML或注解文件解析出对应的SQL语句,然后执行SQL语句,并将结果转化为对应的Java对象。 5. 缓存的实现和管理:MyBatis支持一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,用于缓存在同一个SqlSession中多次查询同一条记录的结果。二级缓存是Mapper级别的缓存,用于缓存在多个SqlSession中多次查询同一条记录的结果。MyBatis的缓存实现是通过Cache接口来实现的,缓存的管理是通过Configuration对象来实现的。 总的来说,MyBatis的源码原理涉及到了很多方面,包括配置文件的解析、动态代理、SQL语句的解析和执行、缓存等。了解这些原理有助于更好地理解和使用MyBatis
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值