前言

  • 映射器之前我们已经提到了,是mybatis特有的组件: java+xml组合的方式。对于Java类和xml的编写也很简单。值得注意的是需要将Java编写的mapper注册到mybatis中来。之前的注册的方式通过xml。到后续通过spirng来管理通过@Mapper就很方便了。

标签

  • Java实现的接口Mapper很简单,就是已接口的形式暴露,方法和参数和我们正常的写一样,就是在多参数的时候我们需要通过@Param注解标注在sql中的变量名。
    • 但是xml就需要按照mybatis的格式来写了。xml中有select、insert、update、delete等对应方法的标签。除了这些还有sql、resultMap、

select

  • 严格来说,select及下面的insert这些都有一个id,这些id形成JavaMapper中对应的方法。mybatis也是通过id来定位到要执行的sql的。我们通过parameterType、resultType定义入参和出参的类型。Type也可以事先定义为对应的Map 即 parameterMap、resultMap。 在select标签中还有一个flushCache用来表示是否清楚缓存在查询。因为mybatis默认对SESSION级别开启一级缓存。还有之前提到的fetchSize获取记录的条数。常见的就这些属性。还有其他属性感兴趣的可以深入

  • 在入参出参的时候我们可以使用别名来制定类型。这就是别名带来的好处。不需要写一大长串的包名类名。

  • 在第一张我们就提到mybatis和Hibernate的区别是前者是半自动后者是全自动。半自动映射是因为mybatis在列明和属性名相同的时候自动映射,剩下的就需要我们sql别名了。mybatis还提供一种列名转驼峰映射的方式也是经常使用的。

  • select中经常会用到resultMap, resultMap这个标签用途可以说是跟大。首先定义Javabean属性和数据库列的映射。映射包括一对一,一对多,还有根据情况选择器这三种特殊标签。初次之外在列与属性映射时候还可以指定TypeHandler来进行覆盖。有机会好好总结一下这个resultMap。

insert|update|delete

  • 这些标签实际上和select标签一样。属性上也都是差不多。不同的是select有结果集。而这三个标签返回的就是记录数。并不注重他们的返回,更加注重的是他们的入参的执行。经常在他们里面会有foreach这些用来批量操作。

  • 在新增的时候mybatis提供selectKey标签来实现主键自增长策略,也可以实现自定义主键增长策略。这里的增长并不是数字层面的增长,而是不同的意思。

参数

  • 在传参的方式有很多种,我们可以选择map ,也可以选择javabean,也可以多参传递。多参传递的时候我们需要添加@Param注解标注属性名。根据实际情况自行选取哪种方式。

  • 上面提到resultMap可以指定typeHandler,实际上在参数上我们也可以。#{name,javaType=double,jdvbType=NUMERIC,typeHandler=MyTypeHandler}

  • #{name} 这种方式mybatis会自动根据数据格式进行映射,但是当name为null,mybatis就无法映射,这个时候我们#{name,jdbcType=VARCHAR}。mybatis就会采用StringTypeHandler去解析

  • 还有就是# ,$ 的区别。这里不多说,前者是占位,后者是拼接

resultMap

  • resultMap是最复杂的一个标签,他的功能可以实现字段的映射、级联的查询、定制类型转换器。resultMap目前只能用在select标签中。新增没有。

<resultMap>
<constructor>
<idArg/>
<arg/>
</constructor>
<id/>
<result/>
<association/>
<discriminator/>
</resultMap> ``` ## 级联 - 级联在我们平时开发中是最常见的。我们通过pojo接收返回结果的时候我们经常需要处理的就是级联的问题。在上面的resultMap中通过association、collection来负责一对一。一对多的处理。具体的级联在我之前的文章中都有的。大家可以关注我查看。 # cache - 缓存是为了提高运行效率产生的一个功能。主要就是讲数据保存 在内存中。因为cpu读取内存是非常的快的。所以缓存能够提高我们的效率。之前我们已经提过了,mybatis为我们提供两种缓存。一级缓存和二级缓存。一级缓存默认是打开的。他的生命周期是SESSION。就是说在同一个sqlsession中相同的查询是经过缓存的。这个缓存如果没有在insert或者select其他标签内没有flush缓存的话,这个缓存在规定时间内就会一直存在。换句话说同样的sql将会一直查询缓存。上述情况仅仅是针对相同的sqlsession. - 一级缓存针对sqlsession。有的时候我们需要讲mapper进行缓存。换句话说讲缓存放到sqlsessionfactory上。这时候我们引入了二级缓存的概念。mybatis默认是不开启二级缓存的。开启的方式也很简单 ```xml <cache/>
  • 只需要在mybatis-config.xml中加入cache这个标签就可以了。当然我们如果是用pojo接收结果的。pojo需要进行序列化。

  • 在二级缓存中我们所有的select都讲被缓存起来。在insert、update、delete执行的时候都将会刷新缓存的。下面给出一个全的cache配合。


<cache eviction="LRU" flushInterval="1000" size="1024" readOnly="true"/>

自定义缓存

  • 我们上面开启的只是mybatis为我们提供的二级缓存。但是往往我们都是结合redis这种第三方缓存实现的。下面我们来看看我们如何实现自定义缓存。
    • 首先我们需要先继承org.apache.ibatis.cache.Cache接口。然后通过在mybatis-config.xml中引入我们的类就行了
  • `<cache type="*******"/>`往往在select、insert、update、delete这些标签中和userCache、flushCache结合使用实现缓存的使用的sql

加入战队

# 加入战队

微信公众号

mybatis精讲(五)--映射器组件的更多相关文章

  1. Mybatis精讲(一)---环境配置及架构梳理

    目录 简介 ORM模型 Hibernate Ibatis 环境搭建 jar 配置 xml方式配置 代码方式配置 两种方式对比 Mybatis结构 源码解读xml环境加载 映射器解读 Ibatis # ...

  2. mybatis精讲(三)--标签及TypeHandler使用

    目录 话引 XML配置标签 概览 properties 子标签property resource 程序注入 settings 别名 TypeHandler 自定义TypeHandler EnumTyp ...

  3. Mybatis精讲(二)---生命周期

    目录 回顾 SqlSessionFactoryBuilder SqlSessionFactory openSessionFromDataSource Executor SqlSession Mappe ...

  4. Could not find resource——mybatis 找不到映射器xml文件

    今天用IDEA写Mybatis的时候,测试报了如图所示的错,恶心死我了,后来解决了,总结一下,防止下回跳坑,当然,也是做一个分享,如果有朋友遇到这个错,希望有所帮助 Error parsing SQL ...

  5. IDEA Mybatis 找不到映射器xml文件

    用IDEA新建了一个测试MyBatis工程,工程目录如下 其中config是MyBatis的配置文件,内容如下 <?xml version="1.0" encoding=&q ...

  6. mybatis精讲(四)--ObjectFactory

    目录 前言 mybatis的ObjectFactory 源码 setProperties create instantiateClass 使用场景 # 加入战队 微信公众号 前言 ObjectFact ...

  7. mybatis精讲(六)--二级缓存

    目录 简介 配置 源码 CachingExecutor 自定义二级缓存 # 加入战队 微信公众号 简介 上一章节我们简单了解了二级缓存的配置.今天我们详细分析下二级缓存以及为什么不建议使用二级缓存. ...

  8. mybatis精讲(七)--动态sql

    目录 常用标签 if元素 choose元素 trim元素 forearch bind元素 在我们传统的开发中我们会通过拼接sql达到数据库的操作.java中的拼接不仅效率低下而且代码很长不易维护.而M ...

  9. mybatis 找不到映射器xml文件 (idea)

    原因是: idea不会编译src的java目录的xml文件 所以解决思路就是:将IDEA maven项目中src源代码下的xml等资源文件编译进classes文件夹 具体操作方法就是:配置maven的 ...

随机推荐

  1. 小白学 Python(16):基础数据类型(函数)(上)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  2. webPack 4.0的零基础学习

    webPack 也更新到了4.0阶段,今天看了一下官网,总结一下,零基础的学习路径吧. (1)首先需要下载 webPake和webpack cli npm install webpack webpac ...

  3. Codeforces 1183F - Topforces Strikes Back

    Div. 3的题,竟然卡了好久,自闭.jpg 好像我的思路不太一样呢QAQ 首先注意到,如果一个数是另一个的因子,那它肯定不会出现在答案中. 我们先把所有数排序,然后对每个数,我们要往前再找两个数(或 ...

  4. 水管局长数据加强版:lct,时光倒流,最小生成树,边化点

    Description: SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到 ...

  5. CSPS_104

    又被爆踩. 正解写挂. 暴力不会. 只会改题. 还要加油. T1 $nlog^2$是显然的 那么考虑只二分一次,就$nlog$了! 有什么能通过一次二分$O(1)$得到呢? 二分a的位置,$O(1)$ ...

  6. 面试精选:JVM垃圾回收

    Tips:关注公众号:松花皮蛋的黑板报,领取程序员月薪25K+秘籍,进军BAT必备! Java堆中存放着大量的Java对象实例,在垃圾收集器回收内存前,第一件事情就是确定哪些对象是“活着的”,哪些是可 ...

  7. (十二)golang--进制和位运算

    1.基本进制 (1)二进制:0,1,满2进1 在golang中,不能直接使用一个二进制表示一个整数,可以用八进制.十进制和十六进制表示 (2)十进制:0-9,满10进1 (3)八进制:0-7,满8进1 ...

  8. Wycieczki 线性代数

    B. Wycieczki 题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以 ...

  9. 0911作业-if while循环小练习

    输入姑娘的年龄后,进行以下判断: 如果姑娘小于18岁,打印"不接受未成年" 如果姑娘大于18岁小于25岁,打印"心动表白" 如果姑娘大于25岁小于45岁,打印& ...

  10. nyoj 86-找球号(一)二分法

    86-找球号(一) 内存限制:64MB 时间限制:3000ms 特判: No 通过数:14 提交数:48 难度:3 题目描述: 在某一国度里流行着一种游戏.游戏规则为:在一堆球中,每个球上都有一个整数 ...