MyBatis的基本信息
MyBatis本是apache的一个开源项目iBatis,后在2010年迁移到了googlecode,并且改名为MyBatis。后面迁移到Github。MyBatis是一个基于Java的数据持久层(ORM)框架。把实体类和SQL语句之间建立了映射关系,是一种半自动化的ORM实现。ORM对象关系映射,是一种数据持久化技术,O指的是Object,对象,就是Java里的实体类;R指的是Relation,关系,关系型数据库;M指的是映射,提供一种机制,实现映射。
为什么不使用全自动化?
半自动化:需要写一些SQL语句,才能完成指定功能。全自动化:不需要使用sql语句,直接操作实体类对象,就可以对应的操作数据库表里的数据。全自动化在进行单表的增删改查操作时,具有更高的效率。但是,在进行多表查询的时候,分页查询的时候,全自动在进行修改的时候反而很复杂,效率更低。而MyBatis支持定制化SQL,存储过程以及高级映射。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(普通的Java对象)映射成数据库的记录。
MyBatis与传统JDBC比较的不同?
MyBatis与传统的JDBC相比的不同:
1.减少了61%的代码量;
2.增强了移植性;
3. 增强了项目中的分工。
4.将SQL代码从程序代码中彻底分离,可重用;
5.架构级性能增强。
MyBatis的优点。
1.简单易学;
2.基于SQL语法,灵活;
3.解除SQL与程序代码的耦合;
4.提供映射标签,支持对象与数据库的ORM字段关系映射;
5.提供对象关系映射标签,支持对象关系组建维护;
6.提供xml标签,支持编写动态sql;
MyBatis核心类以及工作流程。
1.SqlSessionFactory:SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在。一个SqlSessionFactory对应配置文件中的一个环境(environment),如果你要使用多个数据库 就配置多个环境分别对应一个SqlSessionFactory。
2.SqlSession:SqlSession通过内部存放的执行器(Executor)来对数据进行CRUD。此外SqlSession不是线程安全的,因为每一次操作完数据库后都要调用close对其进行关闭,官方建议通过try-finally来保证总是关闭SqlSession。
3. Executer:Executor(执行器)接口有两个实现类,其中BaseExecutor有三个继承类分别是BatchExecutor(重用语句并执行批量更新),ReuseExecutor(重用预处理语句prepared statement,跟Simple的唯一区别就是内部缓存statement),SimpleExecutor(默认,每次都会创建新的statement)。
4. MappedStatement:MappedStatement就是用来存放我们SQL映射文件中的信息包括sql语句,输入参数,输出参数等等。一个SQL节点对应4.一个MappedStatement对象。
工作流程:1.加载mybatis-config.xml和Configuration配置文件并初始化;
2.创建会话工厂SqlSessionFactory;
3.创建会话SqlSession;
4.通过执行器进行对数据库指令的下达;
MyBatis核心配置文件。
1.properties属性:将数据源中四要素提取出来,成为全局变量;
2.settings设置:MyBatis框架在运行时可以调整一些运行参数,比如:开启二级缓存,开启延迟加载等。
cacheEnabled :开启二级缓存:<setting name="cacheEnabled" value="true"/>
lazyLoadingEnabled :开启延迟加载/懒加载 “针对级联使用的”:<setting name="lazyLoadingEnabled" value="true"/>
3.typeAliases 类型别名
<typeAliases>
<package name="com.jr.pojo"/>
</typeAliases>
4.typeHandlers类型处理器
5.objectFactory对象工厂
6.plugins插件
7.environments环境配置
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中。 尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
Mappers映射器
SQL 映射文件只有很少的几个顶级元素:
cache-该命名空间的缓存配置;
cache-ref-引用其它命名的缓存配置;
resultMap-描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
sql-可被其它语句引用的可重用语句块。
MyBatis可以实现的功能:
1.逆向工程
1.新建一个maven java工程
2.添加依赖jar 包
3.添加配置文件generatorConfig.xml
4.定义GeneratorSqlmap类,调用MyBatis自动创建接口,在main方法执行自动创建
2.动态SQL
使用动态sql的原因:动态SQL主要用于解决查询条件不确定的情况;
常用的动态查询标签:<if>是简单的条件判断。<where>是输出where,会智能的判断是否需要去除or或and。<choose>+<when>+<otherwise>-实现查询功能;<trim>+<if>-实现添加功能;<set>+<if>+<where>-实现修改功能;<foreach>-构建in条件,foreach标签的属性主要有item,index,collection,open,separator,close。
3.MyBatis查询
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap。resultType是直接表示返回类型的;resultMap则是对外部ResultMap的引用;resultType和resultMap不能同时存在。
当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
实现步骤:1.创建实体类;2.创建mapper.java接口;3.创建mapper.xml映射文件;4.编写测试类;
4.分页查询
1.使用page工具类VO
2.使用RowBounds插件
5.延迟加载
延迟加载是在数据与对象进行mapping操作时,只有在真正使用到该对象时,才进行mapping操作,以减少数据库查询开销,从而提升系统性能。
延迟加载虽然某种程度上可以减少数据库查询开销,但是,同时也会多次连接数据库,同时会增加数据库的压力。所以需要考虑是否使用延迟加载。
延迟加载优点:运行速度快;
延迟加载缺点:延迟加载就是按需加载,但是程序中的很多问题,按需加载是不能及时暴露出来的;
MyBatis 默认没有开启延迟加载,需要在SqlMapConfig.xml中setting进行配置。
<setting name="lazyLoadingEnabled" value="true"/> ==延迟加载
<setting name="aggressiveLazyLoading" value="true"/>==积极懒加载,按需加载
6.MyBatis查询缓存
缓存技术是一种“以空间换时间”的设计理念,是利用内存空间资源来提高数据检索速度的有效手段之一。MyBatis包含一个非常强大的查询缓存特性,可以非常方便地配置和定制。
MyBatis提供一级缓存,二级缓存和三级缓存。
一级缓存基于HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache就将清空。
二级缓存与一级缓存机制相同,默认也是采用HashMap存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源。
三级缓存则是通过第三方分布式缓存框架实现查询缓存,其中使用的第三方框架有ehcache,redis,memcache缓存框架。Ehcache 是一种广泛使用的开源java分布式缓存。主要面向通用缓存,javaEE 和 轻量级容器。它具有内存和磁盘存储功能。框架被用于大型复杂分布式web application的。
标签:缓存,框架,映射,查询,如何,SQL,MyBatis,加载 From: https://blog.csdn.net/chengxinzhongnuo/article/details/142831680