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.
Interroger les commandes et associer les informations utilisateur de requête
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.
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>
//查询订单关联查询用户,用户信息时延迟加载public List<Orders> findOrdersUserLazyLoading() throws Exception;
(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
(3) Retardez le chargement et appelez la méthode findUserById dans UserMapper.xml pour obtenir des informations sur l'utilisateur.
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
|
Description
|
Valeurs autorisées |
Valeur par défaut |
||||||||||||
lazyLoadingEnabled <!-- 全局配置参数,需要时再设置 --> <settings> <!-- 打开延迟加载的开关 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 将积极加载改为消极加载即按需要加载 --> <setting name="aggressiveLazyLoading" value="false"/> </settings> Copier après la connexion | 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(); } Copier après la connexion true | false
|
true |
2.5.3 Code de test
2.6 Réflexions sur le chargement paresseuxComment 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!