Dans le développement de projets, nous rencontrons souvent des situations où les noms de champ dans le tableau et les noms d'attribut des classes d'entités correspondantes de la table peuvent ne pas être exactement les mêmes. L'éditeur suivant vous montrera comment résoudre le problème de conflit des différents noms de champ et classes d'entités dans ce cas. Les amis intéressés apprendront ensemble.
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 ordres * / classe publique Order {/ *** Créer des ordres de table (Order_id int primaire clés auto_increment, Order_No Varchar (), 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 = "." Encoding = "UTF-"?> <! Doctype Mappeur public "- // mybatis.org//dtd mapper .//en" "http://mybatis.org/dtd/mybatis-mapper.dtd"><!-- Spécifiez un espace de noms unique pour ce mapper. La valeur de l'espace de noms est conventionnellement définie sur le nom du package + nom de fichier de carte SQL, de sorte que la valeur de l'espace de noms peut être garantie unique. Par exemple, namespace = "me.gacl.mapping.orderMapper" est me.gacl.mapping (nom du package) + OrderMapper (OrderMapper.xml Supplix de déménage
Un objet d'ordre est obtenu en fonction de la requête ID. L'utilisation de cette requête ne peut pas interroger le résultat que nous voulons. Cela 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, donc l'enregistrement correspondant ne peut pas être interrogé.
-> <select id = "getOrderByid" ParameterType = "int" resultType = "me.gacl.domain.order"> SELECT * dans les ordres où Order_id = # {id} </lect> <! - Un objet d'ordre est obtenu en fonction de la requête ID. En utilisant cette requête, nous pouvons normalement interroger le résultat que nous voulons.
En effet, nous donnerons l'alias de requête avec le même nom d'attribut 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 à un.
-> <select id = "Selectorder" ParameterType = "int" resultType = "me.gacl.domain.order"> SELECT ORDAND_ID ID, ORDAND_NO ORDERNO, ORDER_PRICE Price dans les ordres où Order_ID = # {id} </lect> <! - Selon la requête ID, nous pouvons obtenir un objet de commande. En utilisant cette requête, nous pouvons interroger le résultat que nous voulons normalement. En effet
<select id = "SelectorDerResultMap" ParameterType = "int" resultMap = "OrderResultMap"> Sélectionner * dans les ordres où Order_ID = # {id} </lect> <! - Mappage de la correspondance entre le nom d'attribut de classe Entité et le nom du champ de la table du champ de la table par le champ du champ Table Utilisation de la propriété ID -> <id Property = "ID" Column = "ORDER_ID" /> <! - Mappage du champ de clé non primaire à l'aide de la propriété Résultat -> <Result Property = "OrderNo" Column = "ORDER_NO" /> <Result Property = "Price" Column = "ORDER_PRICE" /> </ ResultMap> </ Masper> 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; test de classe publique {@TestPublic Void TestGetOrderById () {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 d'ID de la balise de sélection, vous pouvez trouver le SQL à exécuter * / string instruction = "me.gacl.mapping.orderMapper.getOrderByid"; // Mapping the SQL Identity String // Exécuter l'opération Query et résumer automatiquement le résultat de la requête dans un objet de commande et de retour. SQL en utilisant SQLSession, vous devez fermer SQLSESIONSQLSESSION.CLOSE (); System.out.println(order);//Print result: null, that is, no corresponding record is found}@Testpublic void testGetOrderById(){SqlSession sqlSession = MyBatisUtil.getSqlSession();/*** Map SQL Identification String, * me.gacl.mapping.orderMapper is the value of the namespace attribute of the mapper tag in the 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. * / String instruction = "me.gacl.mapping.ordermapper.selectorder"; // map sql identification string // exécuter les opérations de requête, et encapsuler automatiquement les résultats de la requête dans un objet de commande et de retour d'ordre d'ordre = SQLSession.Selectone (instruction,); // requête l'enregistrement avec ID dans le tableau des commandes // après l'exécution de SQL en utilisant SQLSUSSION SQLS, vous avez besoin pour vous fermer pour se rapprocher de la commande des commandes // SqlSessionsqlSession.close (); System.out.println (Order); // Imprimer Résultat: Order [id =, OrderNO = AAAA, Price =.]} @ TestPublic void TestGetOrderById () {SqlSession SqlSession = MyBatisUtil.getsqlSession (); / *** Map SQL TRAIN TAG 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, vous pouvez trouver le SQL à exécuter. * / String Statement = "me.gacl.mapping.ordermapper.selectorderresultmap"; // mappage de chaîne d'identification SQL // Exécuter les opérations de requête, et encapsuler automatiquement les résultats de la requête dans un objet de commande et l'ordre de commande de retour = SQLSession.Selectone (instruction,); // requête le record avec le tableau des ordonnances // après le tableau SQL SqlSessionsqlSession.close (); System.out.println (Order); // Imprimer Résultat: Order [id =, OrderNo = AAAA, Price =.]}} 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é via <SultMap>. 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.
Ce qui précède est le tutoriel d'apprentissage MyBatis qui vous est présenté par l'éditeur (IV) - comment résoudre rapidement le conflit entre les noms de champ et les noms d'attribut de classe d'entités. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!