一、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 {
// 执行数据操作,例如查询语句
List<user> userList = 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 ThreadLocal<SqlSession> sqlSessionThreadLocal = new ThreadLocal<SqlSession>();
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);
List<user> userList = 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();
}