前言

  • 映射器之前我们已经提到了,是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. 为什么 Flutter 是跨平台开发的终极之选

    跨平台开发是当下最受欢迎.应用最广泛的框架之一.能实现跨平台开发的框架也五花八门,让人眼花缭乱.最流行的跨平台框架有 Xamarin.PhoneGap.Ionic.Titanium.Monaca.Se ...

  2. Java线程学习详解

    线程基础 1. 线程的生命周期 1.1 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态.它保持这个状态直到程序 start() 这个线程. 1 ...

  3. 【XSY2564】sequence

    Description [题目描述] 给定一个长度为n的由['0'..'9']组成的字符串s,v[i,j]表示由字符串s第i到第j位组成的十进制数字. 将它的某一个上升序列定义为:将这个字符串切割成m ...

  4. Mybatis:CRUD操作

    提示: Mapper配置文件的命名空间为对应接口包名+接口名字,这个经常会忘记和搞错的!! select标签 在接口中编写三个查询方法 //获取全部用户List<User> selectU ...

  5. js调用局部打印功能并还原

    function printme() { //printMain为要打印的dom元素 window.document.body.innerHTML = document.getElementById( ...

  6. go xml 序列化

    /** 序列化 */ package main import ( "encoding/xml" "fmt" ) // Person 结构 type Person ...

  7. 过滤条件的时候用between和<>的区别

    无论是sqlsever还是oracle都支持between函数, 2个函数的基本语法是 WHERE A BETWEEN 1 AND 2/ WHERE A >=1 AND A <=2 ,be ...

  8. PHP 将数据从 Laravel 传送到 vue 的四种方式

    在过去的两三年里,我一直在研究同时使用 Vue 和 Laravel 的项目,在每个项目开发的开始阶段,我必须问自己 “我将如何将数据从 Laravel 传递到 Vue ?”.这适用于 Vue 前端组件 ...

  9. Spring框架学习笔记(7)——Spring Boot 实现上传和下载

    最近忙着都没时间写博客了,做了个项目,实现了下载功能,没用到上传,写这篇文章也是顺便参考学习了如何实现上传,上传和下载做一篇笔记吧 下载 主要有下面的两种方式: 通过ResponseEntity实现 ...

  10. Cache地址映射

    原理:程序访问局部性         在较短时间内由程序产生的地址往往集中在存储器逻辑地址空间的很小范围内         时间:在一小段时间内,最近被访问过的程序和数据很可能再次被访问       ...