MyBatis 的学习教程总结

首先了解什么是Mybatis?

MyBatis 简介:

在这里插入图片描述
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

MyBatis如何安装:

要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。
如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:

MyBatis的功能架构:

我们把Mybatis的功能架构分为三层:
1.API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
2.数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
3.基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
在这里插入图片描述

MyBatis的优缺点:

优点:简单易学,灵活,解除sql与程序代码的耦合,提供映射标签,支持对象与数据库的orm字段关系映射,提供对象关系映射标签,支持对象关系组建维护,提供xml标签,支持编写动态sql。
缺点:编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。二级缓存机制不佳

集成

单独使用mybatis [4] 是有很多限制的(比如无法实现跨越多个session的事务),而且很多业务系统本来就是使用spring来管理的事务,因此mybatis最好与spring集成起来使用 [4] 。
spring事务配置
在这里插入图片描述
参考资料

Mybatis的框架架构:

MyBatis XML配置:

一:XML 映射配置文件

MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息。
属性properties都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。
如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
1.在 properties 元素体内指定的属性首先被读取。
2.然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
3.最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。
settings这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
一个配置完整的 settings 元素的示例如下:
在这里插入图片描述
typeAliases类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
typeHandlers无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
事务管理器(transactionManager)
在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。
映射器(mappers)
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。

二:MyBatis XML映射文件

Mapper XML 文件
MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。
SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
1.cache – 给定命名空间的缓存配置。
2.cache-ref – 其他命名空间缓存配置的引用。
3.resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
4.sql – 可被其他语句引用的可重用语句块。
5.insert – 映射插入语句
6.update – 映射更新语句
7.delete – 映射删除语句
8.select – 映射查询语句

三:MyBatis 动态SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。

动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。

  • if
    动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。
    在这里插入图片描述
    如果想可选地通过"title"和"author"两个条件搜索该怎么办呢?首先,改变语句的名称让它更具实际意义;然后只要加入另一个条件即可。
    在这里插入图片描述
  • choose (when, otherwise)
    有些时候,我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
    还是上面的例子,但是这次变为提供了"title"就按"title"查找,提供了"author"就按"author"查找,若两者都没有提供,就返回所有符合条件的BLOG(实际情况可能是由管理员按一定策略选出BLOG列表,而不是返回大量无意义的随机结果)。
    在这里插入图片描述
  • trim (where, set)
    where 元素知道只有在一个以上的if条件有值的情况下才去插入"WHERE"子句。而且,若最后的内容是"AND"或"OR"开头的,where 元素也知道如何将他们去除。
    如果 where 元素没有按正常套路出牌,我们还是可以通过自定义 trim 元素来定制我们想要的功能。
    在这里插入图片描述
  • foreach
    动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。
    在这里插入图片描述

四:MyBatis Java API

SqlSessionFactory
SqlSessionFactory 有六个方法可以用来创建 SqlSession 实例。通常来说,如何决定是你 选择下面这些方法时:
Transaction (事务): 你想为 session 使用事务或者使用自动提交(通常意味着很多 数据库和/或 JDBC 驱动没有事务)?
Connection (连接): 你想 MyBatis 获得来自配置的数据源的连接还是提供你自己
Execution (执行): 你想 MyBatis 复用预处理语句和/或批量更新语句(包括插入和 删除)?
SqlSessions
使用 MyBatis 的主要 Java 接口就是 SqlSession。尽管你可以使用这个接口执行命令,获 取映射器和管理事务。我们会讨论 SqlSession 本身更多,但是首先我们还是要了解如果获取 一个 SqlSession 实例。SqlSessions 是由 SqlSessionFactory 实例创建的。SqlSessionFactory 对 象 包 含 创 建 SqlSession 实 例 的 所 有 方 法 。 而 SqlSessionFactory 本 身 是 由 SqlSessionFactoryBuilder 创建的,它可以从 XML 配置,注解或手动配置 Java 来创建 SqlSessionFactory。

五:MyBatis SQL语句构建器

在这里插入图片描述
在这里插入图片描述

六:MMyBatis 日志

Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:
1.SLF4J
2.Apache Commons Logging
3.Log4j 2
4.Log4j
5.JDK logging
具体选择哪个日志实现工具由MyBatis的内置日志工厂确定。它会使用最先找到的(按上文列举的顺序查找)。 如果一个都未找到,日志功能就会被禁用。
Logging Configuration
MyBatis可以对包、类、命名空间和全限定的语句记录日志。
具体怎么做,视使用的日志框架而定,这里以Log4J为例。配置日志功能非常简单:添加几个配置文件, 如log4j.properties,再添加个jar包,如log4j.jar。下面是具体的例子,共两个步骤:
步骤1: 添加 Log4J 的 jar 包
因为采用Log4J,要确保在应用中对应的jar包是可用的。要满足这一点,只要将jar包添加到应用的classpath中即可。 Log4J的jar包可以从上面的链接中下载。
具体而言,对于web或企业应用,需要将log4j.jar 添加到WEB-INF/lib 目录; 对于独立应用, 可以将它添加到jvm的 -classpath启动参数中。
步骤2:配置Log4J
配置Log4J比较简单, 比如需要记录这个mapper接口的日志:
在这里插入图片描述
只要在应用的classpath中创建一个名称为log4j.properties的文件, 文件的具体内容如下:
在这里插入图片描述
添加以上配置后,Log4J就会把 org.mybatis.example.BlogMapper 的详细执行日志记录下来,对于应用中的其它类则仅仅记录错误信息。

猜你喜欢

转载自blog.csdn.net/linhongyudada/article/details/83149501