mybatis高级知识(三)&延迟加载

1延迟加载

1.1什么是延迟加载

resultMap可以实现高级映射(使用association collect 实现一对一 及一对多映射)association collect 具备延迟加载的功能
如果:
    需求
    如果查询订单并且关联查询用户信息 如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户
    信息,把对用户信息的按需去查询就是延迟加载
    延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多
    张表速度快

1.2使用association实现延迟加载

    1.2.1需求
    查询订单并且关联用户信息
    1.2.2mapper.xml
    需要定义俩个mapper的方法对应的statement
    1.先查询订单信息
    select * from orders
    在查询订单的statement中使用association去延迟加载(执行)下边的statement(关联查询哟用户信息) 
    <select id="finOrdersUserLazyLoading"  resultMap="OrdersUserLazyLoadingResultMap">
        select * from orders
    </select>           

2.关联查询用户信息

        通过上边查询到的订单信息中user_id去关联查询用户信息       
        使用UserMapper.xml中的findByID
        <select id="findUserById" parameterType="int" resultType="User">
            select * from user where id=#{vaule}            
        </select>
        上边先去执行 findOrderUserLazyLoading,当需要去查询用户的时候在去执行findUserByID通过resultMap
        的定义将延迟加载进行配置起来
    1.2.3延迟加载的配置
使用association中的select指定延迟加载去执行statement的id
            <resultMap type="mybatis.po.Orders" id="OrdersUserLazyLoadingResultMap">
            <!--对订单信息进行映射配置-->
            <id column="id" property="id"/>
            <result column="user_id" property="userId"/>
            <result column="number" property="nubmer"/>
            <result column="createtime" property="createtime"/>
            <!-- 实现对用户信息进行延迟加载
                select:指定延迟加载需要执行的statement的id(在根据user_id查询用户信息的statement)
                要使用userMapper.xml中findUserById完成根据用户id(user_id)用户信息的查询如果findUserById不在本
                mapper中需要在mapper中前边加namespace
                column:订单信息中关联用户信息查询的列,是user_id
                关联查询的sql理解为
                select orders.*,
                (select username from user where orders.user_id=user.id)username,
                (select sex from user where orders.uer_id=user.id)sexs
                from orders
                -->
                <associoation property="user" javaType="mybatis.po.User" select="mybatis.mapper.UserMapper.findUserById"
                column="user_id">
                <!--实现对用户信息进行延迟加载-->
                </associtation>
            </resultMap> 
    1.2.4 查询订单关联用户,用户信息进行延迟加载
        public findOrderUserLazyLoading()throws Exception
    1.2.5测试
    测试思路
    1.执行上面的mapper方法 findOrderUserLazyLoading()内部调用 mybatis.mapper.OrdersMapperCustom中的
    findOrderUserLazyLoading只查询orders信息(单表)
    2.在程序中遍历上一步查询出的List<Orders>,当我们调用orders中的getUser方法时,开始进行延迟加载
    3.延迟加载,去调用UserMapper.xml中的findUserByID这个方法获取用户信息

    1.2.6延迟加载配置
mybatis默认没有开启延迟加载需要在SqlConfig.xml中setting配置
         打开延迟加载开关

            <settings>
                    <!-- 打开延迟加载的开关 -->
                    <setting name="lazyLoadingEnabled" value="true" />
                    <!-- 将积极加载改为消息加载即按需加载 -->
                    <setting name="aggressiveLazyLoading" value="false"/>
                </settings>
            lazyLoadingEnabled:设置懒加载,默认为false。如果为false:则所有相关联的都会被初始化加载。

            aggressiveLazyLoading:默认为true。当设置为true时,懒加载的对象可能被任何懒属性全部加载;否则,每个属性按需加载。
    1.2.7查询订单关联查询用户,用户信息使用延迟加载
public void tesfindOrderUserLazyLoading()  throws Exception{
                    SqlSession sqlSession=sqlSessionFactory.openSession();
                    //创建UserMapper对象,mybatis自动生成mapper代理对象
                    OrderMapperCustom oderMapperCustom=sqlSession.getMapper(OrderMapperCustom.class))

                    //调用mapper的方法
                    List<Orders> listr=orderMapperCusto findOrderUserLazyLoading() ;
                    //遍历订单列表
                        for(Orders orders: list){
                            //执行getUser()查询用户信息,这里实现延迟加载
                            User user=orders.getUser();
                                System.out.print(list);
                        }

                    sqlSession.close();
        1.2.8延迟加载思考
            不使用mybatis提供的association及collection中的延迟加载功能,如何实习延迟加载
            实现方法
            定义俩个mapper方法
            1.查询订单列表
            2.提供用户id查询用户信息
            实现思路
            先去查询一个mapper方法。获取订单信息列表
            在程序中(service),按需去调用第二个mapper方法去查询用户信息。

            总之
            使用延迟加载方法,先去查询简单的sql(最好单表,也可以关联查询)再去按需要加载关联查询的其他信息

延迟加载配置

mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置。

在mybatis核心配置文件中配置:lazyLoadingEnabled、aggressiveLazyLoading

设置项 描述 允许值 默认值
lazyLoadingEnabled 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载 true/false false
aggressiveLazyLoading 当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 true/false true

猜你喜欢

转载自blog.csdn.net/qq_39128354/article/details/81428149