Introduction à Mybatis
MyBatis a été prédécessent par Ibatis, qui est un cadre de cartographie relationnelle (ORM) de la couche de persistance / objet basée sur Java.
MyBatis est une encapsulation de JDBC, permettant aux développeurs de se concentrer uniquement sur SQL lui-même sans dépenser trop d'efforts pour traiter le code de procédure JDBC tel que l'enregistrement des pilotes, la définition des paramètres, la création de connexion / instruction, l'analyse des ensembles de résultats, etc. développement.
MyBatis est un cadre de persistance de première classe avec prise en charge de la SQL personnalisée, des procédures stockées et des mappages avancés. MyBatis élimine presque tout le code JDBC et le paramètre manuel des paramètres et la récupération des résultats. MyBatis peut utiliser des XML ou des annotations simples pour la configuration et les primitives de cartographie, les interfaces de carte et les pojos Java (Old Java objets simples) sur des enregistrements de base de données.
Adresse du projet MyBatis / documentation en ligne.
Rencontrez d'abord Mybatis
L'utilisation de MyBatis nécessite d'ajouter les dépendances suivantes dans pom.xml:
<Code> <Dedency> <GroupId> org.mybatis </rompuprid> <Artifactid> Mybatis </ artifactid> <version> 3.3.0 </ version> </Dependance> <Dedency> <ProupId> MySQL </romproudId> <Artifactid> MySQL-Connector-Java </RetifActid> <Dersion> 5.1.36 <version> </ptetifactid> <version> 5.1.36
Sélectionner
Configurer MyBatis / Mybatis-Configuration.xml
En tant que fichier de configuration globale de MyBatis, il est configuré avec les informations sur l'environnement de MyBatis (telles que la source de données / fichier de mappeur, etc.).
<code> <code> <! - {cke_protected} {c}% 3c!% 2d% 2d% 3fxml% 20version% 3d% 221,0% 22% 20Encoding% 3D% 22UTF-8% 22% 20% 3f% 2D% 2D% 3E -> <configuration> <Environments Default = "Development"> <viron id = "Development"> <! - {cke_protected} {c}% 3c!% 2d% 2d% 20% E9% 85% 8D% E7% BD% AEJDBC% E4% BA% 8B% E5% 8A% A1% E7% AE% A1% E7% 90% 86% 2D% 2D% 3E -> type = "JDBC"> <! - {CKE_Protected} {C}% 3C!% 2D% 2D% 20% E9% 85% 8D% E7% BD% AE% E6% 95% B0% E6% 8D% AE% E6% BA% 90% 2D% 2D% 3E -> <datasource " value = "com.mysql.jdbc.driver"> <propriété name = "url" value = "jdbc: mysql: // hôte: port / db? caractéristique = utf-8"> <propriété name = "username"> <propriété name = "mot de passe" value = "mot de passe"> </ propriété> </ propriété> </ propriété> </ataSource> </sactionManager> </ Environment> </NIVMANTS> <! - {C KE_PROTECTÉ} {C}% 3C!% 2D% 2D% 20% E5% 8A% A0% E8% BD% BDMAPPER% E6% 98% A0% E5% B0% 84% E6% 96% 87% E4% BB% B6% 20% 2D% 2D% 3E -> <MAPPERS> Resource = "MyBatis / Mapper / Userdao.xml"> </ Mapper> </mappers> </FIGIGURAGE> </code>Écriture UserDao (carte du mappeur)
La partie la plus principale de MyBatis est configurée avec des instructions SQL qui fonctionnent la base de données:
<code> <code> <code> <! - {cke_protected} {c}% 3c!% 2d% 2d% 3fxml% 20Version% 3d% 221,0% 22% 20encoding% 3d% 22UTF-8% 22% 20% 3f% 2D% 2D% 3E -> <Masper namespace = "namespace"> <lelect id = " paramètreType = "java.lang.integer" resultType = "com.fq.domain.user"> select * à partir de l'utilisateur où id = # {id}; </lect> <select id = "selectUserByName" ParameterType = "java.lang.string" '% $ {Value}%'; </lect> </ mapper> </code> </code> Description de l'attribut
espace de noms de noms, utilisé pour isoler les instructions SQL
ParameterType définit le type de mappage d'entrée SQL et MyBatis obtient des paramètres de l'objet d'entrée via OGNL pour passer dans des instructions SQL.
ResultType définit le type de mappage de sortie SQL. MyBatis cartose une ligne d'enregistrements des résultats de la requête SQL au type spécifié par resultType.
Le nom du fichier de mappage de mappeur comprend userdao.xml / userMapper.xml / user.xml et d'autres formulaires. Ils sont généralement stockés dans le répertoire du mappeur du même niveau que Mybatis-Configuration.xml. Étant donné que sa fonction principale est de définir la relation entre les instructions SQL et la cartographie, il est généralement collectivement appelé fichiers de mappage de mappeurs.
Définir la classe PO
La fonction principale de la classe PO est le mappage SQL (entrée / sortie), qui correspond généralement aux tables de base de données:
<code> <code> <code> <code> <code> / *** @author jifang * @Since 15/12/31 2:27 PM. * / classe publique User {ID privé ID; nom de chaîne privée; String Motword; Password) {this.id = id; this.name = nom; this.password = wswordword = public; {return id;} public void setid (Integer id) {this.id = id;} public String getName () {return name;} public void setName (string name) {this.name = name;} public String getPassword () {return password;} public void setPassword (string mot de passe) {this.password = mot de passe;} @ setSibLic TOSTRING (). "User {" + "id =" + id + ", name = '" + name +' / '' + ", mot de passe = '" + mot de passe +' / '' + '}';}} </code> </code> </code> </code>UserDao (objet Java)
Obtenez SQLSession, exécutez des instructions SQL et obtenez le résultat du mappage:
<code> <code> <code> <code> <code> <code> <code> / *** @author jifang * @Since 16/2/24 6:15 PM. * / classe publique UserDao {private sqlSessionFactory Factory; @Beforepublic Void setup () lance ioException {String Resource = " SqlSessionFactoryBuilder (). Build (Resources.getResourCeasStream (Resource));} @ TestPublic Void SelectUserById () {Try (SqlSession Session = Factory.OpenSession ()) {User User = Session.Selectone ("Namespace.SelectUserById", 1); System.out.out.PrintLn (user);}}}} @ tespublic selectUserByName () {try (sqlSession session = factory.opencession ()) {list <user> users = session.selectList ("namespace.selectUserByName", "Student"); pour (utilisateur utilisateur: utilisateurs) {System.out.println (utilisateur);}}}} </ user> </code> </code> </code> </code> </code>Insérer
tabac
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <insert id = "inserser" ParameterType = "com.fq.domain.user"> Insérer dans l'utilisateur (nom, mot de passe) (# {name}, # {mot de passe>Userdao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @TestPublic void INSERTUSER () {Try (SQLSession Session = Factory.OpenSession ()) {user user = new User (); user.setName ("new_name1"); user.setpassword ("new_password"); session.insert ("namespace.inserser", user); session.commit ();}} </code> </code> </code> </code> </code> </code> Retour par clé primaire automatique
Modifiez le fichier de mappeur et ajoutez-le, et vous pouvez retourner la clé principale d'accès automatique de MySQL (c'est-à-dire l'ID généré lorsque les données sont simplement insérées):
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <insert id = "inserser" ParameterType = "com.fq.domain.user"> <lelectKey KeyProperty = "id" Order = "After" resultType = "Java.Lang.Integer"> SELECT. Last_insert_id (); </lectKey> Insérez dans l'utilisateur (nom, mot de passe) (# {name}, # {mot de passe}); </sert> </code> </code> </code> </code> </code>Userdao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic void insertuser () {try (sqlSession Session = factory.opencession ()) {System.out.println (session); user = new user (null, "new_name", "new_password"); session.insert ("namespace.inserser", utilisateur); // Vous devez obtenir la clé primaire AutoIncrement session.Commit (); System.out.println (user.getId ());}} </code> </code> </code>Cette fonction peut également être remplie via les propriétés UseGeneratedKeys / KeyProperty, veuillez vous référer à la documentation MyBatis pour plus de détails.
Mise à jour
tabac
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <update id = "UpdateUserById" ParameterType = "com.fq.domain.user"> Update User set name = # {name}, mot de passe = # # mot de passe} où id =. # {id}; </ update> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Userdao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic void updateUserByid () {try (sqlSession Session = factory.opeSession (true)) {session.update ("sqlSession "feiqing", "icy5yqxzb1uwswcvlsnlca =="));}} </code> </code> </code> </code> </code> </code> </code> </code> </code>Supprimer
tabac
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <delete id = "DeleteUserById" ParameterType = "java.lang.integer"> Delete de l'utilisateur où id = = # {id}; </ delete> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Userdao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @TestPublic Void DeleteUserById () {Try (SQLSession Session = Factory.Opensession (true))) ?résumé
# {} / $ {}
# {}: Représente un espace réservé, implémente la définition d'une valeur sur l'espace réservé à préparation (# {} représente un espace réservé?), Et convertit automatiquement le type Java en type JDBC (afin {{} peut effectivement empêcher l'injection SQL). # {} peut recevoir des valeurs d'attribut de type ou PO simples. Si ParameterType transmet une seule valeur de type simple, le # {} peut être une valeur ou d'autres noms dans les accolades bouclées # {}. $ {} peut être utilisé pour épisser les chaînes SQL. Le contenu de ParameterType peut être épissé dans SQL sans conversion de type JDBC. $ {} peut être utilisé pour recevoir des valeurs d'attribut de type simple ou PO. Si ParameterType transmet une seule valeur de type simple, le $ {} ne peut être utilisé que pour évaluer les accolades bouclées $ {}.
Bien que $ {} ne peut pas empêcher l'injection SQL, parfois $ {} est très pratique (comme l'ordre par tri, les noms de colonne doivent être transmis dans SQL via des paramètres, alors l'ordre par $ {colonne} est utilisé, et # {} ne peut pas être utilisé pour implémenter cette fonction (voir JDBC Discussion de base sur le stade préparée pour les détails).
SQLSESSION
Fournir des méthodes pour faire fonctionner la base de données (telle que: selectOne / SelectList). Cependant, SQLSession est insensible à thread, il est donc préférable de le définir comme une variable locale à utiliser.
Avantages de MyBatis (par rapport à JDBC)
SQL est écrit en code Java, ce qui le rend difficile à maintenir. MyBatis écrit SQL dans Mappeur et XML est séparé du code Java. Il est compliqué de passer des paramètres aux instructions SQL (tels que: SQL où les conditions sont différentes, les types de données SQL sont différents de Java). MyBatis mappe automatiquement les objets Java aux instructions SQL via ParameterType. L'analyse de jeu de résultats est gênante (les modifications SQL mènent en modifications de code d'analyse, les types de données SQL sont différents de Java). MyBatis mappe automatiquement l'exécution de SQL dans les résultats Java via ResultimeType.
Pièce jointe: Il est préférable d'ajouter une implémentation du système de journal (logback / log4j) à pom.xml, afin que les informations de journal soient imprimées lors du débogage du programme, ce qui facilite la vérification des erreurs. Prenez la journalisation comme exemple:
pom.xml
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <dependency> <proupId> ch.qos.logb ACK </prouprid> Logback-CLASSIC </ ARTIFACTID> <DERVIÈRE> 1.1.2 </ Version> </ Dependency> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
logback.xml
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <configuration> <propriété name = "logroot" value = "/ data / logs"> <propriété = "Match" Match " Value = "% D {HH: MM: SS.SSS} [% Thread]% -5Level% Logger {0} -% MSG% N"> <appender name = "STDOUT"> <Ecoder> <mattern> $ {Pattern} </ Pattern> </ Encoder> </Pender> <appen-appen name = "file"> <rollingPolicy> <filenamepattern> $ {logroot} /common-server.%d {yyy-mm-dd} .log </ filenamepattern> <maxhistory> 7 </ maxhistory> </ rollingPolicy> </ encoder> <atmate> {motif} </ Pattern> </ Encoder> <Mattern> $ {Pattern} </ Pattern> niveau = "debug"> <appender-ref ref = "stdout"> <appender-ref ref = "File"> </ appender-ref> </ appender-ref> </ root> </ propriété> </ propriété> </ configuration> </ code> </code> </code> </code> </code> </code> </code> </code> </code>Pour d'autres détails sur les journaux MyBatis, veuillez vous référer à la section du journal des documents MyBatis.
Développement DAO
Il existe deux façons de développer DAO à l'aide de MyBatis, de développement DAO original et de développement DAO de cartographie du mappeur.
Développement DAO original Original Dao Development oblige les développeurs à écrire des interfaces DAO et des implémentations DAO, telles que l'interrogation des informations utilisateur basées sur ID:
Mappeur (Idem qu'avant)
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <lelect id = "selectUserByid" ParameterType = "java.lang.lang.integer" resultType = "com.fq.domain.user"> sélectionner * à partir de l'utilisateur où id = # {id}; </ select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> Interface userdao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> selectUserById (INTER ID) lance une exception;} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
Implémentation UserDAO
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> Classe publique UserDaoIMPLLit Factory; public userDaoimpl (SQLSessionFactory Factory) {this.factory = factory;} @ OverRidepublic User SelectUserById (Integer ID) exception {SqlSession Session = Factory.OpenSession (); User user = session.Selectone ("namespace.selecterbyid", id); session.close. User;}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> Client
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> Class MyBatShaLity {@ code> <code> <code> Gublic Class MyBatisclient {@Tespublic " OriginalClient () lève une exception {userdao dao = new UserDaoimpl (new sqlSessionFactoryBuilder (). build (classloader.getSystemResourCeAsStream ("MyBatis / MyBatis-Configuration.xml"))); User user = dao.SelectUserById (1); System.out.println (utilisateur);}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code </code>Problèmes dans le développement original de DAO:
1) Il existe de nombreux codes de procédure dans le corps de la méthode de mise en œuvre DAO.
2) L'appel de la méthode SQLSession (SELECT / INSERT / UPDATE) nécessite de spécifier l'ID de l'instruction, qui est codé en dur, qui n'est pas propice à la maintenance du code.
Développement de cartographie des mappeurs
La méthode de développement de mappage de mappers nécessite uniquement d'écrire une interface DAO, et MyBatis crée dynamiquement une implémentation d'interface basée sur la définition d'interface et les instructions SQL dans le fichier de mappeur.
tabac
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <! -? xml version = "1.0" Encoding = "utf-8"? namespace = "com.fq.mybatis.userdao"> <select id = "selectUserByid" ParameterType = "java.lang.integer" ResultType = "com.fq.domain.user"> select * FROM User où id = # {id}; </ select> </ mapper> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Remarque: Pour le moment, l'espace de noms doit être le même que le nom entièrement qualifié de l'interface UserDAO.
L'interface UserDAO est la même qu'auparavant, mais le client UserDaoimpl n'est plus utilisé.
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> pm. * / public class mybatisclient {private sqlSession Session; private sqlSessionFactory Factory; @beforepublic void setup () {factory = new sqlSessionFactoryBuilder (). build (classloader.getSystemResourceSstream ("Mybatis / Mybatis-Configuration.xml")); session = Session = Session = Session = Session = MyBatis-Configuration.xml ")); session = session = Session = Session = Mybatis-Configuration.xml")); session = session = Session = Mybatis-Configuration.xml ")); Session = Session = Session = Session = Session = MyBatis-Configuration.Xml")) factory.opencession ();} @ testpublic void MappPerClient () lève une exception {userdao dao = session.getmapper (userdao.class); user user = dao.selectuserbyid (1); System.out.println (user);} @ afrepublic darondown () {session.close ();}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Les méthodes de développement de cartographie des mappes doivent suivre les spécifications suivantes:
L'espace de noms dans le fichier de mappeur est le même que le nom entièrement qualifié de l'interface DAO; L'ID de l'instruction dans le fichier de mappeur est le même que le nom de la méthode de l'interface DAO; Le parameterType / ResultType de l'instruction dans le fichier de mappeur est le même que le paramètre / résultat de la méthode DAO.
Cartographie du mappeur
La fonction principale des fichiers de mappage de mappers (telles que userdao.xml) est de définir des instructions SQL (chaque SQL est une instruction), qui est le cœur de MyBatis.
MyBatis recommande officiellement d'utiliser la méthode de cartographie du mappeur pour développer DAO, nous ne vous présenterons donc pas trop sur le développement du DAO original à l'avenir.
Mappage d'entrée
Plusieurs paramètres formels
L'exemple précédent de passer des types simples a été utilisé, donc je ne le répéterai pas ici. Lorsque plusieurs paramètres formels doivent être passés, le paramètre de paramètre n'est plus nécessaire:
tabac
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> # {1}, mot de passe = # {2} où id = # {0}; </ update> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code </code>Userdao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> UpdateSerById (ID entier, nom de chaîne, mot de passe de chaîne) lève une exception; </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code
PO entrant
MyBatis utilise des valeurs d'attribut d'attribut d'objet d'analyse pour analyser:
tabac
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <sélectionner id = "selectUserByNamePassword" ParameterType = "com.fq.domain.user" resultType = "com.fq.domain.user"> select * from userwhere name = # {name} et mot de passe = # {mot de passe}; </ select> </code> </code> </ code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Userdao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> selectUserByNamePassword (utilisateur utilisateur) lance Exception; </code> </ code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
tabac
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <co Co de> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <sélection id = "selectUserBymap" ParameterType = "java.util.map" resultType = "com.fq.domain.user"> select * from userwhere name = # {name} et mot de passe = # {mot de passe}; </ select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code># {} La clé correspondante de la carte dans les accolades bouclées.
Userdao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> selectUserByMap (map <string, object = ""> map) lance Exception; </ String,> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
Cartographie de sortie
Type simple de sortie
tabac
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <co Co de> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <sélection id = "selectUserCount" ParameterType = "java.lang.string" resultType = "java.lang.integer"> SELECT COMT '% $ {value}%'; </ select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code > </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Userdao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code>> <code>> <code> INTERGE SELECTUCTS) LUNDE> <CODE> <CODE>> <CODE " Exception; </code> </ code> </ code> </ code> </ code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
Le retour d'un type simple doit s'assurer que le résultat de la requête n'a qu'une seule ligne d'enregistrements, et la valeur du premier champ est finalement convertie en type de sortie.
Objet / liste de sortie PO
Deux types de sortie ont été démontrés auparavant (SelectUserById / SelectUserByName a utilisé la méthode de développement DAO originale à ce moment-là, mais le formulaire de définition du mapper était similaire), donc je ne ferai qu'un résumé simple ici:
Le type de résultat défini dans le mappeur lors de la sortie d'un seul objet PO est le même que le Type de résultat défini dans le mappeur; Le résultat de la requête SQL doit être garanti comme un seul élément de données, et il est appelé en interne à l'aide de la méthode SelectOne; La liste PO de sortie indique que le résultat de la requête peut être multiple, et il est appelé en interne à l'aide de la méthode SelectList, et la valeur de retour d'interface peut être hébergée par liste / set.
Carte de sortie
L'objet PO de sortie peut être utilisé à la place pour utiliser la sortie de la carte, avec le nom de champ comme clé et la valeur du champ comme valeur.
tabac
<code> <select id = "selectUserLikename" resultType = "java.util.map"> Sélectionner * dans le nom de l'utilisateur comme '% $ {valeur}%'; </lect> </code>Userdao
<code> <code> list <map <string, object = "" >> selectUserLikename (String name) lève une exception; </ map <string,> </code> </code>
ResultMap
ResultType peut mapper le résultat de la requête à PO, mais la prémisse est que le nom de la propriété PO et le nom de champ SQL doivent être les mêmes. S'il est incohérent, le mappage correspondant peut être effectué via ResultMap:
tabac
<code> <code> <code> <resultMap id = "usermap" type = "com.fq.domain.user"> <id chronn = "user_id" propriété = "id"> <résultat chronn = "user_name" property = "name"> <result Column = "user_password" propriété = "mot de passe"> </ id> </cultMap> <lelect id = "selectuser" ParameterType = "java.lang.string" resultmap = "userMap"> selectId user_id, name user_name, mot de passe user_passwordfrom userwhere name = # {name}; </lect> </code> </code> </code>L'interface UserDAO est la même qu'auparavant.