Mybatis 核心组件
概念—持久层
持久层 将业务数据保存到磁盘(软盘已经消失,目前使用的是硬盘,也属于磁盘的一种),只要不存在物理损坏,数据就会持久保存。
Mybatis特点
优点:巨大的磁盘空间,相对低廉的价格
缺点:相比较于内存来说,速度较慢。
成功处:不屏蔽SQL语句+使用映射机制+提供Mapper编程
Mybatis核心组件
- SqlSessionFactoryBuilder:构造器,根据配置或者代码生成SqlSessionFactory,采用分步构建的Builder模式
- SqlSessionFactory:工厂接口,依靠其生成SqlSession,使用工厂模式
- SqlSession:会话,一个既可以发送SQL执行返回结果,也可以获取Mapper的接口[1]。
- Sql Mapper:映射器,Mybatis新设计存在的组件,由一个Java接口和XML文件/注解构成,需要给出相应的SQL以及映射规则。负责发送SQL去执行并返回结果[2]。
[1]:现阶段SqlSession一般会在逻辑代码里消失,使用Mybatis提供的Sql Mapper接口编程技术,提高代码可读性及维护性。
[2]无论是映射器还是SqlSeeion都可以发送SQL到数据库执行。
SqlSessionFactory —工厂接口
org.apache.ibatis.session.Configuration:MyBatis提供的构造器SqlSessionFactoryBuilder提供的类,采用Build模式。SqlFactory只是一个接口,Mybatis有DefaultSqlSessionFactory及SqlSessionManager两个实现。一般由DefaultSqlSessionFactory去实现。SqlSessionManager使用在多线程环境,具体实现还是依靠DefaultSqlSessionFactory。
责任单一,故一般使用单例模式
使用XML构建SqlSessiionFactory
XML文件:
- 基础配置文件:通常只有一个,主要配置一些最基本的上下文参数以及运行环境;
- 映射文件:配置映射关系,SQL,参数等信息;
代码笔记:原始的Mybatis XML中,有标签:‘typeAliases’ ‘enviroments’ ‘mappers’,往下有二级标签(去掉s)
//标签<typeAliases>设置别名,在XML下文中替代全限定名
<typeAliases>
<typeAliase alias = "xx" type = "xx.xx.xx"/>
</typeAliases>
//标签<enviroments>定义元素
<enviroments>
<enviroment></enviroment>
</enviroments>
//标签<mappers>引入Mapper接口的映射器
<mappers>
<mapper></mapper>
<mappers>
SqlSession
作用:类似 一个 JDBC中的Connection对象,代表一个连接资源的启用。
1.获取Mapper接口
2.发送SQL给数据库
3.控制数据库事务
//创建SqlSession,使用后记得释放
SqlSession sqlSession = SqlSessionFactory.openSession();
映射器
组成成分:一个接口+对应的XML文件/注解组成
作用:1.描述映射规则
2.提供SQL语句,并可以配置 SQL参数类型、返回类型、缓存刷新等信息
3、配置缓存
4、提供动态SQL
将SQL查询到的结果映射为一个POJO。或者将POJO的数据插入到数据库中,并定义一些关于缓存等的重要内容。
用XML实现映射器
//映射器接口
public interface RoleMapper{
public Role getRole(Long id);
}
//在XML方式创建SqlSession(创建连接)的配置文件中:
<mapper resource = "xxx/xxx/xxx/xxx/RoleMapper.xml"/>
//这里使用的路径是全限定名
//XML创建映射器
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTO Mapper 3.0//EN"
"http://mybatis.org/dtd/mybaits-3-mapper.dtd">
<mapper namespace="xxx.xxx.xxx.xxx.RoleMapper">
<selsct id="getRole" parameterType="long" resultType="role">
select id,role_name as rolename,note from t_role where id =#{id}
</select>
</mapper>
上面XML创建映射器的XML代码片段中,namespace对应接口全限定名,Mybatis通过其找到接口。
Select是查询语句id和接口对应,paramterTtype对应传递参数类型,resultType则是返回值类型,#{}代表传递的参数[1]。
Mybatis在默认情况下提供自动映射,只要SQL返回的列名能和POJO对应即可。
使用注解实现映射器
使用注解实现映射器如下:
public interface RoleMapper2{
@Select(“select id,role_name as rolename,note from t_role where id =#{id}”)
public Role getRole(Long id);
}
两者在简单SQL上并无区别,当SQL复杂程度上升时,注解的当时便不利于代码维护及可读性。
当两者都存在时,XML会覆盖注解。
//使用Mapper接口,在后期可以使有@Autowride取代实例化
RoleMapper roleMapeer = sqlSession.getMapper(RoleMapper.class)
Role role = roleMapper.getRole(1L)
对比获取Mapper以及SqlSession(Mybatis的前身iBatis留下的方式),获取Mapper的优点在于:
1.可以消除功能性代码,提高可读性,且使用获取Mapper的方法,是面向对象的语言,更能体现业务逻辑
2.IDE及Eclipse会提示错误
生命周期
由于多用于互联网应用,为避免严重的多线程并发问题,需要掌握生命周期
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 只用于创建SqlSessionFactory, 只能存在于创建SqlSessionFactory的方法中,不长期存在。
SqlSessionFactory
可以认为是一个数据库连接池,一般而言,SqlSessionFactory的生命周期等同于MyBatis的生命周期,同时,为防止多个SqlSessionFactory导致数据库链接资源被消耗光,一般作为单例。
SqlSession
相当于数据库连接(Connection对象),可以在一个事务里执行多条Sql,然后commit/rollback,所以应该存活在一个业务请求中,处理完整个请求,就应该关闭连接,释放资源
Mapper
由SqlSession创建,所以最大生命周期至多和SqlSession保持一致。应该在一个请求中,一旦处理完了相关业务,就应该废弃。
仅用于学习整理,如有建议与意见,欢迎提出,亦可发送至邮箱1715921342@qq.com进行联系