首页 > 其他分享 >使用ThreadLocal+OpenSessionInView优化Mybatis使用

使用ThreadLocal+OpenSessionInView优化Mybatis使用

时间:2023-02-19 18:34:07浏览次数:61  
标签:获取 OpenSessionInView tl 过滤器 ThreadLocal session 线程 Mybatis

使用一个名为OpenSessionInView的servlet过滤器,简化在服务中使用mybatis的操作。

 

 


 

一、情况分析

Mybatis的使用过程:

  1、获取配置文件

  2、获取session工厂

  3、获取session对象

  4、进行sql操作,获取对应结果

  5、提交事务

  6、关闭session对象

  其中,我们一般只需要关注第4步。

ThreadLocal的原理:
  它用于存放每个线程自己的独立数据。参考:Java中的ThreadLocal线程本地变量

servlet中过滤器:

  它会在servlet执行前后,进行过滤操作。

  处于同一线程下。

  即可以在过滤器中进行session的管理(创建、提交、回滚、关闭)。

  参考:Servlet_2_过滤器


二、具体方案

  1、创建一个MybatisUtils工具类,它负责sesion的创建和关闭。对于同一个线程,它只提供一个session对象。

/**
 * 一个线程中,通过getSession获取,始终是同一个session对象
 * @author lurenjia
 * @date 2023/2/19-17:19
 */
public class MybatisUtils {

    /**
     * 同一线程共享的空间
     */
    private static ThreadLocal<SqlSession> tl = new ThreadLocal<>();
    
    /**
     * 工厂只有一个
     */
    private static SqlSessionFactory factory = null;
    //初始化工厂
    static {
        try {
            //获取配置文件
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //获取工厂
            factory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 获取session对象,一个线程只能获取到同一个
     * @return
     */
    public static SqlSession getSession(){
        SqlSession session = tl.get();
        //如果线程中没有session对象,则创建一个
        if(tl.get()==null){
            tl.set(factory.openSession());
        }
        return tl.get();
    }
    /**
     * 关闭线程中的session对象
     */
    public static void close(){
        SqlSession session = tl.get();
        if(session!=null){
            session.close();
        }
        tl.set(null);
    }
    private MybatisUtils(){}
}

  2、创建一个过滤器。在过滤方法中对session进行管理。

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //统一编码格式
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");

        //获取到这个线程的session
        SqlSession session = MybatisUtils.getSession();
        try {
            //放行,让它去找它的servlet服务处理
            filterChain.doFilter(servletRequest, servletResponse);

            //处理完了提交事务
            session.commit();
        } catch (Exception e) {
            //出现异常了,回滚!
            session.rollback();
        } finally {
            //关闭资源
            MybatisUtils.close();
        }
    }

三、案例

  使用此方案,实现了在页面显示数据库指定表中的所有数据。Mybatis学习:使用过滤器(OpenSessionInView)实现了对session对象的管理: 使用过滤器(OpenSessionInView)实现了对session对象的管理 - Gitee.com

标签:获取,OpenSessionInView,tl,过滤器,ThreadLocal,session,线程,Mybatis
From: https://www.cnblogs.com/lurenjia-bky/p/17135293.html

相关文章

  • springboot mybatis (关联关系:一对一,一对多,多对多)
    例如这个学生选课的这个:这个里面课程跟老师是1对1的,而老师对课程是1对多的,一个课程只能由一个老师教,而一个老师可以教多个课程对于学生和课程之间是多对多的,一个学生可以......
  • threadlocal 原理详解
    ThreadLocal的基本概念在多线程并发中,我们需要保证共享变量(临界区)的安全性,因此在前面说起过synchronized和Lock锁,其中synchronized锁可以修饰方法或代码块,Lock锁可以修饰......
  • 版本不兼容(NoSuchMethodError: com.baomidou.mybatisplus.core.toolkit.StringUtils.i
    "C:\ProgramFiles\Java\jdk1.8.0_221\bin\java.exe"-XX:TieredStopAtLevel=1-noverify-Dspring.output.ansi.enabled=always-Dcom.sun.management.jmxremote-Dsprin......
  • mybatis中#{}和${}有什么区别
    {}是预编译处理,是占位符;${}是字符串替换、是拼接符。mybatis在处理#{}时,会将sql中的#{}替换为?,调用PreparedStatement来赋值,可以有效防止SQL注入。在处理${}时,就是简单将$......
  • 基于 springboot + mybatis-plus + MySQL 重构过去一个项目的记录(持续更新)
     思维导图链接:https://boardmix.cn/app/share?token=Qs5kGTyiYZ17sWf8AiBbv_8mO1O5qgHlipZ7ECuQldD2FeyMfWBZWyjl-sUyDPmx7g6rysDzNYQ4jBWAWgcSGsZpR9CRotY58UnDm0foVHY=......
  • 使用 mybatis-plus 时,应在 DB 设计时注意的问题
    一开始我将组表的名称设置为group,在使用过程中发生sql语句错误,随后意识到:如果用mybatis-plus就不能在创建DB将表名写成sql关键字,这样会导致错误。同时,在对表内字段......
  • MybatisPlus------代码生成器
    快速开发:代码生成器:(1)模版:MyBatisPlus提供(2)数据库相关配置:读取数据库获取信息(3)开发者自定义配置:手工配置packagecom.ithema;importcom.baomidou.mybatisplus.anno......
  • Mybatisplus----DML编程控制
    乐观锁(1)业务并发现象带来的问题:秒杀执行:1、在类对象中添加version属性,在数据库表中添加version字段(默认值为1)packagecom.itheima.domain;importcom.baomidou.mybat......
  • SSM整合03 - Spring整合MyBatis
    MyBatis核心配置文件mybatis-config.xmlSpring整合MyBatis的核心点:将MyBatis核心配置文件中的配置尽可能写入Spring的配置文件中原MyBatis核心配置文件mybatis-config.......
  • Mybatisplus----DML编程---多记录操作
    批量处理数据:@TestvoidtestDelete(){//批量按id删除List<Long>list=newArrayList<>();list.add(1626917366924050434L);......