资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

MyBatis系列-映射器XML篇

Java 更新时间: 发布时间: 计算机考试归档 最新发布

MyBatis系列-映射器XML篇

MyBatisXML映射篇

  • 一:背景介绍
  • 二:什么是XML映射器
  • 三:XML映射的顶级元素构成
  • 四:各元素详细介绍
    • 4.1 select元素
      • 4.1.1 select元素简单示例
      • 4.1.2 select元素的个属性选项
    • 4.2 insert, update 和 delete 元素
      • 4.2.1 insert, update 和 delete 元素的简单示例
      • 4.2.2 属性与描述
    • 4.3 sql 元素
      • 4.3.1 概念
      • 4.3.2 实例
    • 4.4 result Map 元素
      • 4.4.1 概念
      • 4.4.2 具体实例
      • 4.4.3 使用类型别名
      • 4.4.4 显示配置
    • 4.5 cache与cache-ref 元素
      • 4.5.1 cache缓存
        • 4.5.1.1 概念
        • 4.5.1.2 解释
        • 4.5.1.3 清除策略
        • 4.5.1.4 其他属性
      • 4.5.2 cache-ref 元素
        • 4.5.2.1 概念
        • 4.5.2.2 具体操作
  • 五:总结&提升

一:背景介绍

这是我的MyBatis系列的第二篇文章,MyBatis的XML映射,这篇文章将会详细的讲述MyBatis中的XML的映射,这篇文章将会从简单到复杂,从常用到不常用,详细的介绍XML对应的映射。希望通过此篇文章,能让您了解到MyBatis的各种XML映射,学会如何在项目中更好的应用MyBatis,降低成本,提高效率。

二:什么是XML映射器

  • 在 MyBatis 中,XML 映射器是一种将 SQL 语句与 Java 方法进行映射的方式。它是一种通过 XML 文件定义 SQL 语句的方式,使得开发人员可以将 SQL 语句与 Java 方法解耦,从而更加灵活地进行 SQL 语句的编写和维护。

三:XML映射的顶级元素构成

在Mybatis中,只有很少的几个顶级元素,主要有以下几个:

  1. select
    映射查询语句
  2. insert
    映射插入语句
  3. update
    映射更新语句
  4. delete
    映射删除语句
  5. sql
    可被其它语句引用的可重用语句块
  6. result Map
    描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素
  7. cache
    该命名空间的缓存配置
  8. cache-ref
    引用其它命名空间的缓存配置

接下来我们会按照重要程度,常用程度,对其进行介绍

四:各元素详细介绍

4.1 select元素

相信大家对select都不陌生,在多数应用中,查询是最频繁的操作,远比修改要多,所以我们将这个元素放到最前面,下面上我们来先认识认识,select元素

4.1.1 select元素简单示例

以下为简单的select元素示例:

参数介绍:

属性描述
id在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以根据语句中实际传入的参数计算出应该使用的类型处理器(TypeHandler),默认值为未设置(unset)
resultType期望从这条语句中返回结果的类全限定名或别名。 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。
resultMap对外部 resultMap 的命名引用。结果映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂的映射问题都能迎刃而解。 resultType 和 resultMap 之间只能同时使用一个。
flushCache将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false。
useCache将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。
timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
fetchSize这是一个给驱动的建议值,尝试让驱动程序每次批量返回的结果行数等于这个设置值。 默认值为未设置(unset)(依赖驱动)。
statementType可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
resultSetTypeFORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依赖数据库驱动)。
databaseId如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。
resultOrdered这个设置仅针对嵌套结果 select 语句:如果为 true,则假设结果集以正确顺序(排序后)执行映射,当返回新的主结果行时,将不再发生对以前结果行的引用。 这样可以减少内存消耗。默认值:false。
resultSets这个设置仅适用于多结果集的情况。它将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔。

4.2 insert, update 和 delete 元素

4.2.1 insert, update 和 delete 元素的简单示例

数据变更语句 insert ,update , delete的实现非常接近。

4.2.2 属性与描述

这里只给出select未列出的部分

属性描述
useGeneratedKeys仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。
keyProperty(仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。
keyColumn(仅适用于 insert 和 update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。

4.3 sql 元素

4.3.1 概念

这个元素可以用来定义可重用的 SQL 代码片段,以便在其它语句中使用。

4.3.2 实例

参数可以静态地(在加载的时候)确定下来,并且可以在不同的 include 元素中定义不同的参数值。比如:

 ${alias}.id,${alias}.username,${alias}.password 

这个 SQL 片段可以在其它语句中使用,例如:

4.4 result Map 元素

4.4.1 概念

  • resultMap 元素是 MyBatis 中最重要最强大的元素。
  • 它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。
  • 实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。
  • ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

4.4.2 具体实例

我们先给出一个实例,这个实例没有显示的指定result Map 例如

  select id, username, hashedPassword  from some_table  where id = #{id}

4.4.3 使用类型别名

类型别名是你的好帮手。使用它们,你就可以不用输入类的全限定名了。比如:

  select    user_id             as "id",    user_name           as "userName",    hashed_password     as "hashedPassword"  from some_table  where id = #{id}

在学习了上面的知识后,你会发现上面的例子没有一个需要显式配置 ResultMap,这就是 ResultMap 的优秀之处——你完全可以不用显式地配置它们。

4.4.4 显示配置

虽然上面的例子不用显式配置 ResultMap。 但为了讲解,我们来看看如果在刚刚的示例中,显式使用外部的 resultMap 会怎样,这也是解决列名不匹配的另外一种方式。

      

然后在引用它的语句中设置 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如:

4.5 cache与cache-ref 元素

4.5.1 cache缓存

4.5.1.1 概念

MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。 为了使它更加强大而且易于配置,我们对 MyBatis 3 中的缓存实现进行了许多改进。

默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:

4.5.1.2 解释

基本上就是这样。这个简单语句的效果如下:

  • 映射语句文件中的所有 select 语句的结果将会被缓存。
  • 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  • 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
  • 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
  • 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
  • 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

缓存只作用于 cache 标签所在的映射文件中的语句。如果你混合使用 Java API 和 XML 映射文件,在共用接口中的语句将不会被默认缓存。你需要使用 @CacheNamespaceRef 注解指定缓存作用域。

这些属性可以通过 cache 元素的属性来修改。比如:

这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。

4.5.1.3 清除策略

可用的清除策略有:

  • LRU – 最近最少使用:移除最长时间不被使用的对象。
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  • SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
  • WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。

默认的清除策略是 LRU

4.5.1.4 其他属性

  1. flushInterval(刷新间隔)属性可以被设置为任意的正整数,设置的值应该是一个以毫秒为单位的合理时间量。 默认情况是不设置,也就是没有刷新间隔,缓存仅仅会在调用语句时刷新。
  2. size(引用数目)属性可以被设置为任意正整数,要注意欲缓存对象的大小和运行环境中可用的内存资源。默认值是 1024。
  3. readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false。

提示 二级缓存是事务性的。这意味着,当 SqlSession 完成并提交时,或是完成并回滚,但没有执行 flushCache=true 的 insert/delete/update 语句时,缓存会获得更新。

4.5.2 cache-ref 元素

4.5.2.1 概念

实现我们自己的缓存,或为其他第三方缓存方案创建适配器,来完全覆盖缓存行为。

4.5.2.2 具体操作

这个示例展示了如何使用一个自定义的缓存实现。type 属性指定的类必须实现 org.apache.ibatis.cache.Cache 接口,且提供一个接受 String 参数作为 id 的构造器。 这个接口是 MyBatis 框架中许多复杂的接口之一,但是行为却非常简单。

public interface Cache {  String getId();  int getSize();  void putObject(Object key, Object value);  Object getObject(Object key);  boolean hasKey(Object key);  Object removeObject(Object key);  void clear();}

为了对你的缓存进行配置,只需要简单地在你的缓存实现中添加公有的 JavaBean 属性,然后通过 cache 元素传递属性值,例如,下面的例子将在你的缓存实现上调用一个名为 setCacheFile(String file) 的方法:

  

你可以使用所有简单类型作为 JavaBean 属性的类型,MyBatis 会进行转换。 你也可以使用占位符(如 ${cache.file}),以便替换成在配置文件属性中定义的值。

从版本 3.4.2 开始,MyBatis 已经支持在所有属性设置完毕之后,调用一个初始化方法。 如果想要使用这个特性,请在你的自定义缓存类里实现 org.apache.ibatis.builder.InitializingObject 接口。

public interface InitializingObject {  void initialize() throws Exception;}

请注意,缓存的配置和缓存实例会被绑定到 SQL 映射文件的命名空间中。 因此,同一命名空间中的所有语句和缓存将通过命名空间绑定在一起。 每条语句可以自定义与缓存交互的方式,或将它们完全排除于缓存之外,这可以通过在每条语句上使用两个简单属性来达成。 默认情况下,语句会这样来配置: