SqlSession介绍

SqlSession是MyBatis的关键对象,是执行持久化操作的对象,类似于JDBC中的Connection。
它是应用程序与持久存储层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象。
SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行已映射的SQL语句。
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享,也是线程不安全的,绝对不能将SqlSession 实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Serlvet当中的HttpSession 对象中。使用完SqlSession之后关闭Session很重要,应该确保使用finally块来关闭它。

SqlSession 的常用方法如下:
(1)int insert(String statement)。插入方法,参数statement是在配置文件中定义的<insert.../>元素的id,返回执行SQL语句所影响的行数。
(2)int insert(String statement,Object parameter)。插入方法,参数statement是在配置文件中定义的<insert.../>元素的id,parameter是插入所需的参数,通常是对象或者Map,返回执行SQL语句所影响的行数。
(3)int update(String statement) 。更新方法,参数statement是在配置文件中定义的<update.../>元素的id,返回执行SQL语句所影响的行数。
(4)int update(String statement,Object parameter)。更新方法,参数statement是在配置文件中定义的<update.../>元素的id,parameter 是插入所需的参数,通常是对象或者Map,返回执行SQL语句所影响的行数。
(5)int delete(String statement) 。删除方法,参数statement是在配置文件中定义的<delete.../>元素的id。返回执行SQL 语句所影响的行数。
(6)int delete(String statement,Object parameter)。删除方法,参数statement 是在配置文件中定义的<delete.../>元素的id,parameter 是插入所需的参数,通常是对象或者Map,返回执行SQL语句所影响的行数。
(7)<T> T selectOne(String slatement)。查询方法,参数statement是在配置文件中定义的<select.../>元素的id,返回执行SQL语句查询结果的泛型对象,通常查询结果只有一条数据时才使用。
(8)<T> T selectOne(String statement,Object parameter)。查询方法,参数statement是在配置文件中定义的<select.../>元素的id,parameter是查询所需的参数,通常是对象或者Map,返回执行SQL语句查询结果的泛型对象,通常查询结具只有一条数据时才使用。
(9)<E> List<E> selectList(String statemenl)。查询方法,参数是在配置文件中定义的<select.../>素的id,返回执行SQL话句查询结果的泛型对象的集合。
(10)<E> List<E> selectList(String statement,Object parameter)。杳洵方法,参数statement是在配置文件中定义的<select../>元素的id,parameter 是查询所需的参数,通常是对象或者Map,返回执行SQL语句查询结果的泛型对象的集合。
(11)<E> List<E> selectList(String statement,Object parameter,RowBounds rowBounds)。查询方法,参数statement是在配置文件中定义的<select.../>元素的id,parameter是查询所需的参数,通常是对象或者Map,RowBounds对象用于分页,它的两个属性: offset指查询的当前页数; limit指当前页显示多少条数据。返回执行SQL语句查询结果的泛型对象的集合。
(12)<K,V> Map<K,V> selectMap(String statement,String mapKey) 。查询方法,参数statement是在配置文件中定义的<select.../>元素的id,mapKey是返回数据的其中一个列名,执行SQL语句查询结果将会被封装成一个Map集合返回,key就是参数mapKey传入的列名,value 是封装的对象。
(13)<K,V> Map<K,V> selectMap(String statement,0bject parameler,Sting mapKey)。查询方法,参数statement是在配置文件中定义的<select.../>元素的id,parameter是查询所需的参数,通常是对象或者Map,mapKey 是返回数据的其中一个列名,执行SQL语句查询结果将会被封装成一个Map集合返回,key就是参数mapKey传入的列名,value是封装的对象。
(14)<K,V> Map<K,V>selectMap(Sting statement,Object parameter,Sting mapKey,RowBounds rowBounds)。查询方法,参数statement 是在配置文件中定义的<select.../>元素的id,parameter 是否询所需的参数,通常是对象或者Map,mapKey 是返回数据的其中一个列名,RowBounds 对象用于分页。执行SQL 语句查询结果将会被封装成一个Map集合返回,key就是参数mapKey传入的列名,value 是封装的对象。
(15)void select(String statement,ResultHandler handler)。查询方法,参数statement是在配置文件中定义的<select../>元素的id,ResultHandler对象用来处理查询返回的复杂结果集,通常用于多表查询。
(16)void select(String statement,Object parameter,ResultHander handler)。查询方法,参数statement是在配置文件中定义的<select../>元素的id,parameter 是查询所需的参数,通常是对象或者Map, ResultHandler对象用来处理查询返回的复杂结果集,通常用于多表查询。
(17)void select(String statement,Object parameter,RowBounds rowBounds,ResultHandrhandler)。查询方法,参数statement是在配置文件中定义的<selec.../>元素的id,是查询所需的参数,通常是对象或者Map,RowBounds 对象用于分页,parameter
ResultHandler对象用来处理查询返回的复杂结果集,通常用于多表查询。
(18)void commit()。提交事务。
(19)void rollback()。回滚事务。
(20)void close()。关闭SqlSession对象。
(21)Connection getConnection()。获得JDBC的数据库连接对象。
(22)<T> T getMapper(Class<T> type)。返回mapper接口的代理对象,该对象关联了SqlSession对象,开发者可以通过该对象直接调用方法操作数据库,参数type是Mapper的接口类型。Mybatis官方手册建议通过mapper对象访问MyBatis。

<think>嗯,用户想了解MyBatis中SqlSession的openSession方法的功能和用法。首先,我需要回忆一下MyBatis的核心组件,SqlSession确实是关键接口,负责数据库交互。openSession方法应该是用来创建SqlSession实例的,对吧? 记得SqlSessionFactory的openSession方法有几个重载版本,不同的参数配置会影响事务管理和连接池的行为。比如,是否自动提交事务,或者指定Executor类型。用户可能想知道这些参数的具体作用,以及在不同场景下如何选择。 然后,使用场景方面,手动控制事务的时候应该用需要显式提交的openSession,而自动提交可能适合简单的操作。批处理可能需要BatchExecutor,查询则用默认的SimpleExecutor。这些都要解释清楚。 还要注意,用户提到的引用中有提到commit的重要性,所以得强调如果不commit,数据可能不会保存,尤其是在非自动提交模式下。可能还要提到线程安全的问题,SqlSession不是线程安全的,应该在每次请求中创建,用完后关闭。 另外,示例代码会有帮助,比如展示如何通过SqlSessionFactory获取不同配置的SqlSession实例。比如openSession(true)是自动提交,false则需要手动commit。Executor类型的设置如何影响批量操作。 可能用户在使用过程中遇到没提交事务的问题,所以需要提醒他们检查是否调用了commit,或者是否正确设置了自动提交。同时,结合引用中的内容,比如引用4提到commit的必要性,可以引用过来作为参考。 还要注意回答的结构,先介绍功能,再详细参数,使用场景,最后示例代码和注意事项。确保符合用户要求的清晰结构,分点说明,帮助用户逐步理解。</think>### MyBatis SqlSession的`openSession`方法详解 #### 功能 `SqlSession.openSession()` 是 MyBatis 中用于创建新 `SqlSession` 实例的核心方法,由 `SqlSessionFactory` 提供。`SqlSession` 是 MyBatis 与数据库交互的入口,封装了以下功能: 1. **执行 SQL 语句**(查询、更新、存储过程等); 2. **管理事务**(提交、回滚); 3. **获取 Mapper 接口的代理对象**(通过 `getMapper()` 方法)[^2][^3]。 #### 方法重载与参数 `openSession()` 提供多种重载方法,通过参数控制事务和执行器行为: 1. **`boolean autoCommit`** 默认 `openSession(false)`,需手动调用 `commit()` 提交事务;若设为 `true`,则每条 SQL 自动提交[^4]。 ```java // 手动提交模式(推荐) SqlSession session = sqlSessionFactory.openSession(); try { session.insert("insertUser", user); session.commit(); // 显式提交 } finally { session.close(); } // 自动提交模式(简单操作) SqlSession autoSession = sqlSessionFactory.openSession(true); autoSession.update("updateUser", user); // 无需commit autoSession.close(); ``` 2. **`ExecutorType executorType`** 指定执行器类型,影响 SQL 执行方式: - **`ExecutorType.SIMPLE`**(默认):逐条执行 SQL; - **`ExecutorType.REUSE`**:重用预处理语句; - **`ExecutorType.BATCH`**:批量操作优化。 ```java // 批量插入(提升性能) SqlSession batchSession = sqlSessionFactory.openSession(ExecutorType.BATCH); try { UserMapper mapper = batchSession.getMapper(UserMapper.class); for (User user : userList) { mapper.insert(user); } batchSession.commit(); // 批量提交 } finally { batchSession.close(); } ``` #### 使用场景 1. **需要事务控制的操作** 如转账操作需保证原子性,使用默认手动提交模式: ```java SqlSession session = sqlSessionFactory.openSession(); try { AccountMapper mapper = session.getMapper(AccountMapper.class); mapper.deduct(accountA, 100); mapper.add(accountB, 100); session.commit(); // 全部成功才提交 } catch (Exception e) { session.rollback(); // 失败则回滚 } ``` 2. **高性能批量处理** 使用 `ExecutorType.BATCH` 减少数据库交互次数: ```java SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH); try { LogMapper mapper = session.getMapper(LogMapper.class); for (Log log : logList) { mapper.insert(log); // 缓存SQL,最后批量执行 } session.commit(); } finally { session.close(); } ``` 3. **只读查询优化** 若仅执行查询,可关闭自动提交以复用连接: ```java SqlSession session = sqlSessionFactory.openSession(); try { User user = session.selectOne("getUserById", 1); // 无需commit } finally { session.close(); } ``` #### 注意事项 1. **资源释放** `SqlSession` 非线程安全且需手动关闭,推荐在 `try-finally` 块中调用 `close()`[^3]。 2. **事务边界** 避免长事务占用连接,尽量在业务逻辑完成后立即提交或回滚。 3. **连接池配置** `openSession()` 行为受 MyBatis 数据源配置影响,如连接超时时间、池大小等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值