目录
前言
标签
- select
- insert|update|delete
参数
resultMap
cache
自定义缓存
# 加入战队
微信公众号
前言
映射器之前我们已经提到了, 是 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 标签中. 新增没有.
- ```xml
- ```
- ## 级联
- 级联在我们平时开发中是最常见的. 我们通过 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
加入战队
# 加入战队
微信公众号
来源: https://www.cnblogs.com/zhangxinhua/p/11997434.html