基础:SqlSession的使用范围

来自Wikioe
跳到导航 跳到搜索


关于

SqlSession、SqlSessionFactory 与 SqlSessionFactoryBuilder:

  1. SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等(通过几个对象完成)。
  2. SqlSession是通过SqlSessionFactory创建;
  3. SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建(根据配置配置文件流)。

实例代码:

public class Mybatis_first {
	
	//会话工厂
	private SqlSessionFactory sqlSessionFactory;

	@Before
	public void createSqlSessionFactory() throws IOException {
		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

	public void testFindUserById() {
		// 数据库会话实例
		SqlSession sqlSession = null;
		try {
			// 创建数据库会话实例sqlSession
			sqlSession = sqlSessionFactory.openSession();
            
			// SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等
			// selectOne
			User user = sqlSession.selectOne("test.findUserById", 10);
			// selectList
			List<User> list = sqlSession.selectList("test.findUserByUsername", "张");
			// insert
			sqlSession.insert("test.insertUser", user);
			// update
			sqlSession.update("test.updateUser", user);
			// delete
			sqlSession.delete("test.deleteUserById",18);
			
			...
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (sqlSession != null) {
				sqlSession.close();
			}
		}
	}
}

SqlSessionFactoryBuilder

用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围,即方法体内局部变量

SqlSessionFactory

是一个接口,定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory;

SqlSession

是一个面向用户的接口, sqlSession中定义了数据库操作,默认使用DefaultSqlSession实现类;
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。
打开一个 SqlSession;使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭。如下:

	SqlSession session = sqlSessionFactory.openSession();
	try {
		// do work
	} finally {
  		session.close();
	}