Day65 Mybatis的运行原理以及常见面试题

责任链&ThreadLocal封装

责任链:
    处理一个请求业务,所有经过的类组成了一个链条处理机制。
    这个链条我们称之为责任链。
问题:
    在开发过程中很多问题的处理机制都是基于责任链和多线程的。
    同一个线程内需要获取到同一个对象,不同的线程获取到不同的对象。
    例如:
        在同一个线程(一个请求内)的任意位置能够获取到同一个SqlSession对象
        不同的线程(不同的请求)获取的是不同的SqlSession对象
解决:
    使用ThreadLocal对象
    作用:
        ThreadLocal对象存储的数据只能在当前线程内操作
    作用域范围:
        一个线程内。
应用:
    public class MyBatisUtil {
    private static SqlSessionFactory factory;
    //private static SqlSession ss;
    //创建TheadLocal对象用于存储SqlSession对象
    private static ThreadLocal<SqlSession> tl =new ThreadLocal<SqlSession>();
    static{
        InputStream is;
        try {
            is = Resources.getResourceAsStream("mybatis.xml");
            factory=new SqlSessionFactoryBuilder().build(is);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //创建方法获取SqlSession对象
    public static SqlSession getSqlSession(){
        SqlSession ss=tl.get();
        if(ss==null){
            tl.set(factory.openSession());
        }
        return tl.get();    
    }
    //关闭Sqlsession对象
    public static void closeSqlSession(){

        SqlSession ss=tl.get();
        if(ss!=null){
            ss.close();
        }
        tl.set(null);
    }
}

OpenSessionView

com.bjsxt.filter:
OperSessionView.java:

package com.bjsxt.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

import org.apache.ibatis.session.SqlSession;

import com.bjsxt.util.MybatisUtil;
@WebFilter("/*")
public class OperSessionView implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
        //创建SqlSession对象
        SqlSession ss=MybatisUtil.getSqlSession();
        try {
            chain.doFilter(req, resp);
            ss.commit();
        } catch (Exception e) {
           ss.rollback();
        }
        MybatisUtil.closeSqlSession();
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

mybatis的运行原理

SqlSession对象的创建涉及的对象
    SqlSessionFactoryBuilder:解析Mybatis.xml文件并创建DefaultSqlSessionFactory
        XMLConfigBuilder:解析Mybatis.xml文件,返回Configuration
        Configuration:存储了mybatis.xml的所有数据
        DefaultSqlSessionFactory:生产SqlSession(DefaultSqlSession)
            Transaction:事务管理对象
            Environment:数据库环境对象,存储了数据库连接相关的所有数据
            Executor:执行器
            DefaultSqlSession:SqlSession对象,用来操作数据的对象。

文字解释:
在MyBatis运行开始时需要先通过Resources加载全局配置文件.下面需要实例化SqlSessionFactoryBuilder构建器.帮助SqlSessionFactory接口实现类DefaultSqlSessionFactory.
在实例化DefaultSqlSessionFactory之前需要先创建XmlConfigBuilder解析全局配置文件流,并把解析结果存放在Configuration中.之后把Configuratin传递给DefaultSqlSessionFactory.到此SqlSessionFactory工厂创建成功.
由SqlSessionFactory工厂创建SqlSession.
每次创建SqlSession时,都需要由TransactionFactory创建Transaction对象,同时还需要创建SqlSession的执行器Excutor,最后实例化DefaultSqlSession,传递给SqlSession接口.
根据项目需求使用SqlSession接口中的API完成具体的事务操作.
如果事务执行失败,需要进行rollback回滚事务.
如果事务执行成功提交给数据库.关闭SqlSession
到此就是MyBatis的运行原理.(面试官说的.)

Mybatis常见面试题:

这里写图片描述
这里写图片描述
这里写图片描述

Mybatis运行原理:

责任链和ThreadLocal
ThreadLocal: 资料:
https://www.zhihu.com/question/23089780
http://mp.weixin.qq.com/s?__biz=MzA3MDExNzcyNA==&mid=2650392118&idx=1&sn=a2144a19bdeba48001f4f76f423e25d9&scene=0#wechat_redirect
https://blog.csdn.net/qjyong/article/details/2158097
Mybatis原理分析:
https://www.zhihu.com/question/25007334
常见面试题:
https://www.cnblogs.com/huajiezh/p/6415388.html
https://blog.csdn.net/xinghuo0007/article/details/53463897
http://baijiahao.baidu.com/s?id=1586305256627906669&wfr=spider&for=pc

小结

责任链&ThreadLocal封装
OpenSqlSessionView
常见面试题
运行原理

猜你喜欢

转载自blog.csdn.net/qq_21953671/article/details/79755444