mybatis开启二级缓存和懒加载,类型别名,类都简称
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 是用resource属性加载外部配置文件 -->
<properties resource="db.properties">
<!-- 如果外部配置文件有该属性,则内部定义属性被外部属性覆盖-->
<property name="jdbc.password" value="root123"/>
</properties>
<!-- 配置设置 -->
<settings>
<!-- 如果要使用延迟加载,就必须配置这两个属性 -->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 开启全局缓存,二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 类型别名 -->
<!-- 配置映射文件中使用的类型别名 -->
<typeAliases>
<!-- 给类型 com.igeek.crm.pojo.User取别名user-->
<typeAlias type="com.igeek.crm.pojo.User" alias="user"/>
<!-- 配置一个包,让该包中所有的类都是用简称 -->
<package name="com.igeek.crm.pojo"/>
</typeAliases>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url"
value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 注册映射文件 -->
<!-- 将映射文件配置到mybatis的配置文件中 -->
<mappers>
<!--
<mapper resource="sqlmap/UserMapper.xml"/>
-->
<!--
<mapper class="com.igeek.crm.mapper.UserMapper"/>
-->
<package name="com.igeek.crm.mapper"/>
</mappers>
</configuration>
懒加载:
<!-- 配置设置 -->
<settings>
<!-- 如果要使用延迟加载,就必须配置这两个属性 -->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="com.igeek.crm.mapper.UserMapper">
<!-- 开启二级缓存 -->
<cache/>
<!-- 查询语句 -->
<select id="queryByQueryVo" parameterType="QueryVo" resultType="User">
SELECT * FROM user WHERE username LIKE '%${user.username}%'
</select>
<!-- -->
<select id="queryUserCount" resultType="_int">
SELECT COUNT(*) FROM user
</select>
<!-- 配置一个resultMap解决一对多个问题 -->
<resultMap type="User" id="userOrderMap">
<!-- 配置用户主键 -->
<id column="id" property="id"/>
<!-- 配置普通属性 -->
<result column="username" property="username"/>
<result column="birthday" property="birthday"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
<!-- 映射一对多关系(映射集合) -->
<!-- javaType:配置集合类型 -->
<!-- ofType:配置集合内部的数据类型 -->
<collection property="orders" javaType="list" ofType="Order">
<!-- 映射主键 -->
<id column="oid" property="id"/>
<!-- 映射普通属性 -->
<result column="number" property="number"/>
<result column="createtime" property="createTime"/>
<result column="note" property="note"/>
</collection>
</resultMap>
<!-- 查询所有的用户以及他们的订单 -->
<select id="queryAllUserAndOrder" resultMap="userOrderMap">
SELECT
u.id,
u.username,
u.birthday,
u.sex,
u.address,
o.id oid,
o.number,
o.createtime,
o.note
FROM
`user` u
LEFT JOIN `orders` o ON u.id = o.user_id;
</select>
<select flushCache="false" id="queryUserById" resultType="User" parameterType="int">
select * from user where id = #{id}
</select>
</mapper>
一对多:
<!-- 关联映射 1对1 -->
<resultMap type="Order" id="orderUserMap">
<!-- order的主键 -->
<id column="id" property="id" />
<!-- 映射其他普通列 -->
<result column="user_id" property="userId" />
<result property="number" column="number" />
<result property="createTime" column="createTime" />
<!-- association :配置一对一属性 -->
<!-- property:Order里面的User属性名 -->
<!-- javaType:属性类型 -->
<!-- fetchType 可选的。有效值为 lazy和eager。 如果使用了,它将取代全局配置参数lazyLoadingEnabled。 -->
<association fetchType="eager" property="user" javaType="User" column="user_id" select="queryUserById"/>
</resultMap>
<select id="queryUserById" resultType="User" parameterType="int">
select * from user where id = #{id}
</select>
<!-- 关联映射1对1 -->
<select id="queryOrderUserResultMap" resultMap="orderUserMap">
SELECT
o.id,
o.user_id,
o.number,
o.createtime,
o.note
FROM
`orders` o
</select>
一对一:
开启二级缓存:
<!-- 开启User对象查询的二级缓存。 -->
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"
/>
在MyBatis中有flushCache、useCache这两个配置属性,分为下面几种情况:
(1)当为select语句时:
flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。
useCache默认为true,表示会将本条语句的结果进行二级缓存。
(2)当为insert、update、delete语句时:
flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。
useCache属性在该情况下没有。
上面的信息我是从MyBatis官方文档中找到的,会发现当为select语句的时候,如果没有去配置flushCache、useCache,那么默认是启用缓存的,所以,如果有必要,那么就需要人工修改配置,修改结果类似下面:
<select id="save" parameterType="XXXXXEO" statementType="CALLABLE" flushCache="true" useCache="false">
……
</select>
类都简称别名: