MyBatis 原理介绍
来源:SegmentFault
时间:2023-01-11 17:46:34 108浏览 收藏
本篇文章向大家介绍《MyBatis 原理介绍》,主要包括MySQL、数据库,具有一定的参考价值,需要的朋友可以参考一下。
ORM(Object/Relational Mapping),即对象关系映射,它完成面向对象的编程语言到关系数据库的映射。ORM工具的唯一作用是:把持久化对象的保存、修改、删除等操作,转换成对数据库的操作。
ORM 基本映射关系:
数据表映射类。 数据表的行映射对象(实例)。 数据表的列(字段)映射对象的属性。
MyBatis 简介:
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及对结果集的检索封装。 MyBatis 可以对配置和原生 Map 使用简单的 XML 或注解,将接口和Java的POJOs(Plain Old Java Objects(普通的 Java 对象))映射成数据库中的记录。 MyBatis 主要思想是将程序中的大量SQL语句抽取出来,配置在配置文件中,以实现SQL的灵活配置。 MyBatis 并不完全是一种ORM框架,它的设计思想和ORM相似,只是它允许直接编写SQL语句,使得数据库访问更加灵活。 MyBatis 提供了一种“半自动化”的ORM实现,是一种“SQL Mapping”框架。
MyBatis功能结构
1. API接口层:
提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层接收到调用请求就会调用数据处理层来完成具体的数据处理。
2. 数据处理层:
负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
3. 基础支撑层:
负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件,为上层的数据处理层提供最基础的支撑。
MyBatis 框架结构
1. 加载配置:
MyBatis 应用程序根据XML配置文件加载运行环境,创建SqlSessionFactory, SqlSession,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。(配置来源于两个地方,一处是配置文件,一处是 Java 代码的注解)
2. SQL解析:
当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),MyBatis 会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatment进行解析,解析后可以得到最终要执行的SQL语句和参数。
3. SQL的执行:
SqlSession将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
4. 结果映射:
将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回,用完之后关闭SqlSession。
SqlSessionFactory:
每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为核心的。 SqlSessionFactory是单个数据库映射关系经过编译后的内存映像。 SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得。 而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。 SqlSessioFactory是创建SqlSession的工厂。
SqlSession:
SqlSession是执行持久化操作的对象,它完全包含了面向数据库执行SQL命令所需的所有方法。 可以通过SqlSession实例来直接执行已映射的SQL语句,在使用完SqlSession后我们应该使用finally块来确保关闭它。
Mybatis.xml 配置文件:
配置文件包括:
1. configuration 配置
2. properties 配置
可外部配置且动态替换。 例如:在resource资源目录下配置config.properties配置文件,在Mybatis.xml中配置如下。也可以通过properties的子元素传递值:
3. settings 设置
settings 是 Mybatis.xml 文件中极其重要的设置,它们会改变MyBatis的运行时行为,如开启二级缓存、开启延迟加载等。
4. typeAliases 类型别名
typeAliases只和XML配置有关,用来减少类完全限定名的冗余。 第一种配置方法:这里将全路径的com.shiyanlou.mybatis.model.User(User是包com.shiyanlou.mybatis.mode下的方法)起一个别名User,在映射文件中parameterType和resultType就可以直接使用别名User,无需使用全路径。 第二种配置方法: 指定一个包名起别名,MyBatis 会在包名下搜索需要的JavaBean,将Java类的类名作为类的类别名。
5. typeHandlers 类型处理器
typeHandlers的作用是实现JDBC类型和Java类型之间的转换,MyBatis中默认的类型处理器基本能满足日常需求。
6. objectFactory 对象工厂
7. plugins 插件
8. environments 环境
MyBatis 的环境配置实际是数据源的配置,MyBatis可以配置多个环境,帮助你将SQL映射对应到多种数据库。 注意: 尽管可以配置多个环境,每个SqlSessionFactory实例只能对应一个数据库,有几个数据库就需要创建几个SqlSessionFactory实例。 接收环境配置的两个方法: SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, environment); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, environment,properties); 如果忽略了环境参数,默认环境将会被加载: SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader,properties);
9. transactionManager:事务管理器
MyBatis中有两种事务管理器,即 type=”\[JDBC | MANAGED\]”; JDBC:直接使用JDBC的提交和回滚设置。 MANAGED:让容器来管理事务的整个生命周期。
10. dataSource :数据源
dataSource元素使用标准的JDBC数据源接口来配置JDBC连接对象的资源。 MyBatis 三种内建的数据源类型,即type=”\[UNPOOLED | POOLED | JNDI\]”; 1. UNPOOLED :不支持JDBC数据源连接池,实现的只是每次被请求时打开和关闭连接。属性有: 1)driver :JDBC驱动的Java类的完全限定名,如 MySQL 的com.mysql.jdbc.Driver 2)url :数据库的JDBC URL地址。 3)username :数据库的用户名。 4)password :数据库的密码。 5)defaultTransactionIsolationLevel :默认的连接事务隔离级别。 2. POOLED :支持JDBC数据源连接池,利用“池”的概念将JDBC连接对象组织起来,避免了创建新的连接实例时所必须的初始化和认证时间。 3. JNDI :支持外部数据源连接池,它的实现是为了能在如EJB或应用服务器这类容器中使用。
11. databaseIdProvider 数据库厂商标识
12. mappers 映射器
mappers 映射器用于引用已经定义好的映射文件,告诉MyBatis 去哪寻找映射SQL的语句。 常见的方法有: 1)通过resource加载单个映射文件2)通过完全限定资源定位符(绝对路径前加上 “file:///” )加载单个映射文件。 3) 通过mapper接口对象加载单个映射文件。 4) 通过mapper接口包加载整个包的映射文件。
以下是一个简单的 MyBatis.xml 的配置文件:
//mybatis.org//DTD](//mybatis.org//DTD) Config 3.0//EN" "[http://mybatis.org/dtd/mybatis-3-config.dtd](http://mybatis.org/dtd/mybatis-3-config.dtd)">
MyBatis 映射文件:
映射文件是所有SQL语句放置的地方,写好SQL语句映射文件后,需要在mybatis.xml配置文件的mappers标签中引用。
映射文件包含的顶级元素:
1. cache :给定命名空间的缓存配置。 2. cache-ref :其他命名空间缓存配置的引用。 3. resultMap :描述如何从数据库结果集中来加载对象。 4. sql :可被其它语句引用的可重用语句块。 5. insert :映射插入语句。 6. updata :映射更新语句。 7. delete :映射删除语句。 8. select :映射查询语句。
resultMap:
在映射文件中也是最复杂最强大的,resultMap的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。
resultMap的子元素包括:
1. constructor :用来将结果注入到一个实例化好的类的构造方法中。 2. idArg :ID参数,标记结果作为ID。 3. arg :注入到构造方法的一个普通结果。 4. id :一个ID结果,标记结果作为ID。 5. result :注入到字段或JavaBean属性的普通结果。 6. association :复杂的类型关联,多个结果合成的类型。 7. collection :复杂类型的集,也可以引用一个外部结果映射。 8. discriminator :使用结果值来决定使用哪个结果集。 9. case :基本一些值的结果映射。
resultMap的属性包括:
1. id :当前命名空间中的一个唯一标识,用于标识一个resultMap 2. type :类的全限定名,或者一个类型别名。 3. automapping :为这个ResultMap开启或关闭自动映射,改属性会覆盖全局的属性autoMappingBehavior,默认值为:unset
动态SQL语句:
MyBatis 常用的动态 SQL 元素包括:
1. if 2. choose(when, otherwise) 3. trim(where, set) 4. foreach 5. bind
if
if 在 where 子句中做简单的条件判断; 如果addres为空,则where id = #{id}。 如果 addres 不为空, 则where id = #{id} and addres = #{addres};
choose(when, otherwise):
choose 的用法和 java 的switch类似。 按照顺序执行,当when中有条件满足时,则跳出choose,当所有when的条件都不满足时就输出otherwise的内容。 select * from User where id = #{id}--> and username = #{username} and phone = #{phone} and addres = #{addres}
trim(where, set):
trim 元素可以给自己包含的内容加上前缀(prefix)或加上后缀(suffix)。 也可以把包含内容的首部(prefixOverrides)或尾部(suffixOverrides)某些内容移除; where 元素知道只有在一个以上的 if 条件满足的情况下才去插入 where 子句,而且能够智能地处理and和or条件; set 元素可以被用于动态包含需要更新的列,而舍去其他的update User where id=#{id} phone=#{phone}, address=#{address}
foreach:
foreach 元素常用到需要对一个集合进行遍历时,在in语句查询时特别有用:
foreach元素的主要属性:
1. item :本次迭代获取的元素; 2. index : 当前迭代的次数; 3. open :开始标志; 4. separator :每次迭代之间的分隔符; 5. close :结束标志; 6. collection :该属性必须指定(1、单参数且为List时,值为list。 2、单参数且为array时,值为array。 3、多参数需封装成一个Map,map的key就是参数名)
bind:
bind 元素可以从OGNL表达式中创建一个变量并将其绑定到上下文。
MyBatis、JDBC、Hibernate的区别:
MyBatis也是基于JDBC的,Java与数据库操作仅能通过JDBC完成。MyBatis也要通过JDBC完成数据查询、更新这些动作。 MyBatis仅仅是在JDBC基础上做了 OO化、封装事务管理接口这些东西。 MyBatis和Hibernate都屏蔽JDBC API的底层访问细节,使我们不用跟JDBC API打交道就可以访问数据库。 但是,Hibernate是全自动的ORM映射工具,可以自动生成SQL语句。 MyBatis需要在xml配置文件中写SQL语句。 因为Hibernate是自动生成SQL语句的,在写复杂查询时,Hibernate实现比MyBatis复杂的多。
理论要掌握,实操不能落!以上关于《MyBatis 原理介绍》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
-
499 收藏
-
244 收藏
-
235 收藏
-
157 收藏
-
101 收藏
最新阅读
更多>
-
165 收藏
-
397 收藏
-
489 收藏
-
209 收藏
-
497 收藏
-
335 收藏
课程推荐
更多>
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习