【spring boot笔记】16.(MyBatis)SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession

本文介绍了MyBatis中三个核心组件SqlSessionFactoryBuilder、SqlSessionFactory和SqlSession的作用及使用范围。SqlSessionFactoryBuilder负责创建SqlSessionFactory,后者则用于生成SqlSession实例,而SqlSession则是面向用户的接口,用于执行SQL语句。
部署运行你感兴趣的模型镜像
SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession

SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession是MyBatis进行Dao开发的三个重要的类。SqlSessionFactoryBuilder创建SqlSessionFactory,SqlSessionFactory创建SqlSession。

SqlSessionFactoryBuilder:

SqlSessionFactoryBuilder用于创建SqlSessionFactory,一旦创建完成,SqlSessionFactoryBuilder就不再有其他用处了,因此可以将SqlSessionFactoryBuilder当做一个工具类使用,最佳使用范围是方法内。

SqlSessionFactory:

SqlSessionFactory是一个接口,接口定义了openSession的不同重载方法,SqlSessionFactory的使用范围是整个应用的运行期间,一旦创建后可以重复使用

SqlSession:

SqlSession是面向用户的接口,默认使用DefaultSqlSession实现类,最佳使用范围是在方法体内定义成局部变量使用,不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。同时打开一个SqlSession使用完后需要关闭它。

参考:
https://www.cnblogs.com/lcngu/p/5468295.html

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

以下是对包含读取配置文件、构建SqlSessionFactory获取SqlSession获取Mapper接口代理对象、执行查询操作和关闭SqlSessionMyBatis代码的分析: ### 代码示例 ```java import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; import java.util.List; // 假设的User类和UserMapper接口 class User { // 类属性和方法 } interface UserMapper { List<User> findAll(); } public class MyBatisTest { public void test() throws IOException { // 读取配置文件 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); // 创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); // 通过SqlSessionBuilder对象解析mybatis-config.xml文件,构建一个SqlSessionFactory SqlSessionFactory sqlSessionFactory = builder.build(is); // 通过SqlSessionFactory构建一个SqlSession SqlSession session = sqlSessionFactory.openSession(); // 通过SqlSession获取Mapper实例 UserMapper userMapper = session.getMapper(UserMapper.class); // 获取数据 List<User> users = userMapper.findAll(); // 打印输出 for (User user : users) { System.out.println(user); } // 关闭资源 session.close(); is.close(); } } ``` ### 可能存在的问题 1. **异常处理**:代码直接抛出 `IOException`,在实际应用中,这可能导致程序崩溃,应该在方法内部进行异常捕获和处理,增强程序的健壮性 [^4]。 2. **资源管理**:使用 `try-with-resources` 语句可以更优雅地管理资源,确保资源在使用后正确关闭,避免资源泄漏。当前代码手动关闭 `session` 和 `is`,如果在关闭之前发生异常,可能导致资源无法正确关闭 [^4]。 3. **事务管理**:`sqlSessionFactory.openSession()` 默认开启的是非自动提交事务的会话,对于查询操作,如果没有后续的增删改操作,应该使用 `sqlSessionFactory.openSession(true)` 开启自动提交事务的会话,避免不必要的事务管理 [^1]。 4. **性能问题**:每次执行查询都创建新的 `SqlSessionFactory` 会带来性能开销,`SqlSessionFactory` 是线程安全的,可以在应用启动时创建并全局共享 [^1]。 ### 优化方案 ```java import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; import java.util.List; // 假设的User类和UserMapper接口 class User { // 类属性和方法 } interface UserMapper { List<User> findAll(); } public class MyBatisTest { // 静态变量,全局共享SqlSessionFactory private static SqlSessionFactory sqlSessionFactory; static { try { // 读取配置文件 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); // 创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); // 通过SqlSessionBuilder对象解析mybatis-config.xml文件,构建一个SqlSessionFactory sqlSessionFactory = builder.build(is); } catch (IOException e) { e.printStackTrace(); } } public void test() { // 使用try-with-resources语句管理SqlSession try (SqlSession session = sqlSessionFactory.openSession(true)) { // 通过SqlSession获取Mapper实例 UserMapper userMapper = session.getMapper(UserMapper.class); // 获取数据 List<User> users = userMapper.findAll(); // 打印输出 for (User user : users) { System.out.println(user); } } } } ``` ### 相关使用说明 - `SqlSessionFactoryBuilder`:用于解析配置文件,构建 `SqlSessionFactory` 实例。通常在应用启动时使用一次,构建完成后可以丢弃该对象 [^5]。 - `SqlSessionFactory`:是创建 `SqlSession` 的工厂,是线程安全的,可以全局共享。一个应用通常只需要一个 `SqlSessionFactory` 实例 [^1]。 - `SqlSession`:是与数据库进行实际交互的关键对象,用于执行 SQL 语句、管理事务以及获取映射器(Mapper)。使用完后需要关闭,避免资源泄漏 [^1]。 - `Mapper` 接口代理对象:通过 `SqlSession.getMapper()` 方法获取,用于调用映射文件中定义的 SQL 语句。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值