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
常見面試題
執行原理
相關文章
- mybatis常見面試題MyBatis面試題
- mybatis常見面試/筆試題MyBatis面試筆試
- 多執行緒-多執行緒常見的面試題執行緒面試題
- 【面經】多執行緒常見面試題執行緒面試題
- 蓮花池--MyBatis系列之面試常見問題MyBatis面試
- 談談這幾個常見的多執行緒面試題執行緒面試題
- MyBatis常見問題MyBatis
- 執行緒池以及四種常見執行緒池執行緒
- 夯實Java基礎系列17:一文搞懂Java多執行緒使用方式、實現原理以及常見面試題Java執行緒面試題
- 面試寶典:15道MyBatis 常見面試題彙總及答案MyBatis面試題
- Java常見的面試題Java面試題
- Vue常見的面試題Vue面試題
- 常見的JVM 面試題JVM面試題
- 集合常見的面試題面試題
- Hadoop之hive安裝過程以及執行常見問題HadoopHive
- MyBatis的解析和執行原理MyBatis
- [Spring]MyBatis的執行原理SpringMyBatis
- ajax常見面試題面試題
- 前端常見面試題前端面試題
- 常見 React 面試題React面試題
- Redis常見面試題Redis面試題
- Golang常見面試題Golang面試題
- Mysql 常見面試題MySql面試題
- Redis 常見面試題Redis面試題
- Dubbo常見面試題面試題
- JDBC常見面試題JDBC面試題
- SQL常見面試題SQL面試題
- 常見Java面試題Java面試題
- Docker常見面試題Docker面試題
- vue 常見面試題Vue面試題
- 【Java面試】 Javascript常見面試題!JavaScript面試題
- 【Java面試】Servlet常見面試題!JavaServlet面試題
- 【面試】面試常見問題整理面試
- Java面試中,一些常見的有關多執行緒問題!Java面試執行緒
- 常見的前端面試題前端面試題
- 常見的Java面試問題Java面試
- 那些常見的面試題整理面試題
- 前端常見的部分面試題前端面試題