查询数据库时候,尽量使用单表查询提示性能,快啊~~~~~但是如果有多表联合和,那就可以使用延迟记载。首先说,在没得余地的情况下试用,是有点优势。
可以简单理解为,只有在使用的时候,才会发出sql语句进行查询。
例子:一开始查询单表Student ,当需要班级class时候,再查询class信息
2、实现mybatis延迟加载
2.1设置延迟加载
设置项 |
描述 |
允许值 |
默认值 |
lazyLoadingEnabled |
全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。 |
true | false |
false |
aggressiveLazyLoading |
当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 |
true | false |
true |
<?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"> <!--命名空间:分类管理sql隔离,方便管理--> <mapper namespace="com.ycy.mybatis.dao.OrdersCustomMapper"> <!--查询订单 一对多关联(订单与订单详情)--> <select id="findOrderAndUserLazyLoding" resultMap="orderAndUserLazyLodingMap" > SELECT o.* FROM orders o </select> <!--查询订单-用户 延迟加载 一对多关联(订单与订单详情)--> <resultMap id="orderAndUserLazyLodingMap" type="com.ycy.mybatis.module.Orders"> <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"/> <association property="user" select="com.ycy.mybatis.dao.UserMapper.getUserById" column="user_id"> </association> </resultMap> </mapper>
UserMapper的查询方法
<?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"> <!--命名空间:分类管理sql隔离,方便管理--> <mapper namespace="com.ycy.mybatis.dao.UserMapper"> <!--id标示一个sql语句,一个Statement,封装为一个MapperStatement--> <!--parameterType:传入参数类型;resultType:输出结果类型,指定映射的pojo--> <select id="getUserById" parameterType="int" resultType="User"> SELECT * FROM USER WHERE id=#{id} </select> </select> </mapper>
2.2mapper.java
package com.ycy.mybatis.dao; import com.ycy.mybatis.module.Orders; import java.util.List; /** * Created by Administrator on 2015/9/9 0009. */ public interface OrdersCustomMapper { //一对一延迟加载 public List<Orders> findOrderAndUserLazyLoding() throws Exception; }2.3延迟加载测试
在测试时候断点到输出11的地方,看看里面是否加载user,然后再往下走,看看是否加载user。直达你加载user的时候才会调用延迟加载,另外开始查询。
package com.ycy.mybatis.test; import com.ycy.mybatis.dao.OrdersCustomMapper; import com.ycy.mybatis.module.Orderdetail; import com.ycy.mybatis.module.Orders; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; /** * Created by Administrator on 2015/8/31 0031. */ public class MybatisTest8 { private SqlSessionFactory sqlSessionFactory = null; @Before public void before() throws IOException { String resource="SqlMapConfig.xml"; InputStream in = Resources.getResourceAsStream(resource); sqlSessionFactory= new SqlSessionFactoryBuilder().build(in); } //一对一 订单-用户详情 @Test public void findOrderAndDetail() throws Exception { SqlSession sqlSession=sqlSessionFactory.openSession(); OrdersCustomMapper ordersCustomMapper= sqlSession.getMapper(OrdersCustomMapper.class); List<Orders> ordersList= ordersCustomMapper.findOrderAndUserLazyLoding(); System.out.println(11); for (Orders ordersCustom : ordersList) { System.out.println(ordersCustom.getUser().getUsername()); } sqlSession.close(); } }
1、延迟加载:延迟加载实现的方式多种多样,在只查询单表就能满足需求时候,再查询其他信息,提供数据库查询性能时候使用延迟加载。一般在mvc的service层实现。例如:假想一个OrderService,查询用户信息时候使用延迟加载,这样就避免开启多个查询去查询user信息。但是:然并卵,你也可以一起把你需要的信息直接联合查询出来。
List<Orders> ordersList= ordersCustomMapper.findOrderAndUserLazyLoding(); System.out.println(11); for (Orders ordersCustom : ordersList) { System.out.println(ordersCustom.getUser().getUsername()); }
2、resultType:
作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。
场合:常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。
3、resultMap:
使用association和collection完成一对一和一对多高级映射
association:作用:将关联查询信息映射到一个pojo类中。
场合:为了方便获取关联信息可以使用association将关联订单映射为pojo,比如:查询订单及关联用户信息。
collection:作用:将关联查询信息映射到一个list集合中。
场合:为了方便获取关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块和功能,可使用collection将模块和功能列表映射到list中