Day65 Mybatis的執行原理以及常見面試題

神一樣的我發表於2018-05-10

責任鏈&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
常見面試題
執行原理

相關文章