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. MVC与MVVM关系图解

  2. iptables命令使用详解

    iptables的主要功能是实现对网络数据包进出设备及转发的控制.当数据包需要进入设备.从设备中流出或者经该设备转发.路由时,都可以使用iptables进行控制. 环境 操作系统:CentOS7.3 ...

  3. mui预加载

    1.只能加载一个页面 mui.init(); var page = null; mui.plusReady(function() { //预加载页面mui.preload必须放在plusReady事件 ...

  4. Azure中block和Page的比较 Azure: Did You Know? Block vs Page Blobs

    Azure storage service supports two types of blobs (blob, or BLOB, stand for Binary Large OBject, i.e ...

  5. java protected修饰符说明

    1. 简介 对protected修饰符进行阐述,结合Object类的clone方法进行说明.其中clone方法如下:protected Object Object.clone(): 关于protect ...

  6. JAVA入门[23]-SpringBoot配置Swagger2

    一.新建SpringBoot站点 1.新建module,然后引入pom依赖: <parent> <groupId>org.springframework.boot</gr ...

  7. Python 计算π及进度条显示

    一,首先打开命令提示符找到Python路径,输入pip install tqdm下载第三方库tpdm. 二,写程序 法一 from math import * from tqdm import tqd ...

  8. maven作用

    1.控制项目间依赖关系方案 A项目依赖B项目的某些功能.将B项目打包为jar,并在A项目的Library下导入B的jar文件. 这样做有着很明显的缺点:        1.如果在开发过程中,发现B中的 ...

  9. Spring _day02_IoC注解开发入门

    1.Spring IoC注解开发入门 1.1 注解开发案例: 创建项目所需要的jar,四个基本的包(beans core context expression ),以及两个日志记录的包,还要AOP的包 ...

  10. C# Global.asax.cs 定时任务

    定时执行更新Redis缓存操作 protected void Application_Start(object sender, EventArgs e) { Timer timer = new Tim ...