MyBatis Review——延时加载

简介:     在MyBatis中使用resultMap可以实现延迟加载,在collection和association标签可以配置延迟加载功能。   1,开启延迟加载配置          2,示例association配置       使用select配置延迟加载时候执行的sql语句。


    在MyBatis中使用resultMap可以实现延迟加载,在collection和association标签可以配置延迟加载功能。


   1,开启延迟加载配置


       

<settings>
		<!-- 打开延迟加载的开关 -->
		<setting name="lazyLoadingEnabled" value="true" />
		<!-- 将积极加载改为小计加载即按需加载-->
		<setting name="aggressiveLazyLoading" value="false" />
	</settings>

  2,示例association配置


<!-- 查询订单关联用户,用户信息需要延迟加载 -->
	<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserLazyLoading">
		<!-- 对用户信息进行延迟加载 -->
		<!-- 对订单信息进行映射配置 -->
		<id column="id" property="id" />
		<result column="user_id" property="userId" />
		<result column="number" property="number" />
		<result column="createtime" property="createtime" />
		<result column="note" property="note" />
		
		<!-- 
			select:指定延时加载需要执行的statement的id(根据user_id查询用户信息)
				要事勇UserMapper.xml中的findUserById来完成用户信息的查询
			column:订单的信息中关联用户信息查询的列,是user_id
			
			SELECT
				orders.*, (
					SELECT
						username
					FROM
						USER
					WHERE
						`user`.id = orders.user_id
				) username, (
					SELECT
						sex
					FROM
						USER
					WHERE
						`user`.id = orders.user_id
				)sex
			
			FROM
				orders
	
		 -->
		<association property="user" javaType="cn.itcast.mybatis.po.User" select="cn.itcast.mybatis.mapper.UserMapper.findUserById" column="user_id">
		</association>
	</resultMap>

      使用select配置延迟加载时候执行的sql语句。


findUserById:


<select id="findUserById" parameterType="int"
		resultType="cn.itcast.mybatis.po.User">
		SELECT * FROM user where id=#{value}
	</select>


查询配置:


<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoading">
		select * from orders
	</select>


测试方法:


@Test
	public void findOrdersUserLazyLoading() throws Exception {
		SqlSession sqlSession=sqlSessionFactory.openSession();
		//创建代理对象
		OrdersMapper ordersMapper=sqlSession.getMapper(OrdersMapper.class);
		//调用mapper的方法
		List<Orders> ordersList=ordersMapper.findOrdersUserLazyLoading();
		System.out.println(ordersList.size());
		for(Orders orders: ordersList ){
			User user=orders.getUser();
			System.out.println(user.getUsername());
		}
	}


debug:




      发出的查询语句如上,首先是从orders表中查询orders,之后读取用户信息,再去查询user表,这里查询的时候,因为自带一级缓存的效果,所以id=1的user只被查询了一次。





目录
相关文章
|
SQL 缓存 关系型数据库
MyBatis Review——查询缓存
一,查询缓存简介         mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。         mybaits提供一级缓存,和二级缓存。           一级缓存是SqlSession级别的缓存。
1478 0
|
缓存 Java 数据库连接
MyBatis Review——整合ehcache
     ehcache是一个分布式缓存框架,是hibernate中二级缓存的默认实现。     一,整合的思路       mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可:             mybatis和ehcache整合:m...
877 0
|
Java 数据库连接 mybatis
MyBatis Review——使用resultType和resultMap实现一对一查询
      例如:                  查询订单信息,关联查询创建订单的用户信息。      查询语句:              SELECT orders.*, USER .
1376 0
|
Java 数据库连接 mybatis
MyBatis Review——一对多关系映射配置
示例:             查询订单表及订单明细信息。 编写sql查询语句: SELECT orders.*, USER .username ,USER .sex, USER .address, orderdetail.
1038 0
|
Java 数据库连接 mybatis
MyBatis Review——多对多映射
示例:                 查询用户及用户购买商品信息。 sql语句: SELECT orders.*, USER .username ,USER .sex, USER .
941 0
|
Java 数据库连接 mybatis
MyBatis Review——加载mappers映射文件的三种方式
一,通过resource加载映射文件 二,通过mapper接口加载映射文件   三,批量加载映射文件
1332 0
|
Java 数据库连接 mybatis
MyBatis Review——输入输出映射
一,输入映射     mybatis的输入映射通过parameterType指定,可以为简单类型,包装类型,hashmap类型。           1,简单类型                     SELECT * FROM `user` where username li...
1099 0
|
SQL Java 数据库连接
MyBatis review(一)——常见配置及方法
最近change a new job,复习下mybatisO(∩_∩)O~~~ 一,#{} 与 ${} #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。
1514 0
|
SQL Java 程序员
MyBatis整体Review
一,整体结构   mybatis是一个持久层的框架,是apache下的顶级项目。   mybatis托管到goolecode下,再后来托管到github下(https://github.com/mybatis/mybatis-3/releases)。
1157 0
|
Java 数据库连接 mybatis
MyBatis Review——开发Dao的方法
一,原始Dao开发方法    需要编写的类:Dao接口及Dao接口的实现类。    使用逻辑:通过向Dao实现类中注入SqlSessionFactory,在方法体内部通过SqlSessionFactory创建SqlSession对象,再通过SqlSession对象操作statement。
1166 0