责任链&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
常见面试题
运行原理