[TOC]java
前言
- 映射器以前咱们已经提到了,是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默认是不开启二级缓存的。开启的方式也很简单
<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
-
加入战队redis
<span id="addMe">加入战队</span>
微信公众号
