mybatis精讲(五)--映射器组件
前言
- 映射器之前我们已经提到了,是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精讲(五)--映射器组件的更多相关文章
- Mybatis精讲(一)---环境配置及架构梳理
		
目录 简介 ORM模型 Hibernate Ibatis 环境搭建 jar 配置 xml方式配置 代码方式配置 两种方式对比 Mybatis结构 源码解读xml环境加载 映射器解读 Ibatis # ...
 - mybatis精讲(三)--标签及TypeHandler使用
		
目录 话引 XML配置标签 概览 properties 子标签property resource 程序注入 settings 别名 TypeHandler 自定义TypeHandler EnumTyp ...
 - Mybatis精讲(二)---生命周期
		
目录 回顾 SqlSessionFactoryBuilder SqlSessionFactory openSessionFromDataSource Executor SqlSession Mappe ...
 - Could not find resource——mybatis 找不到映射器xml文件
		
今天用IDEA写Mybatis的时候,测试报了如图所示的错,恶心死我了,后来解决了,总结一下,防止下回跳坑,当然,也是做一个分享,如果有朋友遇到这个错,希望有所帮助 Error parsing SQL ...
 - IDEA Mybatis 找不到映射器xml文件
		
用IDEA新建了一个测试MyBatis工程,工程目录如下 其中config是MyBatis的配置文件,内容如下 <?xml version="1.0" encoding=&q ...
 - mybatis精讲(四)--ObjectFactory
		
目录 前言 mybatis的ObjectFactory 源码 setProperties create instantiateClass 使用场景 # 加入战队 微信公众号 前言 ObjectFact ...
 - mybatis精讲(六)--二级缓存
		
目录 简介 配置 源码 CachingExecutor 自定义二级缓存 # 加入战队 微信公众号 简介 上一章节我们简单了解了二级缓存的配置.今天我们详细分析下二级缓存以及为什么不建议使用二级缓存. ...
 - mybatis精讲(七)--动态sql
		
目录 常用标签 if元素 choose元素 trim元素 forearch bind元素 在我们传统的开发中我们会通过拼接sql达到数据库的操作.java中的拼接不仅效率低下而且代码很长不易维护.而M ...
 - mybatis 找不到映射器xml文件 (idea)
		
原因是: idea不会编译src的java目录的xml文件 所以解决思路就是:将IDEA maven项目中src源代码下的xml等资源文件编译进classes文件夹 具体操作方法就是:配置maven的 ...
 
随机推荐
- Feeling after reading《Jane Eyre》
			
Yesterday I read and listened over the book named <Jane Eyre>, the book is very thoughtful, th ...
 - 学习笔记45_log4net日志
			
1.配置添加一个App.config *对于网站,就使用web.config ***对于App.config和web.config的配置,在表现形式上是不一致的,使用的时候应该在网上查对于的配置设置. ...
 - EffectiveJava-4
			
一.基本类型优先于装箱基本类型 Java的基本数据类型也叫做内置类型是java语言本身提供的数据类型,是引用其他类型的基础.Java的基本数据类型分为:整数类型.浮点类型.字符类型.布尔类型这四个类型 ...
 - raw文件转mha文件
			
raw格式 在体数据(volume)中,经常会遇到raw文件,raw文件就是其实就是所有体素组成的文件,raw文件必须还有一些描信息才能用(因为得知道数据的size,type,spacing等),就像 ...
 - 2018年7月份前端开源软件TOP3
			
基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin FastAdmin 详细介绍 FastAdmin是一款基于 ThinkPHP5 + Bootstrap 的极速后台 ...
 - 0911作业-if  while循环小练习
			
输入姑娘的年龄后,进行以下判断: 如果姑娘小于18岁,打印"不接受未成年" 如果姑娘大于18岁小于25岁,打印"心动表白" 如果姑娘大于25岁小于45岁,打印& ...
 - 易初大数据    spss    2019年10月31日    wangqingchao
			
---恢复内容开始--- 1.描述性统计分析方法是指应用分类.制表.图形及概括性数据指标来概括数据分析特征的方法. 2.而推断性统计分析方法则是通过随机抽样,应用统计方法把从样本数据得到的结论推广到总 ...
 - 2019年10月13日  计算机英语习题  wangqingchao
			
Match the explanations in Column B with words and expressions in Columna. (搭配每组中意义相同的词或短语) Types of ...
 - PHP获取图片每个像素点
			
PHP获取图片每个像素点<pre> $i = imagecreatefromjpeg("test.jpg"); //图片路径 for ($x = 0; $x < ...
 - 轻松实现C/C++各种常见进制相互转换
			
其它进制转为十进制 在实现这个需求之前,先简单介绍一个c标准库中的一个函数: long strtol( const char *str, char **str_end, int base); 参数详细 ...