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>

mybatis开启二级缓存和懒加载,类型别名,类都简称

 一对一:

mybatis开启二级缓存和懒加载,类型别名,类都简称

 

开启二级缓存:

<!-- 开启User对象查询的二级缓存。 -->
	<cache
	eviction="FIFO"
	flushInterval="60000"
	size="512"
	readOnly="true"
	/>

 

mybatis开启二级缓存和懒加载,类型别名,类都简称 

mybatis开启二级缓存和懒加载,类型别名,类都简称

 mybatis开启二级缓存和懒加载,类型别名,类都简称

在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>

 

 

类都简称别名:

mybatis开启二级缓存和懒加载,类型别名,类都简称