Mybatis核心组件简介

本文介绍了Mybatis的核心组件,包括SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession和映射器的作用和生命周期。SqlSessionFactoryBuilder用于构建SqlSessionFactory,SqlSessionFactory作为全局变量在应用中保持单例。SqlSession代表会话,每个线程应有自己的实例,使用后需关闭。映射器接口绑定映射语句,应在方法作用域内获取和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

核心组件

一、核心组件和作用

1、SqlSessionFactoryBuilder(构造器)

​ 它会根据配置或者代码来生成 SqlSessionFactory,采用的是分步构建的 Builder 模式。

2、SqlSessionFactory(工厂接口)

​ 依靠它来生成 SqlSession,使用的是工厂模式。

3、SqlSession(会话)

​ 一个既可以发送 SQL 执行返回结果,也可以获取 Mapper 的接口。在现有的技术中,一般我们会让其在业务逻辑代码中“消失”,而使用的是 MyBatis 提供的 SQL Mapper 接口编程技术,它能提高代码的可读性和可维护性。

4、SQL Mapper(映射器)

​ MyBatis 新设计存在的组件,它由一个 Java 接口和 XML 文件(或注解)构成,需要给出对应的 SQL 和映射规则。它负责发送 SQL 去执行,并返回结果。

MyBatis核心组件

二、生命周期和作用域

1、SqlSessionFactoryBuilder

​ 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了

​ 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。

​ 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

2、SqlSessionFactory(全局变量)

​ SqlSessionFactory 一旦被创建就应该在项目的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。

​ 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建SqlSessionFactory 被视为一种代码“坏习惯”。

​ 因此SqlSessionFactory 的最佳作用域是应用作用域

​ 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

3、SqlSession

​ 每个线程都应该有它自己的 SqlSession 实例。

​ SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域

​ 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。

​ 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。

​ 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。

​ 下面的示例就是一个确保 SqlSession 关闭的标准模式:

try (SqlSession session = sqlSessionFactory.openSession()) {
  // 你的应用逻辑代码
}

在所有代码中都遵循这种使用模式,可以保证所有数据库资源都能被正确地关闭。

4、映射器实例(mapper)

​ 映射器是一些绑定映射语句的接口

​ 映射器接口的实例是从SqlSession 中获得的。

​ 虽然从技术层面上来讲,任何映射器实例的最大作用域与请求它们的SqlSession 相同。但方法作用域才是映射器实例的最合适的作用域

​ 也就是说,映射器实例应该在调用它们的方法中被获取,使用完毕之后即可丢弃。映射器实例并不需要被显式地关闭。尽管在整个请求作用域保留映射器实例不会有什么问题,但是你很快会发现,在这个作用域上管理太多像SqlSession 的资源会让你忙不过来。因此,最好将映射器放在方法作用域内。就像下面的例子一样:

三、得到SqlSessionFactory的两种方法

1、从 XML 中构建 SqlSessionFactory

String resource = "总配置文件名";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

2、不使用 XML 构建 SqlSessionFactory

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(configuration);

qlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(configuration);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值