跳转至

鉴别器和缓存的配置

鉴别器#

鉴别器的用法相当于switch语句,作用是根据条件,把搜索的结果映射到对应的属性上面。

语法:

1
2
3
<discriminator javaType="int" column="draft">
    <case value="1" resultType="DraftPost"/>
</discriminator>

一个完整的例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<resultMap id="vehicleResult" type="Vehicle">
    <id property=”id” column="id" />
    <result property="vin" column="vin"/>
    <result property="year" column="year"/>
    <result property="make" column="make"/>
    <result property="model" column="model"/>
    <result property="color" column="color"/>
    <discriminator javaType="int" column="vehicle_type">
        <case value="1" resultType="carResult">
            <result property=”doorCount” column="door_count" />
        </case>
        <case value="2" resultType="truckResult">
            <result property=”boxSize” column="box_size" />
            <result property=”extendedCab” column="extended_cab" />
        </case>
        <case value="3" resultType="vanResult">
            <result property=”powerSlidingDoor” column="power_sliding_door" />
        </case>
        <case value="4" resultType="suvResult">
            <result property=”allWheelDrive” column="all_wheel_drive" />
        </case>
    </discriminator>
</resultMap>

这个例子当 vehicle_type 等于不同的值得时候,会映射不同的结果

把这个例子拆分之后的写法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<resultMap id="vehicleResult" type="Vehicle">
    <id property=”id” column="id" />
    <result property="vin" column="vin"/>
    <result property="year" column="year"/>
    <result property="make" column="make"/>
    <result property="model" column="model"/>
    <result property="color" column="color"/>
    <discriminator javaType="int" column="vehicle_type">
        <case value="1" resultMap="carResult"/>
        <case value="2" resultMap="truckResult"/>
        <case value="3" resultMap="vanResult"/>
        <case value="4" resultMap="suvResult"/>
    </discriminator>
</resultMap>

<resultMap id="carResult" type="Car">
    <result property=”doorCount” column="door_count" />
</resultMap>
<resultMap id="carResult" type="Car" extends=”vehicleResult”>
    <result property=”doorCount” column="door_count" />
</resultMap>
缓存#

默认情况下是没有开启缓存的,开启缓存,需要在Sql映射文件中添加如下语句

1
<cache/>

产生的效果:

  • 映射语句文件中的所有 select 语句将会被缓存
  • 映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存
  • 缓存会使用 Least Recently Used(LRU ,最近最少使用的)算法来收回
  • LRU:最近最少使用的:移除最长时间不被使用的对象
  • FIFO:先进先出:按对象进入缓存的顺序来移除它们
  • SOFT:软引用:移除基于垃圾回收器状态和软引用规则的对象
  • WEAK:弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象
  • 根据时间表(比如 no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序来刷新
  • 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用
  • 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

上面这些效果都可以通过cache的属性来指定

1
2
3
4
5
<cache
    eviction="FIFO"             //回收算法
    flushInterval="60000"       //刷新时间单位ms
    size="512"                  //缓存引用的大小
    readOnly="true"/>           //是否只读