• MyBatisUtil类


    在用MyBatis框架连接数据库时,往往要经常创建sessionFactory,重复的编写大量代码,故将其中的重复代码提出成一个工具类,这样直接调用方法即可,可简化代码编写和优化运行效率,不需要重复的读取mybatis核心配置文件和反复new工厂对象

    编写的MyBatis的util工具类如下:

    package com.study.util;
     
    import java.io.IOException;
    import java.io.Reader;
     
    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 sessionFactory = null;
        /*
         * 创建本地线程变量,为每一个线程独立管理一个session对象 每一个线程只有且仅有单独且唯一的一个session对象
         * 加上线程变量对session进行管理,可以保证线程安全,避免多实例同时调用同一个session对象
         * 每一个线程都会new一个线程变量,从而分配到自己的session对象
         */
        private static ThreadLocal<SqlSession> threadlocal = new ThreadLocal<SqlSession>();
     
        // 创建sessionFactory对象,因为整个应用程序只需要一个实例对象,故用静态代码块
        static {
            try {
                Reader reader = Resources.getResourceAsReader("Mybatis_config.xml");
                sessionFactory = new SqlSessionFactoryBuilder().build(reader);
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     
        /**
         * 返回sessionFactory对象 工厂对象
         * 
         * @return sessionFactory
         */
        public static SqlSessionFactory getSessionFactory() {
            return sessionFactory;
        }
     
        /**
         * 新建session会话,并把session放在线程变量中
         */
        private static void newSession() {
            // 打开一个session会话
            SqlSession session = sessionFactory.openSession();
            // 将session会话保存在本线程变量中
            threadlocal.set(session);
        }
        
        /**
         * 返回session对象
         * @return session
         */
        public static SqlSession getSession(){
            //优先从线程变量中取session对象
            SqlSession session = threadlocal.get();
            //如果线程变量中的session为null,
            if(session==null){
                //新建session会话,并把session放在线程变量中
                newSession();
                //再次从线程变量中取session对象
                session = threadlocal.get();
            }
            return session;
        }
        
        /**
         * 关闭session对象,并从线程变量中删除
         */
        public static void closeSession(){
            //读取出线程变量中session对象
            SqlSession session = threadlocal.get();
            //如果session对象不为空,关闭sessoin对象,并清空线程变量
            if(session!=null){
                session.close();
                threadlocal.set(null);
            }
        }
        
    }

    其中的Mybatis_config.xml是我的MyBatis的核心配置文件。

    用静态代码块进行创建SqlSessionFactory,只在类加载时创建一次,保证了整个程序运行时只有一个工厂实例。

    用线程变量保存session对象,是为了线程安全着想,这样自己的线程管理自己线程的session,不会出现多实例同时调用同一个session对象,造成数据不准确的情况出现。

    MyBatisUtil.getSession(); 即可获得session对象;

    MyBatisUtil.closeSession();  即可关闭线程对象,务必要在session使用完毕后关闭session。

  • 相关阅读:
    从清月高中物理动学课件制作工具说【FarseerPhysics引擎之WheelJoint】及【PropetryGrid之动态下拉列表】
    一种从纹理图片提取多边形的方法
    蒸汽世界满手尘土生命、水、光照锁定修改器
    【五子棋AI循序渐进】——整合完成
    洛谷-07敦刻尔克大撤退-[再也不坑]【二战2】二战系列2:狼烟四起
    洛谷-火柴棒等式-NOIP2008提高组复赛
    洛谷-笨小猴-NOIP2008提高组复赛
    NOIP2013-普及组复赛-第一题-计数问题
    NOIP2010-普及组复赛-第四题-三国游戏
    NOIP2012-普及组复赛-第二题-寻宝
  • 原文地址:https://www.cnblogs.com/moonsoft/p/10131693.html
Copyright © 2020-2023  润新知