Mybatis的工具类

打印 上一主题 下一主题

主题 809|帖子 809|积分 2427

为什么要编写工具类?

1. 代码复用

工具类会合封装了常用的功能和操作,比如创建和关闭 SqlSession,这样可以避免在多个地方重复编写相同的代码。每次使用时,只需要调用工具类中的方法即可,简化了代码。
示例: 每次要打开 SqlSession,假如没有工具类,就必须手动写以下代码:
  1. InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
  2. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  3. SqlSession sqlSession = sqlSessionFactory.openSession();
复制代码
有了工具类后,使用代码变得简单:
  1. SqlSession sqlSession = SqlSessionUtil.openSession();
复制代码
2. 会合管理资源

像 SqlSessionFactory 这样的资源通常是全局的,只有一个实例。在工具类中进行会合管理,确保整个应用程序中只创建一个 SqlSessionFactory 实例,避免资源浪费。此外,通过工具类也能更好地控制 SqlSession 的创建和关闭,确保资源不泄露。
好处:


  • 避免了重复创建 SqlSessionFactory 带来的性能开销。
  • SqlSession 的关闭在工具类中进行统一管理,避免开发职员忘记关闭会话导致毗连泄漏。
工具类 

  1. package Utils;
  2. import org.apache.ibatis.io.Resources;
  3. import org.apache.ibatis.session.SqlSession;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. public class SqlSessionUtil {
  9.     // 静态SqlSessionFactory对象,用于保证整个应用程序中只有一个SqlSessionFactory实例
  10.     private static SqlSessionFactory sqlSessionFactory;
  11.     // 静态代码块,用于类加载时初始化SqlSessionFactory对象
  12.     static {
  13.         try {
  14.             // 读取MyBatis配置文件,构建SqlSessionFactory对象
  15.             InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
  16.             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  17.         } catch (IOException e) {
  18.             throw new RuntimeException(e);  // 捕获IO异常并抛出运行时异常
  19.         }
  20.     }
  21.     /**
  22.      * 获取SqlSession对象
  23.      * @return SqlSession对象
  24.      */
  25.     public static SqlSession openSession() {
  26.         // 使用SqlSessionFactory打开一个新的SqlSession
  27.         return sqlSessionFactory.openSession();
  28.     }
  29.     /**
  30.      * 关闭SqlSession对象
  31.      * @param sqlSession 要关闭的SqlSession对象
  32.      */
  33.     public static void closeSession(SqlSession sqlSession) {
  34.         if (sqlSession != null) {
  35.             sqlSession.close();  // 关闭会话
  36.         }
  37.     }
  38. }
复制代码
代码解释 

1. 静态代码块

静态代码块在类加载时执行一次,用于初始化类级别的静态变量。代码中使用静态代码块读取 MyBatis 的设置文件,构建 SqlSessionFactory,确保应用中只有一个 SqlSessionFactory 实例。
2. 资源读取和设置文件

通过 Resources.getResourceAsStream("mybatis-config.xml") 来读取 MyBatis 的核心设置文件 mybatis-config.xml,这个文件通常包含数据库毗连信息、Mapper 映射、事务管理等设置。
3. 异常处置惩罚

在读取设置文件时,大概会发生 IOException,此处捕获该异常,并抛出运行时异常 RuntimeException,以防止体系继承执行。假如初始化失败,程序应立刻制止。
4. 工具方法

SqlSessionUtil 提供了两个公共静态方法:


  • openSession():返回一个新的 SqlSession,用于执行数据库操作。
  • closeSession(SqlSession sqlSession):关闭传入的 SqlSession,以释放数据库资源。
5. 单例模式

通过静态工厂(SqlSessionFactory)实现单例模式,这样避免每次操作都重新创建工厂对象,提高了体系的性能和资源使用率。
扩展:为何要封装 SqlSession?



  • 保证全局唯一的 SqlSessionFactory 实例,淘汰资源浪费。
  • 方便管理 SqlSession 的创建与关闭,确保数据库毗连不被泄露。
  • 会合管理异常处置惩罚,简化业务层的代码复杂度。
1. 一个数据库对应一个 SqlSessionFactory

通常,一个 SqlSessionFactory 对应一个数据库毗连设置。这意味着,假如你的应用程序需要毗连多个数据库,那么你通常会为每个数据库设置一个 SqlSessionFactory 实例。缘故原由在于每个 SqlSessionFactory 会加载不同的数据库设置(例如,数据库的 URL、用户名、暗码等)。


  • 示例:假设你有两个数据库 db1 和 db2,你大概会创建两个 SqlSessionFactory 实例,每个实例负责对应一个数据库的毗连。
    1. SqlSessionFactory sqlSessionFactory1 = ... // 针对数据库 db1
    2. SqlSessionFactory sqlSessionFactory2 = ... // 针对数据库 db2
    复制代码
2. 一个会话(SqlSession)对应一次数据库操作

一个 SqlSession 通常用于处置惩罚一次数据库操作或事务。SqlSession 不是线程安全的,通常在每个线程中创建新的 SqlSession,并在操作竣事后关闭它。这样做的好处是:


  • 每个 SqlSession 只负责一次数据库事务操作,使用完后实时关闭,避免毗连泄漏。
  • 一个 SqlSession 打开后,会绑定到一个特定的数据库毗连,因此整个会话中涉及的操作都在这个毗连上进行。
java的例子 

  1. package test;
  2. import Utils.SqlSessionUtil;
  3. import org.apache.ibatis.session.SqlSession;
  4. import org.testng.annotations.Test;
  5. public class CarMapperTest {
  6.     @Test
  7.     public void testInsertCarByUtil(){
  8.         SqlSession sqlSession = SqlSessionUtil.openSession();
  9.         int count = sqlSession.insert("insertCar");
  10.         sqlSession.commit();
  11.         sqlSession.close();
  12.     }
  13. }
复制代码
 
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户国营

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表