Méthodes intégrées pour le mapper
La couche modèle est la classe d'entité, correspondant au tableau de la base de données. La couche de contrôleur est un servlet, qui est principalement responsable du contrôle du processus du module commercial, appelant la méthode d'interface de service, et dans Struts2 est une action. La couche de service fait principalement des jugements logiques, et la couche DAO est la couche d'accès aux données, qui se connecte à la base de données. Quant au mappeur, le fichier de mappage du mappeur est utilisé dans la couche DAO.
Voici une description de la méthode intégrée de mapper:
1. CountbyExample ===> interroger la quantité selon les conditions
int countbyExample (exemple userexample); // Ce qui suit est une liste de cas complète. Userexample example = new UseRexample (); Critères critères = exemple.CreateCriteria (); critères.AndUsernameEqualto ("Joe"); int count = userdao.CountByExample (exemple); Équivalent à: Sélectionner le nombre (*) de l'utilisateur où username = 'Joe'
2. DeleteByExample ===> Supprimer plusieurs éléments en fonction des conditions
int deleteByExample (Exemple comptocuexample); // Ce qui suit est un cas complet UseRexample Exemple = new UseRexample (); Critères critères = exemple.CreateCriteria (); critères.AndUsernameEqualto ("Joe"); userdao.deleteByExample (exemple); équivalent à: supprimer de l'utilisateur où username = 'Joe' 3. DeleteByPrimaryKey ===> Supprimer un seul élément selon les conditions
int deleteByPrimaryKey (INTER ID); userdao.deleteByprimaryKey (101);
Équivalent à:
Supprimer de l'utilisateur où id = 101
4. INSERT ===> INSERT DONNÉES
INT INSERT (Record du compte); // Ce qui suit est le cas-casse complet utilisateur utilisateur = new user (); //user.setid(101); user.setUsername ("test"); user.setpassword ("123456") user.setEmail ("[email protected]"); userdao.insert (utilisateur);Équivalent à:
Insérer dans l'utilisateur (id, nom d'utilisateur, mot de passe, e-mail) Valeurs (101, «test», «123456», «[email protected]»);
5. INSERTELLECLECTION ===> INSERT DONNÉES
int InteserSelective (enregistrement du compte);
6. SelectByExample ===> Données de requête en fonction des conditions
Liste <conty> selectByExample (Exemple AccountExample); // Ce qui suit est un cas complet Userexample Exemple = new Userexample (); critères critères = example.CreateCriteria (); critères.andUserNameEqualto ("Joe"); critères.AndUsernameisnull (); Exemple.SetOrderByClause ("nom d'utilisateur ASC, EMER DESC"); Liste <? Utilisateur où username = 'Joe' et le nom d'utilisateur sont Null Order by Username ASC, Email Desc // Remarque: Le fichier userexample.java généré par Ibator contient un critère de classe interne statique. Il existe de nombreuses méthodes de critères, principalement pour définir les conditions de requête après instruction SQL où.7. SelectByPrimaryKey ===> Données de requête en fonction de la clé primaire
Compte selectByPrimaryKey (ID entier); // équivalent à sélectionner * à partir de l'utilisateur où id = ID de variable
8. UpdateByExampleSelective ===> Mettez à jour les champs avec des valeurs non nulles en fonction des conditions
int udatedByExampleSelective (@param ("enregistrer") Enregistrement du compte, @param ("exemple") Exemple comptabilitéxample); // Ce qui suit est une liste de cas complète UseReXample Exemple = new UseRexample (); Critères critères = exemple.CreateCriteria (); critères.AndUsernameEqualto ("Joe"); Utilisateur utilisateur = nouveau utilisateur (); user.setpassword ("123"); userdao.updateByPrimaryKeySelective (utilisateur, exemple); Équivalent à: Mettre à jour le jeu d'utilisateur Mot de passe = '123' où userName = 'Joe'
9. UpdateByExampleSelective ===> Mise à jour par condition
Int UpdateByExample (@param ("enregistrer") Enregistrement du compte, @param ("Exemple") Exemple de comptabilité);10. UpdateByPrimaryKeySelective ===> Mise à jour en fonction des conditions
int updateByPrimaryKeySelective (enregistrement du compte); // Ce qui suit est un cas complet utilisateur utilisateur = new user (); user.setid (101); user.setpassword ("joe"); userdao.updatebyprimarykeySelective (user);Équivalent à:
Mettre à jour le jeu d'utilisateurs Mot de passe = 'Joe' où id = 101
int updateByPrimaryKeySelective (enregistrement du compte); // Ce qui suit est un cas complet utilisateur utilisateur = new user (); user.setid (101); user.setpassword ("Joe"); userdao.updatebyprimarykeySelective (utilisateur);Équivalent à: Mettre à jour le jeu d'utilisateur Mot de passe = 'Joe' où id = 101
11. UpdateByPrimaryKey ===> Appuyez sur la touche principale pour mettre à jour
int updateByPrimaryKey (enregistrement du compte); // Ce qui suit est un user complete User = User = new User (); user.setid (101); user.setUsername ("Joe"); user.setpassword ("Joe"); user.setemail ("[email protected]"); userdao.updateByPrimaryKey (utilisateur);Équivalent à:
Mise à jour de l'utilisateur set username = 'joe', mot de passe = 'Joe', email = 'Joe @ 163.com' où id = 101
int updateByPrimaryKey (enregistrement du compte); // Ce qui suit est un utilisateur de cas complet utilisateur = new user (); user.setid (101); user.setUsername ("Joe"); user.setpassword ("Joe"); user.setemail ("[email protected]"); userdao.updateByPrimaryKey (utilisateur);Équivalent à:
Mise à jour de l'utilisateur set username = 'joe', mot de passe = 'Joe', email = 'Joe @ 163.com' où id = 101
Analyse du fichier de configuration XML du mappeur
Jetons un coup d'œil à la façon dont MyBatis lit le fichier de configuration XML du mappeur et analyse les instructions SQL.
Nous nous souvenons encore de la configuration du SQLSessionFactory comme ceci:
<bean id = "sqlSessionFactory"> <propriété name = "dataSource" ref = "dataSource" /> <propriété name = "configLocation" value = "classpath: configuration.xml"> </ propriété> <propriété name = "mapperlocations" value = "classpath: com / xxx / mybatis / maaker / *. value = "com.tiantian.mybatis.model" /> </ank>
Voici une propriété Mappelocations, qui est une expression. Le SQLSessionFactory lira tous les fichiers de format XML sous le package com.xxx.mybaits.mapper en fonction de cette expression. Alors, comment lisez-vous le fichier de configuration en fonction de cet attribut?
La réponse réside dans la méthode BuildsQLSessionFactory dans la classe SQLSessionFactoryBean:
if (! iSEmpty (this.mapperLocations)) {for (Resource MapperLocation: this.mapperLocations) {if (mAperLocation == null) {continue; } essayez {xmlmapperBuilder xmlmapperBuilder = new xmlmapperBuilder (mapperlocation.getInputStream (), Configuration, mapperlocation.toString (), configuration.getsqlfragments ()); xmlmapperBuilder.Parse (); } catch (exception e) {lancez new NetestioException ("Échec de l'analyse de la ressource de mappage: '" + mapperlocation + "'", e); } enfin {errorContext.instance (). reset (); } if (logger.isdebugeNabled ()) {logger.debug ("fichier de mappeur analysé: '" + mapperlocation + "'"); }}}MyBatis utilise une instance de la classe XMLMapperBuilder pour analyser les fichiers de configuration du mappeur.
public xmlmapperBuilder (Reader Reader, Configuration Configuration, String Resource, Map <String, Xnode> SqlFragments) {this (new XPathParser (Reader, True, Configuration.getVariables (), new XMLMAPPEntityResolver ()), configuration, ressource, sqlfragments); } private xmlmapperBuilder (analyser xPathParser, configuration de configuration, ressource de chaîne, map <string, xnode> sqlfragments) {super (configuration); this.builDerAssistant = new MapperBuilDerAsSistant (configuration, ressource); this.parser = analyser; this.sqlfragments = sqlfragments; this.resource = ressource; }Ensuite, le système appelle la méthode Parse de XMLMapperBuilder pour analyser le mappeur.
public void parse() { //If the configuration object has not loaded the xml configuration file (avoiding duplicate loading, it is actually to confirm whether the properties and content of the mapper node have been parsed, //Preparing for parsing its child nodes such as cache, sql, select, resultMap, parameterMap, etc.), //Parse the mapper node from the input stream, and then set the status of the resource à chargé if (! Configuration.IsResourceLoaded (ressource)) {configurationElement (parser.evalNode ("/ mapper")); Configuration.AddloadEdResource (ressource); bindmapperFornAmespace (); } // Analyse le nœud <SultMap> qui n'a pas été traité lors du traitement de ResultMap dans la fonction ConfigurationDelement. parseprendResultMaps (); // analyse le nœud <cache> qui n'existe pas lors du traitement du cache-ref dans la fonction ConfigurationElement (cela se produira si le cache-ref est chargé avant le nœud de cache, il pointe) parseprendChacheRefs (); // Identique à ci-dessus, si le cache n'est pas chargé, une exception sera également lancée lors du traitement de l'instruction parseprendStatements (); }Le processus de mybatis analysant le fichier XML du mappeur est déjà très évident. Jetons un coup d'œil à la façon dont il analyse le mappeur:
Private void configurationElement (xNode context) {try {// Obtenez l'attribut d'espace de noms de la chaîne de nœud mappeur espace de noms = context.getStringAttribute ("namespace"); if (namespace.equals ("")) {Throw new BuildErexception ("L'espace de noms de Mapper ne peut pas être vide"); } // Définissez l'espace de noms actuel builderAsSistant.setCurrentNamespace (namespace); // analyser le nœud du mappeur <cache-ref> cacheReFelement (context.evalNode ("cache-ref")); // analyser le nœud de mapper <cache> cacheelement (context.evalNode ("cache")); // analyse le nœud de mappeur <paramètre> paramètres du nœud (context.evalNodes ("/ mapper / paramètre")); // analyse le nœud du mappeur <résultat> resultemAPELlements (context.evalNodes ("/ mapper / resultmap")); // analyse le nœud <sql> du mappeur sqlelement (context.evalNodes ("/ mapper / sql")); // Utilisez l'objet XMLStatementBuilder pour analyser les nœuds <lect>, <s insert>, <fatedate>, <preelete>, // mybaits utilisera la classe mapsstatement.builder pour construire un objet mappés BuildStatementFromContext (context.evalNodes ("SELECT | INSERT | Update | Delete")); } catch (exception e) {lancez new BuildErException ("Erreur d'analyse du mappeur xml. Cause:" + e, e); }}La fonction ConfigurationDelement analyse presque tous les nœuds enfants du nœud de mappeur. À ce stade, MyBaits analyse tous les nœuds du mappeur et les ajoute à l'objet de configuration pour l'objet SQLSessionFactory à utiliser à tout moment. Ici, nous devons ajouter quelques explications sur la façon dont MybaitAts utilise la fonction PARSESTATATIONNODE de l'objet de la classe XMLStatementBuilder pour emprunter le statement Addmapt de la stadation de mappé-tabuinaire BuilderAsSistant pour analyser le statement mappé et l'associer à l'objet de la classe de configuration:
public void parsestatementNode () {// id attribut string id = context.getStringAttribute ("id"); // databaseid attribut string databaseid = context.getStringAttribute ("databaseID"); if (! databaseIdMatchScurrent (id, databaseId, this.requiedDatabaseId)) {return; } // fetchSize Attribut Integer fetchSize = context.getIntAttribute ("fetchSize"); // Timeout Attribut Integer timeout = context.getIntAttribute ("Timeout"); // paramètre d'attribut d'attribut ParameTermap = context.getStringAttribute ("ParameTermap"); // parameterType Attribute String ParameterType = context.getStringAttribute ("ParameterType"); Class <?> ParameterTypeClass = résolveclass (ParameterType); // ResultMap Attribute String resultMap = context.getStringAttribute ("resultMap"); // ResultType Attribute String resultType = context.getStringAttribute ("resultType"); // Lang Attribute String Lang = context.getStringAttribute ("lang"); LanguagedRiver Langdriver = getLanguagedRiver (Lang); Class <?> ResultTypeClass = résolveclass (resolype); // ResultSetType Attribute String, resultSetType = context.getStringAttribute ("resultSetType"); Statestype Statestype = Statestype.ValueOf (context.getStringAttribute ("StateType", Statestype.Prepared.ToString ())); ResultSetType resultSetTypeenum = résolveResultSetType (resulteSetType); String NodeName = context.getNode (). GetNodeName (); SqlCommandType SqlCommandType = SqlCommandType.ValueOf (NodeName.ToupperCase (Locale.English)); // est-ce un <lect> nœud booléen issElect = sqlcommandType == SqlCommandType.Select; // FlushCache Attribut booléan flushcache = context.getBoolieAnAttribute ("FlushCache" ,! IssElect); // UseCache Attribut Boolean UseCache = context.getBooleAnAttribute ("UseCache", IssElect); // Résultat Attribut Boolean resultOrDorDed = context.getBooleAnAttribute ("Resultimedred", false); // Inclut des fragments avant d'analyser XMLincludeTransformateur incluseparser = new XMLincludTransformrer (configuration, builderAsSistant); includeparser.ApplyIncluds (context.getNode ()); // Analyser SelectKey après les inclure et les supprimer. ProcessSelectKeyNodes (id, ParameterTypeClass, LangDriver); // analyse le SQL (pré: <lectReyKey> et <clut> ont été analysés et supprimés) sqlsource sqlsource = Langdriver.cretesqlsource (configuration, contexte, parameterTypeClass); // ResulteSet Property String ResultsEllSets = context.getStringAtTribute ("ResultsEtSets"); // string de propriété KeyProperty KeyProperty = context.getStringAttribute ("KeyProperty"); // String de propriété KeyColumn KeyColumn = context.getStringAttribute ("KeyColumn"); KeyGenerator KeyGenerator; String keystaMeId = id + selectKeyGenerator.Select_key_Suffix; keyStateMentId = builderAsSistant.ApplyCurrentNamespace (KeyStateMationId, true); if (configuration.haskeyGenerator (keystaMeDID)) {keyGenerator = configuration.getKeyGenerator (keystaMeDID); } else {// useGeneratedKeys Attribut keyGenerator = context.getBooleAnAttribute ("useGeneratedKeys", configuration.isusegeneratedKeys () && sqlcommandtype.insert.equals (sqlcommandType))? new JDBC3KeyGenerator (): new noKeyGenerator (); } builderassistant.addmapptStatement (id, sqlsource, instructionType, sqlcommandType, fetchSize, timeout, paramètre, flushcache, usecache, resultTypeclass, ResulteStSetTypeenum, keycolumn, databaseid, langdordor, keyproperty; } À partir du code ci-dessus, nous pouvons voir que Mybaits utilise XPath pour analyser le fichier de configuration du mappeur, puis crée le résultat, paramètre, cache, instruction et autres nœuds en utilisant le constructeur associé et associe l'objet obtenu dans l'objet de configuration. Cet objet de configuration peut être obtenu à partir de SQLSession, qui explique le problème de la façon dont Mybaits obtient le mappeur et exécute les instructions SQL lorsque nous utilisons SQLSession pour faire fonctionner la base de données.