MyBatis工厂类封装与简化实现

 更新时间:2024年01月15日 15:58:44   作者:qq_52315213  
工厂类的目的是将对象的创建逻辑封装在一个类中,以便客户端代码无需了解具体的实现细节,本文主要介绍了MyBatis工厂类封装与简化实现,具有一定的参考价值,感兴趣的可以了解一下

1.工厂类

在Java中,工厂类是一种设计模式,主要用于创建对象的过程。工厂类的目的是将对象的创建逻辑封装在一个类中,以便客户端代码无需了解具体的实现细节,只需要通过工厂类获取所需的实例。

工厂类的主要作用包括:

  • 封装对象创建逻辑: 将对象的创建过程和细节封装在工厂类中,使客户端代码无需关心如何创建对象,降低了代码的耦合性。

  • 统一接口: 工厂类提供了一个统一的接口或方法来创建对象,客户端代码只需要调用这个接口或方法,而无需关心具体的实现类。

  • 简化实例化过程: 对于某些复杂的对象创建过程,工厂类可以隐藏创建对象的复杂性,简化了客户端代码。

  • 灵活切换实现: 如果需要更改或替换某个类的实现,只需修改工厂类的实现,而无需修改客户端代码。这种方式支持更灵活的实现替换。

2.对工厂类再封装

这是我们之前的代码:

package Mybatis;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;

/**
 * 我们已经配置好了myBatis,当我们希望使用myBatis的时候,
 * 我们就会创建一个SqlSessionFactory类,在这个类里使用myBatis的各种功能。
 */
public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        //寻找配置文件,参数就是配置文件的路径,这里是相对路径
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(new FileInputStream("myBatis_config.xml"));

        //sqlSession就像之前的statement一样,创建一个连接,执行sql语句,它也需要关闭,所以写进try
        //参数true代表开启自动提交,如果不自动提交,就类似与之前说的mysql的事务模式
        try (SqlSession sqlSession = sqlSessionFactory.openSession(true)){

            //这里的参数是mapper里指定的那个sql语句的名称
            //也就是UserMapper.xml里的id字段的名称
            List<User> student = sqlSession.selectList("selectUser");

            //这行代码使用了 Java 8 引入的新特性之一,称为方法引用(Method Reference)。
            // 具体来说,System.out::println 是一个静态方法引用,用于将 println 方法关联到 System.out 对象上。
            //在这里,System.out::println 等效于 lambda 表达式 (s) -> System.out.println(s)。
            // 它表示将遍历 student 集合的每个元素,并将每个元素传递给 System.out.println 方法,实现在控制台上打印每个元素的效果。
            student.forEach(System.out::println);
        }
    }
}

我们发现在之前的代码中,我们首先新建了一个工厂类,然后执行查询。

但是很这里的代码逻辑有些不清晰,我们希望的是  连接->查询

我们希望:

MybatisUtil.getSession(true)

而不是:

 SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(new FileInputStream("myBatis_config.xml"));

工厂类虽然封装对象创建逻辑,但在这里还有些臃肿,所以我们新建一个工具类,来封装这个工厂类。

package Mybatis;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.FileInputStream;
import java.io.IOException;


public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try{
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(new FileInputStream("myBatis_config.xml"));
        }catch (IOException e){
            e.printStackTrace();
        }
    }
    /**
     * 获取一个新的会话
     * @param autoCommit 是否开启自动提交(跟JDBC是一样的,如果不自动提交,则会变成事务操作)
     * @return SqlSession对象
     */
    public static SqlSession getSession(boolean autoCommit){
        return sqlSessionFactory.openSession(autoCommit);
    }
}

在这段代码里,有一个静态段和静态变量。静态段和静态变量会在类加载的过程中执行,并且只执行一次。(无论你new多少个MyBatisUtil对象,都只会执行一i,不会重复执行)

这样的MyBatisUtil写法有几个好处:

  • 单例模式: SqlSessionFactory 是一个比较重量级的对象,包含了对数据库的配置信息、映射信息等,创建和初始化它可能是一个相对耗时的操作。这样写确保在整个应用程序生命周期内只创建了一个 SqlSessionFactory 对象,提高了性能。

  • 全局唯一性: SqlSessionFactory 对象在整个应用程序中是唯一的,保证了全局唯一性。这意味着在应用程序中的任何地方,都可以通过 MyBatisUtil 获取到相同的 SqlSessionFactory 实例。

  • 资源共享: SqlSessionFactory 是一个比较重的资源,通过单例模式,可以确保所有的 SqlSession 对象都共享同一个 SqlSessionFactory。这样,在应用程序中多个地方需要访问数据库时,共享的 SqlSessionFactory 可以提高资源利用效率。

  • 简化使用: 封装了 SqlSessionFactory 的创建过程,对客户端代码提供了简单的接口,通过 MyBatisUtil 的 getSession 方法,客户端可以方便地获取到一个新的 SqlSession 实例,而无需关心 SqlSessionFactory 的创建和初始化过程。

所以现在,我们的Main类变成了:

package Mybatis;

import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class MainWithUtil {
    public static void main(String args[]){
        //用MyBatisUtil来包装之前MainWithoutUtil的工厂类,更简单地得到连接
        try(SqlSession sqlSession = MyBatisUtil.getSession(true)){

            //这里的参数是mapper里指定的那个sql语句的名称
            //也就是UserMapper.xml里的id字段的名称
            List<User> student = sqlSession.selectList("selectUser");

            //这行代码使用了 Java 8 引入的新特性之一,称为方法引用(Method Reference)。
            // 具体来说,System.out::println 是一个静态方法引用,用于将 println 方法关联到 System.out 对象上。
            //在这里,System.out::println 等效于 lambda 表达式 (s) -> System.out.println(s)。
            // 它表示将遍历 student 集合的每个元素,并将每个元素传递给 System.out.println 方法,实现在控制台上打印每个元素的效果。
            student.forEach(System.out::println);
        }
    }
}

到此这篇关于MyBatis工厂类封装与简化实现的文章就介绍到这了,更多相关MyBatis工厂类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 正则表达式入门详解(基础进阶)

    Java 正则表达式入门详解(基础进阶)

    最近看到很多同学想要学习java正则表达式的一些知识,那么脚本之家小编就为大家介绍一下,其实正则表达式实用性很强,处理大幅文字的时候都需要用得到,语法也大同小异
    2017-10-10
  • Spring Security OAuth过期的解决方法

    Spring Security OAuth过期的解决方法

    这篇文章主要介绍了Spring Security OAuth过期的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详解Spring Cloud Zuul中路由配置细节

    详解Spring Cloud Zuul中路由配置细节

    本篇文章主要介绍了详解Spring Cloud Zuul中路由配置细节,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • springboot集成websocket的四种方式小结

    springboot集成websocket的四种方式小结

    本文主要介绍了springboot集成websocket的四种方式小结,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Java面向对象基础教学(二)

    Java面向对象基础教学(二)

    这篇文章主要介绍了Java的面相对象编程思想,包括类对象方法和封装继承多态等各个方面的OOP基本要素,非常推荐,需要的朋友可以参考下,希望可以对你有所帮助
    2021-07-07
  • SpringBoot开发详解之Controller接收参数及参数校验

    SpringBoot开发详解之Controller接收参数及参数校验

    数据校验是为了使系统更完整,数据更精确,同时也有利于维护数据的安全性,下面这篇文章主要给大家介绍了关于SpringBoot开发详解之Controller接收参数及参数校验的相关资料,需要的朋友可以参考下
    2022-03-03
  • spring中@Autowire和@Resource的区别在哪里(推荐)

    spring中@Autowire和@Resource的区别在哪里(推荐)

    这篇文章主要介绍了spring中@Autowire和@Resource的区别在哪里?本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • JAVA CountDownLatch与thread-join()的区别解析

    JAVA CountDownLatch与thread-join()的区别解析

    这篇文章主要介绍了JAVA CountDownLatch与thread-join()的区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 三道java新手入门面试题,通往自由的道路--多线程

    三道java新手入门面试题,通往自由的道路--多线程

    这篇文章主要为大家分享了最有价值的3道多线程面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,对hashCode方法的设计、垃圾收集的堆和代进行剖析,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 关于任务调度框架quartz使用(异常处理,解决恢复后多次调度处理)

    关于任务调度框架quartz使用(异常处理,解决恢复后多次调度处理)

    这篇文章主要介绍了关于任务调度框架quartz使用(异常处理,解决恢复后多次调度处理),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12

最新评论