Mybatis之SqlSession简析

在 MyBatis 中,SqlSession 是其核心接口。在 MyBatis 中有两个实现类,DefaultSqlSession 和 SqlSessionManager。

SqlSession是Mybatis的一个核心类,简单点就是执行sql的,Mybatis的一级缓存应该就在这个级别上的,实际上一级缓存在Executor中实现的,下个文章介绍。

先看看SqlSession中的方法

 


DefaultSqlSession 是单线程使用的,而 SqlSessionManager 在多线程环境下使用。SqlSession 的作用类似于一个 JDBC 中的 Connection 对象,代表着一个连接资源的启用。具体而言,它的作用有 3 个:

  • 获取 Mapper 接口。
  • 发送 SQL 给数据库。
  • 控制数据库事务。


先来掌握它的创建方法,有了 SqlSessionFactory 创建的 SqlSession 就十分简单了,如下所示。

SqlSession sqlSession = SqlSessionFactory.openSession();

注意,SqlSession 只是一个门面接口,它有很多方法,可以直接发送 SQL。它就好像一家软件公司的商务人员,是一个门面,而实际干活的是软件工程师。在 MyBatis 中,真正干活的是 Executor,我们会在底层看到它。

SqlSession 控制数据库事务的方法,如下所示。

//定义 SqlSession
SqlSession sqlSession = null;
try {
    // 打开 SqlSession 会话
    sqlSession = SqlSessionFactory.openSession();
    // some code...
    sqlSession.commit();    // 提交事务
} catch (IOException e) {
    sqlSession.rollback();  // 回滚事务
}finally{
    // 在 finally 语句中确保资源被顺利关闭
    if(sqlSession != null){
        sqlSession.close();
    }
}
这里使用 commit 方法提交事务,或者使用 rollback 方法回滚事务。因为它代表着一个数据库的连接资源,使用后要及时关闭它,如果不关闭,那么数据库的连接资源就会很快被耗费光,整个系统就会陷入瘫痪状态,所以用 finally 语句保证其顺利关闭。
### MyBatisSqlSession 的使用方法 #### 什么是 SqlSession? `SqlSession` 是 MyBatis 提供的一个核心接口,用于与数据库进行交互。它封装了执行 SQL 语句、管理事务以及获取 Mapper 接口的功能[^1]。 #### 如何创建 SqlSession 实例? 通常情况下,通过 `SqlSessionFactory` 创建 `SqlSession` 实例。以下是常见的两种方式: 1. **手动创建 SqlSession** 如果不依赖任何框架(如 Spring),可以直接通过配置文件加载并创建实例。 2. **基于框架集成的方式** 当使用 MyBatis 和 Spring 集成时,推荐利用声明式事务处理机制来管理 `SqlSession` 生命周期,而不是手动操作[^3]。 #### 基本用法示例 下面是一个完整的例子展示如何使用 `SqlSession` 执行 CRUD 操作。 ```java import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; public class MyBatisExample { private final SqlSessionFactory sqlSessionFactory; public MyBatisExample(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } public void insertRecord() { try (SqlSession session = sqlSessionFactory.openSession()) { // 自动关闭资源 User user = new User(); user.setName("John Doe"); user.setAge(30); int result = session.insert("com.example.mapper.UserMapper.insertUser", user); if (result > 0) { System.out.println("Insert successful!"); } session.commit(); // 显式提交事务 } catch (Exception e) { e.printStackTrace(); } } public List<User> selectAllUsers() { try (SqlSession session = sqlSessionFactory.openSession()) { return session.selectList("com.example.mapper.UserMapper.selectAllUsers"); } } } ``` 上述代码展示了两个主要的操作: - 插入记录并通过显式调用 `commit()` 方法完成事务提交。 - 查询所有用户数据,并返回结果列表。 #### 关键方法说明 | 方法名 | 功能描述 | |--------|----------| | `insert(String statement, Object parameter)` | 执行插入操作 | | `update(String statement, Object parameter)` | 更新指定的数据 | | `delete(String statement, Object parameter)` | 删除符合条件的数据 | | `selectOne(String statement, Object parameter)` | 返回单条查询结果 | | `selectList(String statement, Object parameter)` | 获取多条记录的结果集 | | `getMapper(Class<T> type)` | 获得绑定的 Mapper 对象 | 这些方法均可以通过 `SqlSession` 来访问和调用[^4]。 #### 注意事项 - 在实际开发中,建议优先采用声明式的事务管理工具(例如 Spring AOP 或者 MyBatis-Spring),从而减少对 `SqlSession` 的直接控制需求。 - 确保每次打开的 `SqlSession` 都能正确释放资源,防止内存泄漏问题发生。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值