MyBatis基础:使用java提供的ThreadLocal类优化代码

public class MyBaitsView {
    //使用java提供的ThreadLocal类来存储SqlSession对象,方便同一线程获得sqlSession
    public static ThreadLocal<SqlSession> threadLocal=new ThreadLocal();
    public static SqlSessionFactory factory;
    //初使化SqlSessionFactory工厂
    static {
        try {
            InputStream is = Resources.getResourceAsStream("myBatis.xml");
            factory=new SqlSessionFactoryBuilder().build(is);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
    //获取SqlSession的方法,如果session 为空,则生成一个新的SqlSession
    public static SqlSession getSession() {
        SqlSession session=threadLocal.get();
        if(session==null) {
            threadLocal.set(factory.openSession());
        }
        return threadLocal.get();
    }
    //关闭SqlSession
    public static void closeSession() {
        SqlSession session=threadLocal.get();
        if(session!=null) {
            session.close();
        }
    }
}
@WebFilter("/*")
public class InsertFilter implements Filter{
    @Override
    public void destroy() { }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter)
            throws IOException, ServletException {
        //获得当前线程的SqlSession对象
            SqlSession session=MyBaitsView.getSession();
            try {
                //对请求进行处理
                filter.doFilter(request, response);
            }catch(Exception e) {
                //如果出异常,则回滚
                session.rollback();
                e.printStackTrace();
            }finally {
                //提交事务,关闭SqlSession
                session.commit();
                MyBaitsView.closeSession();
            }
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException { }
}
public class InsertServlet extends HttpServlet{
    InsertService insertService=new InsertServiceImpl();
    @Override
    public void service(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException  {
        request.setCharacterEncoding("utf-8");
        Log log=new Log();
        //获得表单数据
        log.setAccountIn(request.getParameter("accountIn"));
        log.setAccountOut(request.getParameter("accountOut"));
        log.setMoney(Integer.parseInt(request.getParameter("money")));
        //调用service层方法插入数据
        int index = insertService.insert(log);
        System.out.println(index);
    }
}
public class InsertServiceImpl implements InsertService{
    @Override
    public int insert(Log log) {
        //获得SqlSession对象
        SqlSession session=MyBaitsView.getSession();
        LogMappery logMapper = session.getMapper(LogMappery.class);
        int index=logMapper.insert(log);
        return index;
    }
}

原文地址:https://www.cnblogs.com/lastingjava/p/9955441.html

时间: 2024-08-01 00:14:25

MyBatis基础:使用java提供的ThreadLocal类优化代码的相关文章

使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法

Java提供了Class类,可以通过编程方式获取类别的字段和方法,包括构造方法 获取Class类实例的方法: 类名.class 实例名.getClass() Class.forName(className) public class RefTest { @Test public void testRef(){ //Class cls = RefTest.class; //Class.forName("com.jboa.service.RefTest"); //new RefTest()

2015年11月26日 Java基础系列(三)ThreadLocal类初级学习

序,ThreadLocal类是为了解决多线程的安全问题.线程安全的意思也就是说每个线程操作自己的变量,不要对其他线程的值造成影响. 在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性. 1 ThreadLocal解决多线程安全问题的思路是通过ThreadLocalMap进行管控,就像一个Map中存在多个键值对,ThreadLocalMap可以对比Map进行理解. 2 一般通过覆盖ThreadLocal的init

【代码笔记】Java基础:Java的方法和类

Java作为一种面向对象的语言,具备三大特性(面向对象的核心):封装性   继承性   多态性 封装性:就是打包,所有东西都是打包好的. 继承:子类可以继承父类 文件名:Student.java 1 public class Student { 2 public String name; 3 public int age; 4 5 public void study(){ 6 System.out.println("学生学习"); 7 } 8 } 在上文中定义了普通方法学生(Stude

Java基础-一个java文件多个类的问题

一个.java文件当然可以包括多个类.但这些类有一个特殊的类与其它的不同,,这个类是带public 属性的类.一个.java类文件中仅有一个public属性的类.而且这个类与文件名相同.

java面试基础题------》Java 中的父子类静态代码块,代码块,构造方法执行顺序

4.指出下面程序的运行结果. class A { static { System.out.print("1"); } public A() { System.out.print("2"); } } class B extends A{ static { System.out.print("a"); } public B() { System.out.print("b"); } } public class Hello { pu

Java集合涉及的类(代码)

Customer: public class Customer implements Comparable{        private Integer customerId;        private String customerName;                        public Integer getCustomerId() {            return customerId;        }        public void setCustome

【Java基础08】内部类、枚举类、日期和时间、Math、Random

1 内部类 1.1 概念 大部分时候,类被定义成一个独立的程序单元,在某些情况下,也会把一个类放到另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,包含内部类的类被称为外部类. 1.2 作用 1.提供更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类. 2.内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以互相访问.但外部类不能访问内部类的实现细节,例如内部类的成员变量. 3.匿名内部类适合用于创建那些仅需要一次使用的类

Java学习笔记--ThreadLocal

我们知道Spring通过各种模板类降低了开发者使用各种数据持久技术的难度.这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突.我们使用模板类访问底层数据,根据持久化技术的不同,模板类需要绑定数据连接或会话的资源.但这些资源本身是非线程安全的,也就是说它们不能在同一时刻被多个线程共享.虽然模板类通过资源池获取数据连接或会话,但资源池本身解决的是数据连接或会话的缓存问题,并非数据连接或会话的线程安全问题. 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对

Java 日期、时间类

Java 原本提供了 Date 和 Calendar 用于处理日期.时间的类,包括创建日期.时间对象,获取系统当前日期.时间等操作.但 Date 不仅无法实现国际化,而且它对不同属性也使用了前后矛盾的偏移量,比如月份与小时都是从0开始的,月份中的天数则是从1开始的,年又是从1900开始的,而 java.util.Calendar 则显得过于复杂,从下面介绍中会看到传统 Java 对日期.时间处理的不足.Java8 吸取了 Joda-Time 库(一个被广泛使用的日期.时间库)的经验,提供了一套全