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

来自Wikioe
跳到导航 跳到搜索
(建立内容为“category:Mybatis __TOC__ == 关于 == SqlSession、SqlSessionFactory 与 SqlSessionFactoryBuilder: # SqlSession中封装了对数据库的操作,如:…”的新页面)
 
(清空全部内容)
标签清空
第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:37的版本