1、线程容器,给线程绑定一个Object 内容,后只要线程不变,可以随时取出.
1.1 改变线程,无法取出内容.
 final ThreadLocal threadLocal = new ThreadLocal<>();
threadLocal.set("测试");
new Thread(){
public void run() {
String result = threadLocal.get();
System.out.println("结果:"+result);
};
}.start();
2、使用Threadlocal简化开发
2.1定义工具类
    将SqlSession创建出来,存放到Threadlocal中,需要时再从中取出
 package com.test.util;

 import java.io.IOException;
import java.io.InputStream; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisUtil { //工厂
private static SqlSessionFactory factory;
//线程容器
private static ThreadLocal<SqlSession> tl = new ThreadLocal<>(); static{
try {
InputStream is = Resources.getResourceAsStream("mybatis.xml");
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取session
* 从线程容器中获取,没有则创建session在存放到线程容器中
* @return
*/
public static SqlSession getSession(){
SqlSession sqlSession = tl.get();
if(sqlSession == null){
sqlSession = factory.openSession();
tl.set(sqlSession);
}
return tl.get();
} /**
* 关闭session
* 从容器线程中获取session,有则关闭,且将线程容器的session清空
*/
public static void closeSession(){
SqlSession sqlSession = tl.get();
if(sqlSession != null){
sqlSession.close();
}
tl.set(null);
}
}
将工厂的产生改成单例模式
 package com.text.util;

 import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisUtil { //工厂
private static SqlSessionFactory factory;
//类线程锁
private static final Class CLASS_LOCK = MybatisUtil.class;
//线程容器
private static ThreadLocal<SqlSession> tl = new ThreadLocal<>();
//构造器私有化
private MybatisUtil(){} public static SqlSessionFactory initSqlSessionFactory(){
String resource = "mybatis.xml";
InputStream is = null;
try {
is = Resources.getResourceAsStream(resource);
} catch (IOException e) {
Logger.getLogger(MybatisUtil.class.getName()).log(Level.SEVERE, null, e);
}
synchronized (CLASS_LOCK) {
if(null == factory){
factory = new SqlSessionFactoryBuilder().build(is);
}
}
return factory;
} /**
* 获取session
* 从线程容器中获取,没有则创建session在存放到线程容器中
* @return
*/
public static SqlSession getSession(){
SqlSession sqlSession = tl.get();
if(sqlSession == null){
if(factory == null){
initSqlSessionFactory();
}
sqlSession = factory.openSession();
tl.set(sqlSession);
}
return tl.get();
} /**
* 关闭session
* 从容器线程中获取session,有则关闭,且将线程容器的session清空
*/
public static void closeSession(){
SqlSession sqlSession = tl.get();
if(sqlSession != null){
sqlSession.close();
}
tl.set(null);
}
}
 
2.2 定义过滤器
    过滤器可以在调用方法前及方法后添加代码
 package com.test.filter;

 import java.io.IOException;

 import java.io.InputStream;

 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.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import com.test.util.MyBatisUtil; /**
* 最开始是由Spring框架提出的.整合Hibernate框架是使用的是OpenSessionInView
*
*
* @author Administrator
*
*/
@WebFilter("/*")
public class OpenSessionInView implements Filter{ @Override
public void init(FilterConfig filterconfig) throws ServletException {
// TODO Auto-generated method stub
} @Override
public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)
throws IOException, ServletException {
// InputStream is = Resources.getResourceAsStream("mybatis.xml");
// SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
// SqlSession session = factory.openSession();
SqlSession session = MyBatisUtil.getSession();
try {
filterchain.doFilter(servletrequest, servletresponse);
session.commit();
} catch (Exception e) {
session.rollback();
e.printStackTrace();
}finally{
MyBatisUtil.closeSession();
}
// session.commit();
// session.close();
} @Override
public void destroy() {
// TODO Auto-generated method stub
}
}
 

工具类:mybatis中使用Threadlocal开启session及关闭session的更多相关文章

  1. Springboot在工具类(Util)中使用@Autowired注入Service

    1. 使用@Component注解标记工具类MailUtil: 2. 使用@Autowired注入我们需要的bean: 3. 在工具类中编写init()函数,并使用@PostConstruct注解标记 ...

  2. 大话分页(补充)——Threadlocal封装offSet和pageSize简化分页工具类

    经过前两篇文章(大话分页一.大话分页二)的介绍,我认为我想介绍的东西已经介绍完了,不过想精益求精的童鞋可以继续看本篇文章. 在第一篇文章中介绍了一个分页的工具类(具体请看大话分页一),从实现功能上来说 ...

  3. Maven基础&&Spring框架阶段常用工具类整理

    常用工具类 1.密码加密工具类: package com.itheima.utils; import java.security.MessageDigest; import sun.misc.BASE ...

  4. hibernate工具类

    因为hibernate的代码大部分都是固定的,为了将减少重复的代码的书写,可以将这些代码封装为一个工具类,获取hibernate的session对象. 1.工具类: package pers.zhb. ...

  5. Mybatis中SqlSessionFactory和SqlSession学习和原理

    源码git地址:https://github.com/mybatis/mybatis-3 目标结构: mybatis是数据持久化解决方案将用户从JDBC访问中解放出来,用户只需要定义需要操作的SQL语 ...

  6. SpringBoot整合Redis并完成工具类

    SpringBoot整合Redis的资料很多,但是我只需要整合完成后,可以操作Redis就可以了,所以不需要配合缓存相关的注解使用(如@Cacheable),而且我的系统框架用的日志是log4j,不是 ...

  7. Android自定义工具类获取按钮并绑定事件(利用暴力反射和注解)

    Android中为按钮绑定事件的有几种常见方式,你可以在布局文件中为按钮设置id,然后在MainActivity中通过findViewById方法获取按钮对象实例,再通过setOnClickListe ...

  8. Hibernate之工具类HibernateUtil

    原创文章,转载请注明:Hibernate之工具类HibernateUtil  By Lucio.Yang 1.最简单的工具类,实现SessionFactory的单例共享,session的管理 pack ...

  9. 开源JDBC工具类DbUtils

    本篇将会详细地介绍Apache公司的JDBC帮助工具类DbUtils以及如何使用.在上一篇中我们已经通过将以前对dao层使用JDBC操作数据库的冗余代码进行了简易封装形成自己的简单工具类JdbcUti ...

随机推荐

  1. C#流程控制语句--分支语句(if,switch,三位运算符)

    分支语句:判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). 分支语句  if if(判断条件表达式) {//表达式结果为tu ...

  2. mysql Access denied for user root @localhost (using password:YES)错误

    C:\AppServ\MySQL> mysql -u root -p Enter password:  ERROR 1045 (28000): Access denied for user 'r ...

  3. gensim LDA模型提取每篇文档所属主题(概率最大主题所在)

    gensim的LDA算法中很容易提取到每篇文章的主题分布矩阵,但是一般地还需要进一步获取每篇文章归属到哪个主题概率最大的数据,这个在检索gensim文档和网络有关文章后,发现竟然没有. 简单写了一下. ...

  4. 爬虫(七)图片懒加载技术、selenium和PhantomJS

    动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding ...

  5. element-ui <el-date-picker> 回显格式 yyyy-MM-dd 传值格式 yyyyMMddHHmmss

    <template> <!-- 需求:使用 <el-date-picker> 日期插件 前端显示2018-10-22 后台需要传时间戳,对这个日期插件不熟悉,当时搞了好长 ...

  6. android studio 编辑markdown文件

    作为开发人员,对markdown应该比较熟悉,我们在Android开始中,可以使用studio引入Markdown Navigator插件,进行编辑. 搜索 Markdown Navigator 安装 ...

  7. Jedis路由key的算法剥离

    在Redis集群中,会有很多个分片,如果此时利用Jedis来操作此Redis集群,那么他会把数据路由到不到的分片上.而且如果动态的往集群中增加分片,也不会影响Jedis的功能.究竟是怎么做到的呢? 由 ...

  8. win10优化工具哪个好

    不少刚安装好win10系统的用户觉得win10系统很卡,这是因为你没有进行win10优化导致的,今天小编就来跟各位介绍几款win10优化,希望对您的优化工作有帮助. 我们安装好电脑操作系统如果直接使用 ...

  9. 面试北京XX数通总结

    软件架构师何志丹 1             总括 1.1     面试时间 2019年1月21号. 1.2     公司概况 员工近20人,其中开发人员6人,全部objectarx(C++),全部老 ...

  10. react项目搭建及webpack配置

    1,配置webpack npm install -g webpack                       webpack的cli环境 npm install -g webpack-dev-se ...