MyBatis
1.Mybatis框架基础
1.1.Mybatis框架技术
Mybatis是一个数据持久层(ORM)框架。在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。
Mybatis支持定制化SQL、存储过程以及高级映射,避免了几乎所有的JDBC和手动设置参数以及获取结果集。
ORM(Object Relational Mapping)对象关系映射,就是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换为另一个形式。
1.2.Mybatis的优点
Mybatis的优点:
1)、基于SQL语法,简单易学。
2)、能了解底层组装过程。
3)、SQL语句封装在配置文件中,便于统一管理与维护,降低了程序的耦合度。
4)、程序调试方便。
1.3.Mybatis框架功能架构
Mybatis框架功能架构分为三层。
API接口层:提供给外部使用的接口API,开发人员通过接口API来操纵数据库。接口层接收到调用请求就会调用数据处理层来完成具体的数据处理。
数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。主要目的是根据调用的请求完成一次数据库操作。
基础支撑层:负责最基础的功能知识,包括连接管理、事务管理、配置加载和缓存处理,把这些共用的操作抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
1.4.Mybatis工作流程
Mybatis工作流程:
1)、加载配置并初始化
2)、接收调用请求
3)、处理操作请求
处理过程:
a.根据SQL的ID查找对应的MappedStatement对象。
b.解析MappedStatement,得到最终要执行的SQL和执行传入参数。
c.获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。
d.根据MappedStatement对象中的结果映射配置得到的执行结果进行转换处理,并得到最终的处理结果。
4)、返回处理结果
1.5.Mybatis基本要素、事务管理和数据源类型
Mybatis基本要素:SqlMapConfig.xml全局配置文件、Mapper.xml核心映射文件、SQLSessionFactory/SqlSession接口
Mybatis的两种事务管理类型:JDBC和MANAGED。
JDBC:直接全部使用JDBC的提交和回滚功能,依靠使用连接的数据源来管理事务的作用域。
MANAGED:从不提交、回滚和关闭连接,而是让窗口来管理事务的全部生命周期。
Mybatis的三种数据源类型:UNPOOLED、POOLED、JNDI。
UNPOOLED:在每次请求的时候简单的打开和关闭一个连接。
POOLED:缓存JDBC连接对象用于避免每次都要连接和生成连接实例而需要的验证时间。
JNDI:为了准备和Spring或应用服务一起使用,可以在外部也可以在内部配置,然后在JDNI上下文中引用。
1.6.Mybatis开发步骤
1)、新建maven项目,使用分层思想,配置项目package包。
2)、修改pom.xml,配置mybatis框架及开发框架。
3)、面向数据库编程,设计一个类与数据库表形成一一对应关系。
4)、设计一个数据库操作接口,定义crud操作。
5)、编写一个接口映射文件,完成接口方法映射,或在接口中使用注解配置sql。
6)、编写Mybatis全局配置文件,进行Mybatis运行环境参数设置。
7)、编写一个测试类,使用Mybatis实现数据操作。
2.Mybatis核心配置与DAO开发
2.1.Mybatis核心配置
Mybatis核心配置文件:SqlMapConfig.xml(全局配置文件)和mapper.xml(映射文件)。
SqlMapConfig.xml:SqlMapConfig的XML配置文件包含了影响Mybatis行为的设置和属性信息,文档结构如下:
configuration 配置
properties 属性–加载属性文件
settings 设置–调整运行参数
typeAliases 类型命名
typehandlers 类型处理器–完成JDBC类型和Java类型的转换
objectFactory 对象工厂
plugins 插件
Environments 环境–主要用于配置数据库相关,可以在里面配置多个environment
mappers 映射器
2.2.Mybatis核心接口和类
(1)每个MyBatis的应用程序都以一个 SqlSessionFactory对象的实例为核心;
(2)首先获取SqlSessionFactoryBuilder对象,可以根据XML配置文件或Configuration 类的实例构建该对象;
(3)然后获取SqlSessionFactory对象,该对象实例可以通过 SqlSessionFactoryBuilder对象来获得。
(4)有了SqlSessionFactory对象之后,就可以进而获取SqlSession实例,SqlSession 对象中完全包含以数据库为背景的所有执行SQL操作的方法。可以用该实例直接执行已映射的SQL语句。
2.3.Mybatis开发dao的方法
原始dao开发方法:程序员需要写dao接口和dao实现类。
mapper代理开发:程序员只需要mapper接口和mapper.xml映射文件,Mybatis可以自动生成mapper接口实现类代理对象。程 序员编写mapper接口需要遵循一些开发规范。
mapper代码开发规范:
1、在mapper.xml中namespace等于mapper接口地址。
2、mapper.java接口中的方法名和mapper.xml中的statement的id一致。
3、mapper.java接口中的方法输入参数类型和mapper.xml中的statement的parameterType指定的类型一致。
4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。
mapper代理开发方法流程:
1)、创建接口,方法名、参数、返回值与mapper.xml中映射配置保持一致。
2)、修改mapper.xml配置文件,namespace和接口地址一致。
3)、在SqlMapConfig.xml中加载mapper.xml。
4)、测试运行。
3.Mybatis逆行工程和动态SQL
3.1.Mybatis逆向工程
Mybatis逆向工程可以针对表单自动生成Mybatis执行所需要的代码(包括mapper.xml、mapper.java、po…)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码。
使用逆向工程步骤:
1)、新建一个java工程
2)、引入使用的jar包
3)、添加配置文件generatorConfig.xml
设置数据库驱动、配置、包名、文件保存位置、表名等。
a.设置数据库驱动、url、用户名和密码。
b.生成的pojo类的位置。
c.mapper映射文件生成位置。
d.mapper接口生成位置。
e.根据DB表生成pojo类。
f.调用Mybatis自动创建接口。
4)、定义GeneratorSqlMap类,调用Mybatis自动创建接口,在main方法执行自动创建。
3.2.动态SQL
动态SQL主要用于解决查询条件不确定的情况:在程序运行期间,根据提交的查询条件进行查询。可以通过Mybatis提供的各种标签对条件判断作出判断以实现动态拼接SQL语句。其中,Mybatis的动态SQL是基于OGNL表达式的。
使用动态SQL的原因:提供的查询条件不同,执行的SQL语句不同。若将每种可能的情况均逐一列出,就将出现大量的SQL语句。
Mybatis中用于实现动态SQL的元素主要有:
1)if语句
2)where
3)trim
4)set
5)foreach
6)choose(when,otherwise)
4.Mybatis关联查询与缓存配置
4.1.Mybatis查询
Mybatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap。
其中,resultType是直接表示返回类型的(对应着我们的model对象中的实体),resultMap则是对外部resultMap的引用。resultType和resultMap不能同时存在。
在Mybatis进行查询映射时,起始查询出来的每一个属性都是放在一个对应的map中,其中键是属性名,值则是其对应的值。
Mybatis查询类型有:一对一查询,一对一关联查询,一对多关联查询,多对多关联查询,分页查询。
4.2.延迟加载
在数据与对象进行mapping操作时,只有在真正使用到延迟加载对象时,才能进行mapping操作,以减少数据库查询开销,从而提升系统性能。但延迟加载也有缺点,即在按需加载时会多次连接数据库,会增加数据库的眼里。
4.3.延迟加载配置
Mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置。
lazyLoadingEnabled:true使用延迟加载,false禁用延迟加载,默认为false。
aggressiveLazyLoading:true启用时,当延迟加载开启访问对象中一个懒对象属性时,将完全加载这个对象的所有懒对象属性。false,当延迟加载时,按需加载对象属性(即访问对象中一个懒对象属性,不会加载对象中其他的懒对象属性),默认为true。
4.4.Mybatis查询缓存
Mybatis提供一级缓存和二级缓存。
其中,Mybatis默认支持一级缓存,不需要在配置文件中去配置。
Mybatis的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓存。
二级缓存:在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。
刷新缓存:在mapper的同一个namespace,如果有其他insert、update、delete操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。设置statement配置中flushCache=”true”属性,默认情况下为true即刷新缓存,为false则不会刷新缓存。
4.5.Mybatis整合第三方缓存框架
分布式缓存框架:不使用分布缓存,缓存的数据在各个服务单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。有ehcache、memcache、redis缓存框架。