Maison  >  Article  >  Java  >  Explication détaillée de l'exemple de chargement paresseux de MyBatis

Explication détaillée de l'exemple de chargement paresseux de MyBatis

零下一度
零下一度original
2017-06-25 10:38:131294parcourir

1. Qu'est-ce que le chargement paresseux

resultMap peut réaliser une cartographie avancée (en utilisant l'association et la collection pour obtenir un- mappage un à un et un à plusieurs), l'association et la collection ont une fonction de chargement paresseux.

Exigences :

Si vous interrogez la commande et associez des informations utilisateur à la requête. Si nous interrogeons d'abord les informations de commande, nous pouvons répondre aux exigences. Lorsque nous devons interroger les informations utilisateur, nous pouvons ensuite vérifier les informations utilisateur. Interroger des informations utilisateur à la demande est un chargement paresseux.

Chargement paresseux : interrogez d'abord une seule table, puis effectuez des requêtes associées à partir de tables associées si nécessaire, ce qui améliore considérablement les performances de la base de données, car interroger une seule table est plus rapide que d'interroger plusieurs tables de manière associée.

2. Utiliser l'association pour implémenter le chargement différé

2.1 Exigences

Interroger les commandes et associer les informations utilisateur de requête

2.2mapper.xml

Il est nécessaire de définir les instructions correspondant aux deux méthodes mapper.

(1) Interroger uniquement les informations de commande

SELECT * FROM commandes

Dans l'instruction de requête d'ordreUtiliser l'association pour retarder le chargement (exécution) de l'instruction suivante (Informations utilisateur de requête associées).

    <!-- 查询订单关联查询用户  --><select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">SELECT * FROM orders</select>

(2) Interroger les informations utilisateur par association

Utilisez l'id_utilisateur dans les informations de commande demandées ci-dessus pour interroger les informations utilisateur par association

Utilisez findUserById

    <select id="findUserById" parameterType="int" resultType="user">select * from user where id=#{value}</select>

dans UserMapper.xml. Exécutez d'abord findOrdersUserLazyLoading Lorsque vous devez interroger l'utilisateur, exécutez fingUserById. La configuration d'exécution du chargement paresseux sera exécutée via le. définition de resultMap debout.

2.3 Chargement paresseux de resultMap

Utilisez select en association pour spécifier l'identifiant de l'instruction à exécuter par chargement paresseux.

    <!-- 延迟加载的resultMap  --><resultMap type="joanna.yan.mybatis.entity.Orders" id="OrdersUserLazyLoadingResultMap"><!-- 1.对订单信息进行映射配置 --><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"/><!-- 2.实现对用户信息进行延迟加载 --><!-- select:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement) 
               要使用UserMapper.xml中findUserById完成根据用户id(user_id)用户信息的查询,
               如果findUserById不在本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.user_id = user.id)sex
             FROM orders--><association property="user" javaType="joanna.yan.mybatis.entity.User"select="joanna.yan.mybatis.mapper.UserMapper.findUserById" column="user_id"></association></resultMap>

2.4mapper.java

    //查询订单关联查询用户,用户信息时延迟加载public List<Orders> findOrdersUserLazyLoading() throws Exception;

2.5 Test

2.5.1 Idée de test

(1) Exécutez la méthode de mappage ci-dessus (findOrdersUserLazyLoading) et appelez en interne findOrdersUserLazyLoading dans joanna.yan.mybatis.mapper.OrdersCustomMapper pour interroger uniquement les informations sur les commandes (table unique).

(2) Dans le programme, parcourez la liste interrogée à l'étape précédente. Lorsque nous appelons getUser() dans Orders, le chargement paresseux commence.

(3) Retardez le chargement et appelez la méthode findUserById dans UserMapper.xml pour obtenir des informations sur l'utilisateur.

2.5.2 Configuration du chargement différé

Mybatis n'active pas le chargement différé par défaut et doit être configuré dans SqlMapConfig.xml.

Configuré dans le fichier de configuration principal de mybatis :

lazyLoadingEnabled, agressifLazyLoading

Élément de réglage

设置项

描述

允许值

默认值

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。

true | false

false

aggressiveLazyLoading

当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。

true | false

true

Description

Valeurs autorisées

Valeur par défaut

lazyLoadingEnabled

     <!-- 全局配置参数,需要时再设置  --> <settings> <!-- 打开延迟加载的开关  --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 将积极加载改为消极加载即按需要加载 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>

Définir le chargement paresseux globalement. S'il est défini sur « false », tous ceux associés seront chargés initialement.

true | false

false

aggressiveLazyLoading

Lorsqu'ils sont définis sur 'true', les objets chargés paresseusement peuvent être entièrement chargés avec n'importe quel attribut paresseux. Sinon, chaque propriété est chargée à la demande.

    @Testpublic void findOrdersUserLazyLoadingTest() throws Exception{
        SqlSession sqlSession=sqlSessionFactory.openSession();
        OrdersCustomMapper ordersCustomMapper=sqlSession.getMapper(OrdersCustomMapper.class);
        List<Orders> list=ordersCustomMapper.findOrdersUserLazyLoading();for (Orders orders : list) {//执行getUser()去查询用户信息,这里实现按需加载User user=orders.getUser();
            System.out.println(user);
        }
        sqlSession.close();
    }

true | false

true

Configuré dans SqlMapConfig.xml :

2.5.3 Code de test

2.6 Réflexions sur le chargement paresseux

Comment implémenter cela sans utiliser la fonction de chargement paresseux en association et en collection fournie par mybatis Chargement paresseux ?

La méthode de mise en œuvre est la suivante :

Définir deux méthodes de mappage : (1) Interroger la liste de commandes (2) Interroger les informations utilisateur en fonction sur l'identifiant de l'utilisateur Idée d'implémentation : interrogez d'abord la première méthode du mappeur et obtenez la liste des informations de commande Dans le programme de test, appelez la deuxième méthode du mappeur si nécessaire pour interroger les informations de l'utilisateur. En bref, en utilisant la méthode de chargement paresseux, interrogez d'abord du SQL simple (de préférence une seule table, mais également des requêtes associées), puis chargez d'autres informations pour les requêtes associées si nécessaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn