Integrierte Methoden für Mapper
Die Modellschicht ist die Entitätsklasse, die der Tabelle der Datenbank entspricht. Die Controller -Ebene ist ein Servlet, das hauptsächlich für die Kontrolle des Geschäftsmodulprozesses verantwortlich ist und die Service -Schnittstellenmethode aufruft und in Struts2 eine Aktion ist. Die Serviceschicht füllt hauptsächlich logische Urteile, und die DAO -Ebene ist die Datenzugriffsschicht, die eine Verbindung zur Datenbank herstellt. Was Mapper betrifft, so wird die Mapper -Mapping -Datei in der DAO -Ebene verwendet.
Hier finden Sie eine Beschreibung der integrierten Methode von Mapper:
1. CountByExample ===> Abfragen Sie die Menge gemäß den Bedingungen ab
int countByExample (UseSexample -Beispiel); // Folgendes ist eine vollständige Fallliste. UseSexample Beispiel = new UseSexample (); Kriterienkriterien = Beispiel.Createcriteria (); Kriterien.AndususernameEqualto ("Joe"); int count = userDao.CountByExample (Beispiel); Äquivalent zu: Wählen Sie Graf (*) vom Benutzer aus, wobei userername = 'joe' '
2. DeleteByExample ===> Mehrere Elemente gemäß den Bedingungen löschen
int deleteByExample (AccountExample Beispiel); // Folgendes ist ein vollständiger Fall UseSexample Beispiel = new UseSexample (); Kriterienkriterien = Beispiel.Createcriteria (); Kriterien.AndususernameEqualto ("Joe"); userDao.deletebyExample (Beispiel); Äquivalent zu: löschen vom Benutzer, wobei userername = 'joe' ' 3.. DeleteByprimaryKey ===> Ein einzelnes Element gemäß den Bedingungen löschen
int deleteByprimaryKey (Integer -ID); userDao.DeletByprimaryKey (101);
Äquivalent zu:
Löschen Sie vom Benutzer, wobei ID = 101
4. Insert ===> Daten einfügen
Int Insert (Kontoaufzeichnung); // Folgendes ist der vollständige Fall von Case user user = new user (); //user.setid(101); user.setUserName ("test"); user.setPassword ("123456") user.setemail ("[email protected]"); userDao.insert (Benutzer);Äquivalent zu:
Einfügen in den Benutzer (ID, Benutzername, Passwort, E -Mail) Werte (101, "Test", "123456", "[email protected]");
5. InsertSeLective ===> Daten einfügen
int InsertSelective (Kontoaufzeichnung);
6. SelectByExample ===> Abfragendaten basierend auf den Bedingungen
List <Contoes> SELECTBYEMPLEM (Botschaftsbeispiel); // Folgendes ist ein vollständiger Fall UseSexample Beispiel = new UseSexample (); Kriterienkriterien = Beispiel.Createcriteria (); Kriterien.AndusernameEqualto ("joe"); Kriterien. wobei Benutzername = 'Joe' und Benutzername null Order by Benutzername ASC sind, E -Mail -Desc // Hinweis: Die von Ibator generierte Datei UseSexample.java enthält eine statische interne Klassenkriterien. Es gibt viele Methoden in Kriterien, hauptsächlich, um die Abfragebedingungen nach SQL -Anweisung zu definieren, wo.7. SelectByprimaryKey ===> Abfragendaten basierend auf dem Primärschlüssel
Konto SelectByPrimaryKey (Ganzzahl -ID); // gleichwertig mit dem Benutzer ausgewählt, wobei ID = Variable -ID id
8. UpdateByExamplesSelective ===> Aktualisieren Sie Felder mit Werten, die nicht null gemäß den Bedingungen
int updateByExamplesSelective (@param ("record") Kontodatensatz, @Param ("Beispiel") AccountExample Beispiel); // Folgendes ist eine vollständige Fallliste UseSexample Beispiel = new UseSexample (); Kriterienkriterien = Beispiel.Createcriteria (); Kriterien.AndususernameEqualto ("Joe"); User user = new user (); user.setPassword ("123"); userDao.UpdateByprimaryKeysselective (Benutzer, Beispiel); Äquivalent zu: Aktualisieren von User Set password = '123' wobei userername = 'joe' '
9. UpdateByExamplesselective ===> Update nach Bedingung
int updateByExample (@param ("record") Kontodatensatz, @Param ("Beispiel") AccountExample Beispiel);10. UpdateByprimaryKeysselective ===> Update gemäß den Bedingungen
int updateByPrimaryKeysselective (Kontoaufzeichnung); // Folgendes ist ein vollständiger Fall von Case user = new user (); user.setId (101); user.setPassword ("joe"); userDao.UpdatByprimaryKeysselection (user);Äquivalent zu:
Aktualisieren Sie Benutzer set password = 'joe' wobei id = 101
int updateByprimaryKeysselektiv (Kontoaufzeichnung); // Folgendes ist ein vollständiger Fall von Case user user = new user (); user.setId (101); user.setPassword ("joe"); userDao.UpdatByprimaryKeysselective (Benutzer);Äquivalent zu: Aktualisieren von Benutzer set password = 'joe' wobei ID = 101
11. UpdateByprimaryKey ===> Drücken Sie die Primärtaste, um zu aktualisieren
int updateByprimaryKey (Kontoaufzeichnung); // Folgendes ist ein vollständiger Fall von Case user = new user (); user.setId (101); user.setUserName ("Joe"); user.setPassword ("Joe"); user.setemail ("[email protected]"); userDao.UpdateByprimaryKey (Benutzer);Äquivalent zu:
UPDATE User Set username = 'joe', password = 'joe', mail = '[email protected]' wobei ID = 101
int updateByprimaryKey (Kontoaufzeichnung); // Folgendes ist ein vollständiger Fall von Case user user = new user (); user.setId (101); user.setUserName ("Joe"); user.setPassword ("Joe"); user.setemail ("[email protected]"); userDao.UpdateByprimaryKey (Benutzer);Äquivalent zu:
UPDATE User Set username = 'joe', password = 'joe', mail = '[email protected]' wobei ID = 101
Analyse der XML -Konfigurationsdatei des Mapper analysieren
Schauen wir uns an, wie MyBatis die XML -Konfigurationsdatei des Mapper liest und die darin enthaltenen SQL -Anweisungen analysiert.
Wir erinnern uns noch daran, die SQLSessionFactory so konfiguriert zu haben:
<bean id = " value = "com.tiantian.mybatis.model" /> < /bean>
Hier ist eine Mapperlocations -Eigenschaft, die Ausdruck ist. Die SQLSessionFactory lesen alle XML -Formatdateien unter dem Paket com.xxx.mybaits.mapper gemäß diesem Ausdruck. Wie lesen Sie die Konfigurationsdatei basierend auf diesem Attribut?
Die Antwort befindet sich in der buildsqlSessionFactory -Methode in der SQLSessionFactoryBean -Klasse:
if (! isempty (this.mapperLocations)) {für (Ressourcen -MapperLocation: this.mapperLocations) {if (mapperLocation == null) {Fortsetzung; } try {xmlmapperBuilder xmlmapperBuilder = new XmlMapperBuilder (mapperLocation.getInputStream (), configuration, mapperLocation.toString (), configuration.getSqlfragmente ()); xmlmapperBuilder.Parse (); } catch (Ausnahme e) {Neue nestiosexception werfen ("" Kartierungsressource nicht analysiert: " + mapperLocation +" '", e); } endlich {errorContext.instance (). reset (); } if (logger.isdebugenabled ()) {logger.debug ("Parsed Mapper -Datei: '" + mapperLocation + "'"); }}}MyBatis verwendet eine Instanz der XMLMapperBuilder -Klasse, um Mapper -Konfigurationsdateien zu analysieren.
public XMLMapperBuilder (Readerleser, Konfigurationskonfiguration, String -Ressource, Karte <String, Xnode> SQLFagments) {this (neuer XPathParser (Leser, true, configuration.getVariable (), New XMLMapperentityResolver ()), Konfiguration, Ressourcen, Ressourcen, SQLFagments); } private xmlmapperBuilder (xpathParser -Parser, Konfigurationskonfiguration, String -Ressource, Karte <String, Xnode> SQLFagments) {Super (Konfiguration); this.builderassistant = new mapperbuilderassistant (Konfiguration, Ressource); this.Parser = Parser; this.sqlfragments = sqlfragments; this.resource = Ressource; }Anschließend ruft das System die Parse -Methode von XMLMapperBuilder auf, um den Mapper zu analysieren.
public void parse () {// Wenn das Konfigurationsobjekt die XML -Konfigurationsdatei nicht geladen hat (das Laden von Duplikaten vermieden, müssen tatsächlich bestätigt werden, ob die Eigenschaften und der Inhalt des Mapper -Knotens analysiert wurden, // Vorbereitung auf das Parsen der untergeordneten Knoten wie Cache, SQL, SELECTMAPMAP, Parametermap usw.). zum Laden von if (! configuration configuration.addloadedResource (Ressource); BindMapperFornamePace (); } // analysieren den <resultmap> Knoten, der bei der Verarbeitung von Ergebnismaps in der Konfigurationsfunktion nicht verarbeitet wurde. ParsependingResultMaps (); // Analyse des <Cache> -Knotens, der bei der Verarbeitung von Cache-Ref in der Konfigurationsfunktion nicht vorhanden ist (dies geschieht, wenn Cache-Ref vor dem Cache-Knoten geladen wird, auf den sie zeigt) analysiert wird. // wie oben, wenn der Cache nicht geladen wird, wird auch eine Ausnahme ausgelöst, wenn die Verarbeitungsanweisung analysiert wird. }Der Prozess von MyBatis, der die XML -Datei des Mapper analysiert, ist bereits sehr offensichtlich. Schauen wir uns an, wie es den Mapper analysiert:
private void configurationElement (xnode context) {try {// das Namespace -Attribut des Mapper -Knoten -String -Namespace = context.getStringTribute ("Namespace"); if (namespace.equals ("")) {throw New Builderexception ("Mappers Namespace kann nicht leer sein"); } // Setzen Sie den aktuellen Namespace Builderassistant.setCurrentNameSpace (Namespace); // analysieren Sie den MAPPER <cache-ref> node cachereFelement (context.evalnode ("cache-ref")); // Analyse des MAPPERS <Cache> Knoten -Sachelement (context.evalnode ("cache")); // Parametermapelement (context.evalnodes ("/mapper/parametermap") analysieren (context.evalnodes ("); // Analyse des Mapper <resultMap> node resultMapElements (context.evalnodes ("/mapper/resultMap")); // Analyse des Mapper <SQL> Knoten SQLElement (context.evalnodes ("/mapper/sql")); // Verwenden Sie das XMLStatementBuilder -Objekt, um das Mapper <Select>, <Seturn>, <Up geht>, <Löte> Knoten zu analysieren // Mybaits verwenden die MADPDStatement.builder -Klasse, um ein Kartentatelement zu erstellen, // so ein SQL in MyBaits entsprechend einem Mapped -Statement -Objekt, das einem MappedStatement -Objekt entspricht. BuildStatementFromContext (context.evalnodes ("SELECT | Einfügen | Aktualisieren | löschen")); } catch (Ausnahme E) {Neue BuilderException werfen ("Fehler analysieren Mapper XML. Ursache:" + e, e); }}Die Konfigurationsfunktion spricht fast alle untergeordneten Knoten im Mapper -Knoten an. Zu diesem Zeitpunkt analysiert MyBaits alle Knoten im Mapper und fügt sie dem Konfigurationsobjekt hinzu, damit das SQLSessionFactory -Objekt jederzeit verwendet werden soll. Hier müssen wir einige Erläuterungen hinzufügen, wie MyBaits die Funktion der ParsestatementNode des Objekts der XMLStatementBuilder -Klasse verwendet, um die addMaptedStatement des Mapperbuilderassistant -Objekts builderssistant auszuleihen, um die Eindämpferung mit dem Konfigurationsklassenobjekt zu unterteilen:
public void ParsestatementNode () {// id Attribut String id = context.getStringAttribute ("id"); // DataBaseID -Attribut -String -String -DatenBaseId = context.getStringAttribute ("DataBaseId"); if (! DataBaseIdMatchSeScurrent (ID, DataBaseID, this.RequiredDatabaseId)) {return; } // Fetchsize Attribut Integer fetchsize = context.getIntattribute ("fetchsize"); // Timeout Attribut Integer timeout = context.getIntattribute ("Timeout"); // ParameterMap Attribut String parametermap = context.getStringAttribute ("parametermap"); // ParameterType Attribut String parameterType = context.getStringAttribute ("parameterType"); Class <?> ParameterTypeclass = resolVeclass (parameterType); // resultMap Attribut String resultMap = context.getStringAttribute ("resultMap"); // resultType Attribut String resultType = context.getStringAttribute ("resultType"); // Lang Attribut String lang = context.getStringAttribute ("Lang"); Languagedriver LangDriver = getLanguagedriver (Lang); Class <?> ResultTypeclass = resolVeclass (resultType); // resultsetType attribut string resultsetType = context.getStringAttribute ("resultsetType"); AnweisungType AnweisungType = StatementType.ValueOf (context.getStringAttribute ("StatementType", StatementType.PreePared.toString ())); ResultsetType resultsetTypeenum = ResolveresultsettType (resultsetType); String nodhename = context.getNode (). GetNoDename (); SQLCommandType SQLCommandType = SQLCommandType.ValueOf (nodhename.toUppercase (Local.English)); // Ist es ein <auswählen> node boolean isselect = SQLCommandType == SQLCommandType.Select; // FlushCache -Attribut boolean flushcache = context.getBooleAttribute ("FlushCache",! IsSelect); // Usecache Attribut boolean usecache = context.getBooleanAttribute ("usecache", isselect); // resultRorded Attribut boolean resultordeded = context.getBooleanAttribute ("resultradered", false); // Fragmente vor dem Parsen des XmlinCludetransformators includeParser = neuer XmlinCludetransformer (Konfiguration, Builderassistant) einschließen; IncludeParser.ApplyIncludes (context.getNode ()); // SelectKey analysieren und entfernen. processelectKeyNodes (ID, ParameterTypeclass, LangDriver); // Die SQL (Pre: <SelectKey> und <einhäufungen> analysiert und entfernt) SQLSource SQLSource = LangDriver.createSQLSource (Konfiguration, Kontext, Parametertypeclass); // Results Sets -String -Ergebnissets = context.getStringAttribute ("resultets"); // KeyProperty Property String von KeyProperty = context.getStringAttribute ("KeyProperty"); // KeyColumn Property String keyColumn = context.getStringAttribute ("keyColumn"); Keygenerator Keygenerator; String keystatementId = id + selectKeyGenerator.select_key_suffix; keystatementId = builderassistant.ApplyCurrentNamePace (KeystatementId, true); if (configuration.haskeyGenerator (keystatementId)) {keygenerator = configuration.getKeyGenerator (KeystatementId); } else {// useGeneratedKeys Attribut keygenerator = context.getbooleanAttribute ("useGeneratedKeys", configuration.isusegeneratedKeys () && sqlcommandtype.insert.equals (SQLCommandType))? New JDBC3KeyGenerator (): New NokeyGenerator (); } builderAssistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, parameterMap, parameterTypeClass, resultTypeClass, resultSetTypeEnum, flushCache, useCache, resultOrdered, keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets); } Aus dem obigen Code können wir feststellen, dass MyBaits XPath verwendet, um die MakPer -Konfigurationsdatei zu analysieren und dann den zugeordneten Bauherrn in IT zu erstellen und das erhaltene Objekt in das Konfigurationsobjekt zu assoziieren. Dieses Konfigurationsobjekt kann aus SQLSession erhalten werden, was das Problem erklärt, wie Mybaits den Mapper erhält und die SQL -Anweisungen darin ausführt, wenn wir SQLSession verwenden, um die Datenbank zu betreiben.