Cet article est la connaissance des problèmes de cartographie des cours d'entités et de table dans Mybatis qui vous a été apporté par l'éditeur. L'apprentissage de ce tutoriel peut nous aider rapidement à résoudre le problème de conflit des différents noms de champ et des noms d'attribut de classe d'entités. Les amis qui en ont besoin, jetons un coup d'œil!
1. Préparez les tables et les données à utiliser pour la démonstration
Créer des ordres de table (ORDAND_ID int primaire clés auto_increment, order_no varchar (20), order_price float); insérer dans les commandes (ordonnance_no, ordre_price) ('aaaa', 23); insérer dans les commandes (ordonnance_no, ordre_prit 22);2. Définir les cours d'entité
package me.gacl.domain; / *** @author gacl * Définissez la classe d'entité correspondant à la table des commandes * / classe publique Order {/ *** Créer des ordres de table (Order_ID int primaire clés auto_increment, Order_No Varchar (20), Order_Price Float); * /// le nom d'attribut dans la classe de l'ordre et le nom de champ dans le tableau des ordres est différentiel. // id ===> order_idprivate String OrderNo; // ORDERNO ===> ORDRE_NOPVIVATE PRIX FLOT; // prix ===> ORDRE_PRIBRIBLIC INT GETID () {return id;} public void setid (int id) {this.id = id;} public String getOrderNo () {return orderNo;} public void setOrderNo (String OrderNo) {this.OrderNo = OrderNo {this.price = prix;} @ OverRidepublic String toString () {return "order [id =" + id + ", orderNo =" + orderNo + ", prix =" + prix + "]";}}3. Écrivez le code de test
3.1. Écrivez un fichier de mappage SQL XML
1. Créez un fichier OrderMapper.xml. Le contenu d'OrderMapper.xml est le suivant:
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Mappeur public "- // mybatis.org//dtd Mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- Spécifiez un espace de noms unique pour ce mamer. La valeur de l'espace de noms est conventionnellement définie sur le nom du package + le nom du fichier de mappage SQL, de sorte que la valeur de l'espace de noms peut être garantie pour être unique
Par exemple, namespace = "me.gacl.mapping.ordermapper" est me.gacl.mapping (nom du package) + OrderMapper (fichier OrderMapper.xml pour supprimer le suffixe)
-> <mapper namespace = "me.gacl.mapping.orderMapper"> <! - Obtenez un objet d'ordre basé sur la requête ID. L'utilisation de cette requête ne peut pas interroger le résultat que nous voulons. Ceci est principalement dû au fait que le nom d'attribut de la classe d'entité ne correspond pas au nom de champ de la base de données, de sorte que l'enregistrement correspondant ne peut pas être interrogé -> <select id = "getOrderbyid" ParameterType = "int" resultType = "me.gacl.domain.order"> SELECT * En utilisant cette requête, nous pouvons normalement interroger le résultat que nous voulons. En effet, nous donnerons à la requête un alias avec le même alias que le nom d'attribut de classe d'entité, afin que le nom d'attribut de la classe d'entité et le nom de champ dans le résultat de la requête puissent correspondre un par un -> <select id = "Selectorder" ParameterType = "int" ResultType = "me.gacl.domain.order"> SELECT ORDRE_ID, ORDE_NOO order_id = # {id} </lect> <! - Obtenez un objet d'ordre basé sur la requête ID. En utilisant cette requête, nous pouvons interroger le résultat que nous voulons normalement. En effet <SultMap> --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Column = "ORDER_ID" /> <! - Utilisez l'attribut de résultat pour map les champs de clés non primaires -> <résultat propriété = "OrderNo" colonnes = "Order_No" /> <Result Property = "Price" Column = "Order_price" /> <Result Property = "Price" Column = "Order_Price" /> <ResultMap> </ Mapper>2. Enregistrez le fichier de mappage OrderMapper.xml dans le fichier conf.xml
<mappers> <! - Enregistrez le fichier OrderMapper.xml. L'Ordremapper.xml est situé dans le package me.gacl.mapping, donc la ressource est écrite comme moi / gacl / mapping / ordermapper.xml -> <mapper ressource = "me / gacl / mapping / ordermapper.xml" /> </ mAperS>
3.2. Écrire un code de test unitaire
package me.gacl.test; import me.gacl.domain.order; import me.gacl.util.mybatisutil; import org.apache.ibatis.session.sqlSession; import org.junit.test; public class test2 {@TestPublic Void TestGetOrdById () {Sqlsession SQLSSession = MyBatisUtil.getsqlSession (); / *** La chaîne d'identification pour mapping sql, * me.gacl.mapping.orderMapper est la valeur de l'attribut d'espace de noms de la balise de mappeur dans le fichier OrderMapper.xml, * GetOrderById est la valeur d'attribut id de la balise de sélection. Grâce à la valeur d'attribut ID de la balise de sélection, vous pouvez trouver le SQL à exécuter * / string instruction = "me.gacl.mapping.orderMapper.getOrderByid"; // mappant l'objet d'identification SQL // Exécuter le fonctionnement de la requête et résume automatiquement le résultat de la requête dans un objet de commande et renvoie la commande de commande = SQLSession.Selectone (Statement, 1); // En utilisant SQLSession Execute SQL, vous devez fermer SQLSESIONSQLSESSION.CLOSE (); System.out.println (ordre); // Résultat d'impression: null, c'est-à-dire qu'aucun enregistrement correspondant n'a été trouvé} @TestPublic void testGetOrderById2 () {SqlSession SqlSession = MyBatisUtil.getsqlSession (); / *** Map Sql Identification String, * me.gaclmaping.OrderMapper est la valeur de l'espace de nom du nom de MAPPL. Fichier OrderMapper.xml, * Selectorder est la valeur d'attribut ID de la balise de sélection. Grâce à la valeur d'attribut ID de la balise de sélection, vous pouvez trouver le SQL à exécuter en utilisant la valeur d'attribut ID de la balise de sélection * / string instruction = "me.gacl.mapping.orderMapper.Selectorder"; // mappant l'identité SQL String // Exécuter le fonctionnement de la requête et encapsule automatiquement le résultat de la query / / return l'ordre de l'ordre = Avec ID 1 dans le tableau des ordres // Après avoir exécuté SQL à l'aide de SQLSession, vous devez fermer SQLSESIONSQLSESSION.CLOSE (); System.out.println (Order); // Imprimer Résultat: Ordre [id = 1, OrderNO = AAAA, Price = 23.0]} @ TestPublic void TestGetOrderById3 () {SqlSession SqlSession = MyBatisUtil.getsqlSession (); / *** Map SQL String, * me.gacl.mappage de la balise de mappeur dans le fichier OrderMapper.xml, * SelectorderResultMap est la valeur d'attribut ID de la balise de sélection. Grâce à la valeur d'attribut ID de la balise de sélection, le SQL à exécuter peut être trouvé * / string instruction = "me.gacl.mapping.orderMapper.selectorderResultMap"; // mappant l'objet d'identité SQL // EXECUTER FORMATION DE QUERY, et encapsule automatiquement le résultat de la requête dans un objet de commande et la commande de retour = SQLSession.selectone (instruction, 1); Tableau // Après avoir utilisé SQLSession pour exécuter SQL, vous devez fermer SQLSESIONSQLSESSESSE.CLOSE (); System.out.println (Order); // Imprimer Résultat: Ordre [id = 1, OrderNO = AAAA, Price = 23.0]}}Résultats de l'exécution des tests unitaires:
1. La méthode TestGetOrderByid renvoie un null après avoir exécuté la requête.
2. Après que la méthode TestGetOrderById2 et la méthode TestGetOrderById3 exécutent la requête, vous pouvez obtenir normalement le résultat souhaité.
4. Résumé
Le code de test ci-dessus démontre le problème que lorsque le nom d'attribut dans la classe d'entité et le nom de champ dans le tableau sont incohérents, les résultats correspondants ne peuvent pas être interrogés lors de l'utilisation de MyBatis pour les opérations de requête et deux méthodes sont adoptées pour le problème:
Solution 1: Définissez l'alias du nom de champ dans l'instruction SQL Query, de sorte que l'alias du nom de champ est cohérent avec le nom d'attribut de la classe d'entité, afin que le nom de champ de la table puisse correspondre un par un au nom d'attribut de la classe d'entité. Cette méthode résout la relation de mappage entre le nom de champ et le nom d'attribut en définissant Alias dans l'instruction SQL.
Solution 2: Map la correspondance individuelle entre les noms de champ et les noms d'attribut de classe d'entité par mappage. Cette méthode utilise la solution fournie par MyBatis pour résoudre la relation de mappage entre les noms de champ et les noms d'attributs.