Mapper配置文件中除了增删改查等常见的操作外,还有以下几个重要的配置
1.sql
这个元素可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中。比如:
<sql id="condition"> <where> <if test="fstate != null and fstate!=‘‘"> <![CDATA[and fstate = #{fstate}]]> </if> </where> <![CDATA[order by fid desc]]> </sql> <select id="list" resultType="User" parameterType="User"> <![CDATA[ select fid from SYS_USER]]> <include refid="condition" /> </select>
2.cache
MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。除了可以在主配置文件的settings属性中配置cacheEnabled为true来开启全局的缓存外,你亦可以在
mapper配置文件配置<cache/>属性来开启局部的缓存。
只需要在你的sqlSQL 映射文件中添加一行: <cache/>
字面上看就是这样。这个简单语句的效果如下:
a.映射语句文件中的所有 select 语句将会被缓存。
b.映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
c.缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
d.根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
e.缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
f.缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
当然所有的这些属性都可以通过缓存元素的属性来修改。最后你也可以通过实现你自己的缓存或为其他第三方缓存方案 创建适配器来完全覆盖缓存行为。
备注:笔者将在后期讲解Mybatis整合Ehcache和memcache等常见的缓存技术
3.resultMap
resultMap是Mybatis中的高级映射,它可以让所有的多表连接变的值可以一次性还回
首先来看一个java实体bean
public class Topic { private String fid;// 主键 private String ftitle;// 标题 private String fcontent;// 内容 private List<Replay> replays;// 回复列表 private User author; //作者 /** * getter and setter ... * */ }
下面是resultMap中的每一个配置项
1) constructor - 类在实例化时,用来注入结果到构造方法中
1.1) idArg - ID 参数;标记结果作为 ID 可以帮助提高整体效能
1.2) arg - 注入到构造方法的一个普通结果
ex:
<constructor> <idArg column="fid" javaType="int"/> <arg column="username" javaType="String"/> </constructor>
3)id – 一个 ID 结果;标记结果作为 ID 可以帮助提高整体效能
4)result – 注入到字段或 JavaBean 属性的普通结果
5)association 关联关系,比如上面Topic实体bean中的author属性
ex:
<association property="author" javaType="Author"> <id property="id" column="author_id"/> <result property="username" column="author_username"/> <result property="email" column="author_email"/> </association>
6)collection 集合关系,比如上面Topic实体bean中的replays属性,属性类型为List
ex:
<collection property="replays" ofType="Replay"> <id property="fid" column="post_id"/> <result property="fcontent" column="replay_fcontent"/> <association property="author" javaType="Author"/> </collection>
整合:
<resultMap id="detailedTopic" type="Topic"> <constructor> <idArg column="topic_id" javaType="int"/> </constructor> <result property="ftitle" column="topic_title"/> <association property="author" javaType="Author"> <id property="id" column="author_id"/> <result property="username" column="author_username"/> <result property="email" column="author_email"/> </association> <collection property="replays" ofType="Replay"> <id property="fid" column="replay_id"/> <result property="fcontent" column="replay_fcontent"/> <association property="author" javaType="Author"/> </collection> </resultMap>备注:上面的配置中property为属性名称,column为数据库字段或者别名
有了如上的resultMap,你可以在查询Topic的时候将其所有的属性一次还回 (连表多表查询),直接将select的还回值设为resultMap即可。(设置了resultMap,无需再设置resultType)
这就是Mybatis高级映射的魅力,让一切复杂的东西变的简单!
欢迎大家一起讨论学习!
有用的自己收!
记录与分享,让你我共成长!欢迎查看我的其他博客;我的博客地址:http://blog.csdn.net/caicongyang