一、SqlSession的创建和销毁
SqlSession是MyBatis与数据库进行交互的核心组件,为了确保每个线程都有自己的SqlSession,MyBatis官方建议使用工厂模式创建SqlSession实例,并且在完成数据操作之后关闭SqlSession。下面是SqlSession的创建和销毁示例:
// 创建SqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 创建SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); try { // 执行数据操作,例如查询语句 ListuserList = sqlSession.selectList("org.example.mapper.UserMapper.selectByExample", example); // 提交事务 sqlSession.commit(); } catch (Exception e) { // 回滚事务 sqlSession.rollback(); } finally { // 关闭SqlSession sqlSession.close(); }
二、SqlSession的使用和管理
SqlSession的使用和管理是MyBatis应用程序中的重要任务,以下是SqlSession的使用和管理的几点建议:
1. 线程范围SqlSession
为了确保每个线程都有自己的SqlSession,可以使用ThreadLocal对象保存SqlSession实例。以下是线程范围SqlSession的示例代码:
public class SqlSessionManager { private static final ThreadLocalsqlSessionThreadLocal = new ThreadLocal (); private SqlSessionManager() {} public static SqlSession getSqlSession() { if (sqlSessionThreadLocal.get() == null) { sqlSessionThreadLocal.set(SqlSessionFactoryHolder.getSqlSessionFactory().openSession()); } return sqlSessionThreadLocal.get(); } public static void closeSqlSession() { SqlSession sqlSession = sqlSessionThreadLocal.get(); if (sqlSession != null) { sqlSessionThreadLocal.remove(); sqlSession.close(); } } }
2. SqlSession管理器
为了方便管理SqlSession,可以创建一个SqlSession管理器,以下是SqlSession管理器的示例代码:
public class SqlSessionManager { private final SqlSessionFactory sqlSessionFactory; private SqlSession sqlSession; public SqlSessionManager(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } public SqlSession getSqlSession() { if (sqlSession == null) { sqlSession = sqlSessionFactory.openSession(); } return sqlSession; } public void commit() { sqlSession.commit(); } public void rollback() { sqlSession.rollback(); } public void close() { if (sqlSession != null) { sqlSession.close(); sqlSession = null; } } }
3. SqlSession使用范例
以下是SqlSession使用范例:
SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); ListuserList = userMapper.selectAll(); sqlSession.close();
三、SqlSession的作用域
SqlSession有三种作用域:SESSION、STATEMENT和TRANSACTION,分别对应SqlSession的生命周期、SQL语句的生命周期和事务的生命周期。以下是SqlSession的作用域示例代码:
1. SESSION作用域
SESSION作用域是SqlSession的默认作用域,它表示SqlSession的生命周期,即从开始执行操作到关闭SqlSession为止。在SESSION作用域内,多次调用相同的SQL语句会共享Statement对象,这样可以提高性能。
// SqlSession的默认作用域是SESSION SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper1 = sqlSession.getMapper(UserMapper.class); User user1 = userMapper1.selectByPrimaryKey(1); UserMapper userMapper2 = sqlSession.getMapper(UserMapper.class); User user2 = userMapper2.selectByPrimaryKey(1); Assert.assertEquals(user1, user2); sqlSession.close();
2. STATEMENT作用域
STATEMENT作用域表示SQL语句的生命周期,即执行SQL语句的时间。在STATEMENT作用域内,每次执行SQL语句都会创建新的Statement对象。
SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.selectByPrimaryKey(1); User user1 = userMapper.selectByPrimaryKey(1); Assert.assertNotEquals(user, user1); sqlSession.close();
3. TRANSACTION作用域
TRANSACTION作用域表示事务的生命周期,即从开始事务到提交或回滚事务为止。在TRANSACTION作用域内,相同的SQL语句会共享PreparedStatement对象,这样可以提高性能。
SqlSession sqlSession = sqlSessionFactory.openSession(); try { // 开始事务 sqlSession.getConnection().setAutoCommit(false); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.selectByPrimaryKey(1); User user1 = userMapper.selectByPrimaryKey(1); Assert.assertEquals(user, user1); // 提交事务 sqlSession.commit(); } catch (Exception e) { // 回滚事务 sqlSession.rollback(); } finally { sqlSession.close(); }