Mapper映射文件

mapper.xml映射文件主要是用来编写SQL语句的,以及一些结果集的映射关系的编写,还有就是缓存的一些配置等等。

在映射文件里面可以配置以下标签:

元素名称 描述 备注
select 查询语句,最常用、最复杂的元素之一 可以自定义参数,返回结果集等
insert 插入语句 执行后返回一个整数,代表插入的条数
update 更新语句 执行后返回一个整数,代表更新的条数
delete 删除语句 执行后返回一个整数,代表删除的条数
parameterMap 定义参数映射关系 即将被删除的元素,不建议大家使用
sql 允许定义一部分的SQL,然后在各个地方引用
resultMap 用来描述从数据库结果集中来加载对象,它是它将提供映射规则最复杂、最强大的元素 它提供映射规则
cache 给定命名空间的缓存配置
cache-ref 其他命名空间缓存配置的引用

引入映射器

  • 可以在mybatis-config.xml中通过文件路径引入

    <mappers>
    <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
  • 通过包名引入

    这样会将mapper下的所有mapper类加载到上下文当中

    <mappers>
    <package name="com.zl.mapper"/>
    </mappers>
  • 用类注册引入

    <mappers>
    <mapper class="com.zl.mapper.UserMapper"/>
    </mappers>

Select标签

  • id

    它和 Mapper的命名空间组合起来是唯一的,提供给MyBatis调用。如果命名空间和id组合起来不唯一将抛出异常。
  • parameterType

    可以给出类的全命名,也可以给出类的别名,但使用别名必须是MyBatis内部定义或者自定义的。
  • resultType

    定义类的全路径,在允许自动匹配的情况下,结果集将通过JavaBean的规范映射;也可以定义为int、 double等参数;也可以使用别名,但是要符合别名规范;不能和 resultMap同时使用。
  • resultMap

    外部 resultMap 的命名引用。
  • flushCache

    它的作用是在调用SQL后,是否要求清空之前查询的本地缓存和二级缓存
  • useCache

    将其设置为 true,将会导致本条语句的结果被二级缓存,默认值:true。
  • timeout

    这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。
  • fetchSize

    这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动)。
  • statementType

    STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
  • resultSetType

    FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一个,默认值为 unset (依赖驱动)。
  • databaseId

    如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。
  • resultOrdered

    这个设置仅针对嵌套结果 select 语句适用:如果为 true,就是假设包含了嵌套结果集或是分组了,这样的话当返回一个主结果行的时候,就不会发生有对前面结果集的引用的情况。这就使得在获取嵌套的结果集的时候不至于导致内存不够用。默认值:false。
  • resultSets

    这个设置仅对多结果集的情况适用,它将列出语句执行后返回的结果集并每个结果集给一个名称,名称是逗号分隔的。

自动映射

自动映射可以在settings元素中配置autoMappingBehavior属性值来设置其策略:

  • NONE,取消自动映射。
  • PARTIAL(默认值),只会自动映射,没有定义嵌套结果集映射的结果集。
  • FULL,会自动映射任意复杂的结果集(无论是否嵌套),在性能上会下降。

Insert标签

insert的很多配置元素是和select一样的,就不再赘述,下面列出select中没有的属性

  • keyProperty

    表示以哪个列作为属性的主键,不能和keyColumn同时使用

  • keyColumn

    表示第几列是主键,不能和keyProperty同时使用

  • useGeneratedKeys

    这会令MyBatis使用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键,但是使用它就必须要给keyProperty或者 keyColumn赋值

主键回填

方式一

<insert id="insertBook" useGeneratedKeys="true" keyProperty="id">
insert into t_book (b_name,author) values (#{name},#{author});
</insert>

这种方式比较简单,就是在插入节点上添加 useGeneratedKeys 属性,同时设置接收回传主键的属性。配置完成后,我们执行一个插入操作,插入时传入一个对象,插入完成后,这个对象的 id 就会被自动赋值,值就是刚刚插入成功的id。

推荐大家使用这种方式,原因很简单,这种方式实现简便省事。

方式二

第二种方式则是利用MySQL自带的 last_insert_id() 函数查询刚刚插入的id,示例代码如下:

<insert id="insertBook">
<selectKey keyProperty="id" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into t_book (b_name,author) values (#{name},#{author});
</insert>

这种方式是在 insert 节点中添加 selectKey 来实现主键回填,实际上这种方式的功能更加丰富,因为 selectKey 节点中的 SQL 我们既可以在插入之前执行,也可以在插入之后执行(通过设置节点的 Order 属性为 AFTER 或者 BEFORE 可以实现),具体什么时候执行,还是要看具体的需求,如果是做主键回填,我们当然需要在插入 SQL 执行之后执行 selectKey 节点中的 SQL。

注意第二种方式一样也要通过设置 keyProperty 来指定将查询到的数据绑定到哪个属性上。

参数配置

我们可以传入一个简单的参数如基本类型和字符串;也可以传入JavaBean;还可以指定特定的类型,以确定使用哪个 typeHandler处理它们。定义参薮属性的时候,MyBatis不允许换行。

  • 可以是这样#{age, javaType=int, jdbcType=NUMERIC}
  • 指定typeHandler:#{age, javaType=int, jdbcType=NUMERIC, typeHandler=MyTypeHandler}
  • 数值型的参数设置其保存的精度:#{price, javaType=double, jdbcType=NUMERIC, numericScale=2}

resultMap结果映射集

resultMap里面标签如下图所示:

  • constructor元素用于配置构造方法,一个POJO可能不存在无参数的构造方法,这个时候我们就可以使用 constructor进行配置。

  • id元素是表示哪个列是主键,允许多个主键构成联合主键。

  • result是配置POJO到SQL列名的映射关系。

  • association代表一对一关系,比如每个班级都有一个班长

    具体见:Mybatis中association的用法

  • collection代表一对多关系,比如每个班级有多个学生

    具体见:Mybatis中collection的用法

  • discriminator鉴别器,它可以根据实际选择采用哪个类作为实例,允许你根据特定的条件去关联不同的结果集合

延迟加载

全局延迟加载

为了处理N+1的问题,My Batis引入了延迟加载的功能。延迟加载功能的意义在于,开始并不取出级联数据,只有当使用它了才发送SQL去取回数据。MyBatis的配置中有两个全局的参数lazyLoadingEnabled和aggressiveLazyLoading。

  • lazyLoadingEnabled的含义是是否开启延迟加载功能;
  • aggressiveLazyLoading的含义是对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将按需加载。

局部延迟加载

由于全局配置的灵活性较差,MyBatis提供了局部延迟加载的功能。我们可以在association和 collection元素上加入属性值fetchType就可以了。

缓存

一级缓存

  • MyBatis对缓存提供支持,在没有配置的默认的情况下,它只开启一级缓存(一级缓存只是相对于同一个 SqlSession而言),所以在参数和SQL完全一样的情况下,我们使用同一个 SqlSession对象调用同一个Mapper的方法,往往只执行一次SQL。
  • 使用SqlSession第一次查询后,MyBatis会将其放在缓存中。以后再查询的时候,如果没有声明需要刷新且缓存没超时,SqlSession都只会取出当前缓存的数据,而不会再次发送SQL到数据库。
  • 如果使用的是不同的SqlSession对象,因为不同的SqlSession都是相互隔离的,所以用相同的 Mapper、参数和方法,它还是会再次发送SQL到数据库去执行。
  • 当我们关闭SqlSession对象后,缓存就会失效。

二级缓存

一级缓存在各个SqlSession间是相互隔离的。为了克服这个问题,我们往往需要配置二级缓存,使得缓存在SqlsessionFactory层面上能够提供给各个SqISession对象共享,二级缓存默认是不开启的

  1. 二级缓存的时候要求返回的POJO必须是可序列化的,也就是要求实现Serializable接口。
  2. 配置的缓存的方法很简单,只需要在Mapper.xml文件中加入<cache/>
  3. 映射语句文件中的所有insert、update和delete语句会刷新缓存

二、Mapper映射文件的更多相关文章

  1. Mybatis学习系列(二)Mapper映射文件

    Mapper映射文件,作用是用来配置SQL映射语句,根据不同的SQL语句性质,使用不同的标签,mapper文件中常用的标签有<iselect>.<insert>.<upd ...

  2. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap

    上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...

  3. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap good

    上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...

  4. MyBatis 体系结构、根配置文件、Mapper映射文件

    一.MyBatis的体系结构 1.SqlSessionFactory对象 SqlSessionFactory对象是MyBatis的管理核心,它是单个数据库映射关系经过编译后的内存镜像,是创建SqlSe ...

  5. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap[转]

    上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...

  6. 深入浅出Mybatis系列八-mapper映射文件配置之select、resultMap

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之inse ...

  7. Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件

    封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...

  8. 框架学习系列 mybatis mapper映射文件之输出映射

    1: mapper映射文件输出映射(输入类型) 2:resultType的使用 3:resultMap的使用 3:总结&下节预告 本文是<凯哥陪你学系列-框架学习之mybatis框架学习 ...

  9. 深入浅出Mybatis系列(七)---mapper映射文件配置之insert、update、delete

    上篇文章<深入浅出Mybatis系列(六)---objectFactory.plugins.mappers简介与配置>简单地给mybatis的配置画上了一个句号.那么从本篇文章开始,将会介 ...

随机推荐

  1. MySQL常用DDL、DML、DCL语言整理

    DDL ----Data Definition Language 数据库定义语言 如 create procedure之类 创建数据库 CREATE DATABASE [IF NOT EXISTS] ...

  2. Eclipse中如何添加相对路径的外部jar包

    在eclipse中进行java编程的时候,常常需要引用外部jar包.而采用相对路径引用jar包可以大大方便java工程的拷贝,这样使得java工程从一个路径转移到另一个路径时不用大费周章的修改外包ja ...

  3. python中json与pickle的简要说明

    import json    ======> 注意:不同语言之间通用但不能传输对象类型 该模块中最重要的方法: 1.json.dump(‘python数据’,‘json文件’)   # 将pyt ...

  4. Git入门基础教程

    目录 一.Git的安装 1.1 图形化界面 1.2 命令行界面 二.本地仓库的创建与提交 2.1 图形化界面 2.1.1 首先在电脑上有一个空白目录 2.1.2 打开SourceTree 2.1.3 ...

  5. [洛谷P1122][题解]最大子树和

    这是一道还算简单的树型dp. 转移方程:f[i]=max(f[j],0) 其中i为任意非叶节点,j为i的一棵子树,而每棵子树都有选或不选两种选择 具体看代码: #include<bits/std ...

  6. ospf邻居建立过程

    1. hello报文的作用 邻居发现:自动发现邻居路由器. 邻居建立:完成Hello报文中的参数协商,建立邻居关系. 邻居保持:通过Keepalive机制,检测邻居运行状态. hello报文的发送时间 ...

  7. JS表单内容垂直循环滚动

    参考博客:https://blog.csdn.net/yubo_725/article/details/52839493  大佬是真的厉害,保存一下,以方便后续使用 效果: 源码: <!DOCT ...

  8. 织女星开发板RISC-V内核实现微秒级精确延时

    前言 收到VEGA织女星开发板也有一段时间了,好久没玩了,想驱动个OLED屏,但是首先要实现IIC协议,而实现IIC协议,最基本的就是需要一个精确的延时函数,所以研究了一下如何来写一个精确的延时函数. ...

  9. 【数据结构】什么是二叉查找树(BST)

    什么是二叉查找树(BST) 1. 什么是BST 对于二叉树中的每个节点X,它的左子树中所有项的值都小于X中的项,它的右子树中所有项的值大于X中的项.这样的二叉树是二叉查找树. 以上是一颗二叉查找树,其 ...

  10. 【带着canvas去流浪(9)】粒子动画

    目录 一. 粒子特效 二. 开发中遇到的问题 2.1 卡顿 2.2 轨迹 2.3 复位 2.4 防护层 2.5 二维向量类 三. 实现讲解 3.1 粒子类的update方法 3.2 粒子群的绘制 3. ...