“基础:SqlSession的使用范围”的版本间差异

来自Wikioe
跳到导航 跳到搜索
(清空全部内容)
标签清空
无编辑摘要
 
第1行: 第1行:
[[category:Mybatis]]


__TOC__
== 关于 ==
SqlSession、SqlSessionFactory 与 SqlSessionFactoryBuilder:
# SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等(通过几个对象完成)。
# SqlSession是通过SqlSessionFactory创建;
# SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建(根据配置配置文件流)。
实例代码:
<syntaxhighlight lang="java">
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();
}
}
}
}
</syntaxhighlight>
== SqlSessionFactoryBuilder ==
用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,'''最佳使用范围是方法范围,即方法体内局部变量''';
== SqlSessionFactory ==
是一个接口,定义了openSession的不同重载方法,SqlSessionFactory的'''最佳使用范围是整个应用运行期间''',一旦创建后可以重复使用,通常以'''单例模式'''管理SqlSessionFactory;
== SqlSession ==
是一个面向用户的接口, sqlSession中定义了数据库操作,默认使用'''DefaultSqlSession'''实现类;<br/>
每个线程都应该有它自己的SqlSession实例。SqlSession的实例'''不能共享使用,它也是线程不安全的'''。因此'''最佳的范围是请求或方法范围'''。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。<br/>
打开一个 SqlSession;'''使用完毕就要关闭它'''。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭。如下:
<syntaxhighlight lang="java">
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
  session.close();
}
</syntaxhighlight>

2020年10月10日 (六) 00:39的最新版本


关于

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();
	}