SqlSessionFactoryBuilder
SqlSessionFactory
SqlSession
生命周期
该类用于创建SqlSessionFactory的实例,可以被实例化、使用和丢弃,在创建完SqlSessionFactory实例后,该对象实际上就可以被丢弃了。
SqlSessionFactoryBuilder重载了久个builder()方法,允许利用不同的资源来创建SqlSessionFactory实例:
public SqlSessionFactory build(Reader reader)
public SqlSessionFactory build(Reader reader, String environment)
public SqlSessionFactory build(Reader reader, Properties properties)
public SqlSessionFactory build(Reader reader, String environment, Properties properties)
public SqlSessionFactory build(InputStream inputStream)
public SqlSessionFactory build(InputStream inputStream, String environment)
public SqlSessionFactory build(InputStream inputStream, Properties properties)
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)
public SqlSessionFactory build(Configuration config)
其中
public SqlSessionFactory build(Reader reader)
和
public SqlSessionFactory build(InputStream inputStream)
最为常用,将mybatis核心配置文件已流对象的形式传递给框架后,根据配置文件中的配置去创建持久层环境。
其中environment和priperties参数是可选的,environment对应于创建那种环境,若制定该参数,则会覆盖配置文件中的
default="mysql_environment">
default属性,同理,peoperties对应配置文件中的各种配置信息,其优先级也是高于配置文件的。
每一个Mybatis的应用程序都以一个SqlSessionFactory的实例为核心,通过该类可用回去操作数据库的核心对象SqlSession,SqlSessionFactory对象的实例由SqlSessionFactoryBuilder创建,创建SqlSessionFactory对象最常用的方式是用配置文件。
一个简单可用的Mybatis核心配置文件如下:
<configuration>
<environments default="mysql_environment">
<environment id="mysql_environment">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="zhangdd" />
<property name="password" value="zd1991.." />
dataSource>
environment>
environments>
configuration>
也可用Mybatis中的API来代替配置文件创建SqlSessionFactory实例:
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
注意用这种方式创建SqlSessionFactory实例的时候对应的实体映射类的定义(后面详细介绍)。
SqlSession由SqlSessionFactory创建,SqlSession包含完全以数据库为背景的所有执行SQL操作的方法,可以用SqlSession对象来执行所有已映射的sql语句。
例如:
Mappper.xml
<mapper namespace="com.mybatis.test.entity.Pet">
<select id="selectPetByName" parameterType="string" resultType="hashmap">
select
<include refid="column"/>
from pet
where name = #{name}
select>
mapper>
获取session并执行sql语句:
@Test
public void getOnePet(){
session = sessionFactory.openSession();
Pet pet = session.selectOne("com.mybatis.test.entity.Pet.selectPetByName", "XiaoJian");
System.out.println(pet);
session.close();
}
SqlSession中包含大量的sql操作方法,利用参数来避免JDBC对结果集操作的冗余代码,与JDBC相比较方便很多。
SqlSessionFactoryBuilder:
该类用来创建SqlSessionFactory对象,当SqlSessionFactory对象被创建后,该对象也就没有存在的必要了。
SqlSessionFactory:
该对象应该在你的应用执行期间一直存在,由于要从该对象中获取SqlSession对象,这样的操作会相当频繁,同时创建SqlSessionFactory对象是一件一起消耗资源的事,因此,该对象的生命周期应该为应用返回,即与当前应用具有相同生命周期。
SqlSession:
每个线程都应该有自己的SqlSession实例,SqlSession实例不能被共享,是线程不安全的,因此最佳的范围是请求或方法范围,