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

来自Wikioe
跳到导航 跳到搜索
(建立内容为“category:Mybatis __TOC__ == 关于 == SqlSession、SqlSessionFactory 与 SqlSessionFactoryBuilder: # SqlSession中封装了对数据库的操作,如:…”的新页面)
 
无编辑摘要
 
(未显示同一用户的1个中间版本)
第4行: 第4行:
== 关于 ==
== 关于 ==
SqlSession、SqlSessionFactory 与 SqlSessionFactoryBuilder:
SqlSession、SqlSessionFactory 与 SqlSessionFactoryBuilder:
# SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。
# SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等(通过几个对象完成)。
# SqlSession是通过SqlSessionFactory创建;
# SqlSession是通过SqlSessionFactory创建;
# SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建(根据配置配置文件流)。
# SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建(根据配置配置文件流)。
第57行: 第57行:
}
}
</syntaxhighlight>
</syntaxhighlight>
=== SqlSessionFactoryBuilder ===
== SqlSessionFactoryBuilder ==
用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,'''最佳使用范围是方法范围,即方法体内局部变量''';
用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,'''最佳使用范围是方法范围,即方法体内局部变量''';
=== SqlSessionFactory ===
== SqlSessionFactory ==
是一个接口,定义了openSession的不同重载方法,SqlSessionFactory的'''最佳使用范围是整个应用运行期间''',一旦创建后可以重复使用,通常以'''单例模式'''管理SqlSessionFactory;
是一个接口,定义了openSession的不同重载方法,SqlSessionFactory的'''最佳使用范围是整个应用运行期间''',一旦创建后可以重复使用,通常以'''单例模式'''管理SqlSessionFactory;
=== SqlSession ===
== SqlSession ==
是一个面向用户的接口, sqlSession中定义了数据库操作,默认使用'''DefaultSqlSession'''实现类;<br/>
是一个面向用户的接口, sqlSession中定义了数据库操作,默认使用'''DefaultSqlSession'''实现类;<br/>
每个线程都应该有它自己的SqlSession实例。SqlSession的实例'''不能共享使用,它也是线程不安全的'''。因此'''最佳的范围是请求或方法范围'''。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。<br/>
每个线程都应该有它自己的SqlSession实例。SqlSession的实例'''不能共享使用,它也是线程不安全的'''。因此'''最佳的范围是请求或方法范围'''。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。<br/>

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