一、SqlSessionFactory
1、类接口关系
SqlSessionFactory是SqlSession接口对象的生成工厂,而SqlSessionFactory接口对象又由SqlSessionFactoryBuilder采用建造者模式借助Configuration配置类来生成。
SqlSessionFactory的生成SqlSessionFactory有两个实现类,分别是DefaultSessionFactory和SqlSessionManager。SqlSessionManager适合于在多线程情况下使用。
2、采用xml配置文件生成SqlSessionFactory接口对象
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 属性配置,可以给系统配置一些运行参数 -->
<properties>
<property name="database.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="database.url" value="jdbc:mysql://localhost:3306/wz_db" />
<property name="database.username" value="root" />
<property name="database.password" value="123456" />
</properties>
<!-- mybatis底层运行参数设置,如延迟加载 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"></setting>
</settings>
<!-- 别名 -->
<typeAliases>
<typeAlias alias="role" type="com.learn.mybatis.chapter03.project.Role" />
<typeAlias alias="user" type="com.learn.mybatis.chapter04.typehandler.User"/>
</typeAliases>
<!-- 类型转换处理器,将数据库数据类型和java类型互相转换 -->
<typeHandlers>
<package name="com.learn.mybatis.chapter04.typehandler" />
</typeHandlers>
<!-- 数据库环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${database.driver}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
</dataSource>
</environment>
</environments>
<!-- 映射文件 -->
<mappers>
<mapper resource="com/learn/mybatis/chapter03/project/RoleMapper.xml"/>
<mapper resource="com/learn/mybatis/chapter04/typehandler/UserMapper.xml" />
</mappers>
</configuration>
读取配置文件并生成SqlSessionFactory接口对象:
private static final String RESOURCE = "mybatis-config.xml";
private static SqlSessionFactory factory;//单例模式
InputStream iStream = null;
try {
iStream = Resources.getResourceAsStream(RESOURCE);
factory = new SqlSessionFactoryBuilder().build(iStream);
} catch (IOException e) {
e.printStackTrace();
}
二、SqlSession接口
1、类接口关系
SqlSession接口对象类似JDBC中的Connection对象,代表着一个连接资源的启用,它的主要功能如下:
(1)、获取Mapper接口对象: RoleMapper mapper = sqlSession.getMapper(RoleMapper.class);
(2)、发送SQL给数据库。
(3)、控制数据库事务
SqlSession接口有两个实现类,分别是DefaultSqlSession和SqlSessionManager
2、获取SqlSession接口对象
//定义SqlSession接口对象
SqlSession sqlSession = null;
try{
//打开SqlSession会话
sqlSession = SqlSessionFactory.openSession();
//do something
sqlSeesion.commit(); //提交事务
}catch(Exception ex){
sqlSession.rollback(); //回滚事务
}finally{
//在finally语句中确保资源被顺利关闭
if(sqlSession != null){
sqlSession.close();
}
}
三、Mapper(映射器)
1、组成和功能
映射器由一个接口和对应xml配置文件或则注解组成,其主要功能如下:
(1)通过resultMap描述映射规则。
(2)提供SQL语句,并可以配置SQL参数类型、返回类型、缓存刷新等信息。
(3)配置缓存。
(4)提供动态SQL。
总结,它的主要功能就是将SQL查询到的结果映射为POJO对象,或者将POJO数据插入到数据库中,并定义一些关于缓存等的重要内容。
2、通过xml配置文件配置映射器
在SqlSessionFactory的配置文件中有这样一个属性就是引入映射器的配置文件
<mappers>
<mapper resource="com/learn/mybatis/chapter03/project/RoleMapper.xml"/>
<mapper resource="com/learn/mybatis/chapter04/typehandler/UserMapper.xml" />
</mappers>
映射器的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.learn.mybatis.chapter03.project.RoleMapper">
<insert id="insertRole" parameterType="role">
insert into t_role(role_name, note) values(#{roleName}, #{note})
</insert>
<delete id="deleteRole" parameterType="long">
delete from t_role where id=#{id}
</delete>
<update id="updateRole" parameterType="role">
update t_role set role_name=#{roleName}, note=#{note} where id=#{id}
</update>
<select id="getRole" parameterType="long" resultType="role">
select id, role_name as roleName, note from t_role where id = #{id}
</select>
<select id="getAllRoles" resultType="role">
select id, role_name as roleName, note from t_role
</select>
<select id="findRoles" parameterType="string" resultType="role">
select id, role_name as roleName, note from t_role where role_name like concat('%', #{roleName}, '%')
</select>
</mapper>
四、生命周期
1、SqlSessionFactoryBuilder
它的作用就是创建SqlSessionFactory,所以它只能存在于创建SqlSessionFactory的方法中而不能让其长期存在。
2、SqlSessionFactory
SqlSessionFactory可以被认为是一个数据库连接池,它的作用是创建SqlSession接口对象。MyBatis的本质是Java对数据库的操作所以SqlSessionFactory的生命周期存在于整个MyBatis的应用之中,进而可以认为SqlSessionFactory的生命周期等同于MyBatis的应用周期。
3、SqlSession
SqlSession相当于一个数据库连接(Connection对象),它存活一次完整的业务请求中,处理完请求后应该关闭这条连接,归还给SqlSessionFactory,避免数据库连接资源被耗尽。
4、Mapper
Mapper由SqlSession接口对象所创建,所以它的生命周期小于等于SqlSession的生命周期。
网友评论