Métodos incorporados para el mapeador
La capa del modelo es la clase de entidad, correspondiente a la tabla de la base de datos. La capa del controlador es un servlet, que es principalmente responsable del control del proceso del módulo comercial, llamando al método de interfaz de servicio y en Struts2 está acción. La capa de servicio realiza principalmente juicios lógicos, y la capa DAO es la capa de acceso de datos, que se conecta con la base de datos. En cuanto a Mapper, el archivo de mapeo mapeador se usa en la capa DAO.
Aquí hay una descripción del método incorporado de mapeador:
1. CountByExample ===> Consulta la cantidad de acuerdo con las condiciones
int countByExample (ejemplo de UserExample); // La siguiente es una lista completa de casos. UserExample Ejemplo = new UserExample (); Criterios criterios = ejemplo.createCriteria (); criterios.AnduseNAMEEQUALTO ("Joe"); int count = userDao.CountByExample (ejemplo); Equivalente a: select Count (*) del usuario donde username = 'Joe'
2. EletyByExample ===> Eliminar múltiples elementos de acuerdo con las condiciones
int DeleteByExample (Ejemplo de cuenta de cuenta); // El siguiente es un caso completo UserExample Ejemplo = new UserExample (); Criterios criterios = ejemplo.createCriteria (); criterios.AnduseNAMEEQUALTO ("Joe"); userDao.DeleteByExample (ejemplo); equivalente a: Eliminar del usuario donde username = 'Joe' 3. EletyByPrimaryKey ===> Eliminar un solo elemento de acuerdo con las condiciones
int deletyprimarykey (ID de entero); userdao.deleteByPrimaryKey (101);
Equivalente a:
Eliminar del usuario donde id = 101
4. Insertar ===> Insertar datos
int Insert (registro de cuenta); // El siguiente es el usuario completo de Case User = New User (); //user.setid(101); user.setUsername ("prueba"); user.setPassword ("123456") user.setEmail ("[email protected]"); userdao.insert (usuario);Equivalente a:
Insertar en los valores del usuario (ID, nombre de usuario, contraseña, correo electrónico) (101, 'prueba', '123456', '[email protected]');
5. Insertselective ===> Insertar datos
int Insertselective (registro de cuenta);
6. SelectByExample ===> Datos de consulta basados en condiciones
List <Co cuenta> selectByExample (ejemplo de cuenta de cuenta); // El siguiente es un caso completo UserExample Ejemplo = new UserExample (); criterios criterios = ejemplo.createCriteria (); criteria.andusernameequalTo ("Joe"); criteria.anduserNameIsNull (); ejemplo.setOrderClause ("useNeName ASc, correo electrónico descartado"); list <?> list = userDaO.EnsEntByExtematy; * Del usuario donde username = 'Joe' y el nombre de usuario es un pedido nulo por nombre de usuario ASC, correo electrónico DESC // NOTA: El archivo userExample.java generado por ibator contiene un criterio de clase interna estática. Existen muchos métodos en los criterios, principalmente para definir las condiciones de consulta después de la declaración SQL donde.7. SelectByPrimaryKey ===> Datos de consulta basados en la clave principal
Cuenta selectbyprimarykey (ID de entero); // equivalente a seleccionar * del usuario donde id = ID de variable
8. UpdateByExampleLective ===> Actualizar campos con valores no nulos según las condiciones
int uplyByExMempleSelective (@param ("registro") Registro de cuenta, @param ("ejemplo") de cuenta de cuenta); // La siguiente es una lista completa de casos UserExample Ejemplo = new UserExample (); Criterios criterios = ejemplo.createCriteria (); criterios.AnduseNAMEEQUALTO ("Joe"); Usuario user = nuevo usuario (); user.setPassword ("123"); userdao.UpdateByPrimaryKeySelective (usuario, ejemplo); equivalente a: actualizar el usuario establecido contraseña = '123' donde username = 'Joe'
9. UpdateByExMempleSelective ===> Actualización por condición
int updateByExample (@param ("registro") Registro de cuenta, @param ("ejemplo") de cuenta de cuenta);10. UpdateByPrimaryKeySelective ===> Actualizar según las condiciones
int updateByPrimaryKeySelective (registro de cuenta); // El siguiente es un usuario completo user user = new User (); user.setid (101); user.setpassword ("Joe"); userdao.updateByPrimaryKeySelective (usuario);Equivalente a:
Actualizar el usuario establecer contraseña = 'Joe' donde id = 101
int updateByPrimaryKeySelective (registro de cuenta); // El siguiente es un usuario completo user User = new User (); user.setid (101); user.setpassword ("Joe"); userdao.updateByPrimaryKeySelective (usuario);Equivalente a: actualizar el usuario establecido contraseña = 'Joe' donde id = 101
11. UpdateByPrimaryKey ===> Presione la tecla principal para actualizar
int updateByPrimaryKey (registro de la cuenta); // El siguiente es un usuario de caso completo user = new User (); user.setID (101); user.setUsername ("Joe"); user.setPassword ("Joe"); user.setEmail ("[email protected]"); userDao.UpdateByPrimaryKey (usuario);Equivalente a:
Actualizar usuarios establecer username = 'Joe', contraseña = 'Joe', correo electrónico = '[email protected]' donde id = 101
int updateByPrimaryKey (registro de cuenta); // El siguiente es un usuario de caso completo user = new User (); user.setID (101); user.setUsername ("Joe"); user.setPassword ("Joe"); user.setEmail ("[email protected]"); userDao.UpdateByPrimaryKey (usuario);Equivalente a:
Actualizar usuarios establecer username = 'Joe', contraseña = 'Joe', correo electrónico = '[email protected]' donde id = 101
Analizar el archivo de configuración XML del mapeador
Echemos un vistazo a cómo MyBatis lee el archivo de configuración XML del mapeador y analiza las declaraciones SQL en él.
Todavía recordamos configurar el SQLSessionFactory así:
<bean id = "sqlSessionFactory"> <Property name = "dataSource" ref = "dataSource"/> <propiedad name = "configLocation" value = "classpath: configuration.xml"> </property> <propiedad name = "mapperLocations" value = "classpath: com/xxx/myBatis/mapper/*. xml"/> <name de propiedad = " value = "com.tiantian.mybatis.model" /> < /bean>
Aquí hay una propiedad MapperLocations, que es una expresión. SQLSessionFactory leerá todos los archivos de formato XML debajo del paquete com.xxx.mybaits.mapper de acuerdo con esta expresión. Entonces, ¿cómo lees el archivo de configuración en función de este atributo?
La respuesta está en el método BuildSQLSessionFactory en la clase SQLSessionFactoryBean:
if (! IsEmpty (this.mapperLocations)) {for (recursos mapperLocation: this.mapperLocations) {if (mapperLocation == null) {continuar; } try {xmlMapperBuilder xmlMapperBuilder = new XMLMapperBuilder (mapperLocation.getInputStream (), Configuration, mappLocation.ToString (), configuration.getSqlFragments ()); xmlMapperBuilder.Parse (); } Catch (Exception e) {Throw NestedioException ("no logró analizar el recurso de mapeo: '" + mapperLocation + "'", e); } Finalmente {ErrorContext.Instance (). Reset (); } if (logger.isDebugeNabled ()) {logger.debug ("archivo mapper analizado: '" + mappreLocation + "'"); }}}MyBatis utiliza una instancia de la clase XMLMapperBuilder para analizar archivos de configuración de mapeadores.
public xmlmapperBuilder (lector lector, configuración de configuración, recursos de cadena, map <string, xnode> sqlfragments) {this (new XPathParser (lector, true, configuración.getVariebles (), new XMLMapperSEntityResolver (), configuración, recurso, sqlfragments); } private xmlMapperBuilder (XPATHParser Parser, configuración de configuración, recurso de cadena, map <string, xnode> sqlfragments) {super (configuración); this.BuilderAssistant = new MapPerBuilderAssistant (Configuración, recurso); this.parser = parser; this.sqlfragments = sqlfragments; this.resource = recurso; }Luego, el sistema llama al método de análisis de XMLMapperBuilder para analizar el mapeador.
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 to Cargado if (! Configuration.isResourCelOaded (Resource)) {ConfigurationElement (parser.evalnode ("/mapper")); Configuration.AddLoadedResource (recurso); bindmapperfornamespace (); } // analiza el nodo <ResultMap> que no se ha procesado al procesar el resultado de resultados en la función ConfigurationElement. parsependingResultMaps (); // analiza el nodo <cache> que no existe al procesar cache-ref en la función de configuración (esto sucederá si cache-ref se carga antes del nodo de caché al que señala) parsependingchacherefs (); // Igual que el anterior, si el caché no se carga, también se lanzará una excepción al procesar la declaración parsependingStatements (); }El proceso de mybatis analiza el archivo XML del mapeador ya es muy obvio. Echemos un vistazo a cómo analiza el mapeador:
privado void ConfigurationElement (contexto xnode) {try {// Obtenga el atributo de espacio de nombres del espacio de nódulo mapper nodo namespace = context.getStringAttribute ("Namespace"); if (namespace.equals ("")) {tire nueva construcción de builderException ("El espacio de nombres de mapper no puede estar vacío"); } // Establezca el espacio de nombres actual BuilderSistant.SetCurrentNamespace (espacio de nombres); // analizar el mapeador <cache-ref> nodo cacheRefeReFelement (context.evalNode ("cache-ref")); // analizar el cacheelement de nodo <cache> del mapeador (context.evalNode ("cache")); // analizar el nodo del mapeador de parametermapelement (context.evalnodes ("/mapper/parametermap")); // analiza los mapeadores de resultados del nodo <ResultMap> (context.evalNodes ("/mapper/resultMap")); // analiza el nodo <sql> SQLELEMENT (context.EvalNodes ("/mapper/sql")); // use el objeto xmlStatementBuilder para analizar el mapeador <Select>, <sert>, <Apdate>, <Elelete> nodos, // mybaits usará la clase MappedStatement. BuildStatementFromContext (context.evalNodes ("Seleccionar | Insertar | Update | Eliminar")); } Catch (Exception e) {Throw New BuilderException ("Error de análisis de análisis XML. Causa:" + E, E); }}La función de configuración analiza casi todos los nodos infantiles en el nodo mapeador. En este punto, MyBaits analiza todos los nodos en el mapeador y los agrega al objeto de configuración para el objeto SQLSessionFactory que se utilizará en cualquier momento. Aquí debemos agregar alguna explicación sobre cómo MyBaits usa la función ParsestatementNode del objeto de la clase XMLStatementBuilder para tomar prestada la Estado de Mapeador del Constructor de objetos MapperBuilderAsistant para analizar el Estado Mapped y asociarlo al objeto de clase de configuración:
public void parsestatementNode () {// id Attribute String id = context.getStringAttribute ("id"); // DatabaseID Attribute String DatabaseId = context.getStringAttribute ("DatabaseId"); if (! DatabaseIdMatchReRent (id, DatabaseId, this.RequiredDatabaseId)) {return; } // FetchSize Attribute Integer fetchSize = context.getIntattribute ("fetchSize"); // TIMEOUT Attribute Integer Timeout = context.getIntattribute ("Tiempo de tiempo"); // parametermap atribute string parametermap = context.getStringAttribute ("parametermap"); // parametertype atributo cadena parametertype = context.getStingAttribute ("parametertype"); Clase <?> ParametertyPeClass = resolVecLass (parametertype); // ResultMap Atribute String ResultMap = context.getStringAttribute ("ResultMap"); // String de atributo de Atribute resultType resultType = context.getStringAttribute ("resultType"); // lang atributo cadena lang = context.getStringAttribute ("lang"); Languagyriver langdriver = getLanguagegedriver (lang); Clase <?> DentTypeClass = resolVecLass (resultyPe); // Atribute de resultados de resultados String ResultSetType = context.getStringAttribute ("ResultSetType"); StattleType stattleType = DeclaryType.ValueOf (context.getStringAttribute ("DeclarationType", DeclaryType.Prepared.ToString ())); ResultsetType ResultsetTypeenum = ResolverSultSettype (Resultsettype); String NodeName = context.getNode (). GetNodeName (); SqlCommandType sqlCommandType = sqlCommandType.ValueOf (noDename.ToUpperCase (locale.English)); // ¿Es un nodo boolean isselect = sqlCommandType == sqlCommandType.select; // atributo flushcache boolean flushcache = context.getBooleanAttribute ("FlushCache" ,! Isselect); // atributo useCache boolean useCache = context.getBooleanAttribute ("useCache", isselect); // atributo de resultado boolean resultOrdered = context.getBooleanAttribute ("ResultRoRdered", falso); // Incluya fragmentos antes de analizar XmlinCludetransformer includeParser = new XmlinCludErformer (Configuración, BuilderSistant); includeParser.applyCludes (context.getNode ()); // analizar la tecla de selección después de incluirlos y eliminarlos. ProcessSelectKeyNodes (ID, ParametertyPeClass, LangDriver); // analizó el SQL (pre: <selickey> e <incluye> analizado y eliminado) SQLSource SQLSource = LangDriver.CreateSQLSource (configuración, contexto, parametertyPeClass); // Resultss Propiedad String Resultsets = context.getStringAttribute ("Resultsets"); // Propiedad KeyProperty String KeyProperty = context.getStringAttribute ("KeyProperty"); // Propiedad KeyColumn String KeyColumn = context.getStringAttribute ("KeyColumn"); KeyGenerator KeyGenerator; String keyStatementId = id + selectKeyGenerator.select_key_suffix; KeyStatementId = BuilderAssistant.ApplyCurrentNamesPace (KeyStatementId, true); if (Configuration.hasKeyGenerator (KeyStatementId)) {keyGenerator = Configuration.getKeyGenerator (KeyStatementId); } else {// useGeneratedKeys Attribute keyGenerator = context.getBooleanAttribute ("UseGeneratedKeys", Configuration.IsuseGeneratedKeys () && sqlcommandtype.insert.equals (sqlCommandType))? nuevo JDBC3KeyGenerator (): nuevo NoKeyGenerator (); } builderAssistant.AddMappedStatement (id, sqlSource, DeclaryType, SQLCommandType, FetchSize, TimeOut, Parametermap, ParametertyPeClass, resultTyPeClass, ResultSetTypeenum, FlushCache, UsEdecache, Resultado, KeyGenerator, KeyPerty, KeyColumn, DatabSoD, databDaBeSid, LangDriver, LANGDRITRES, LANGDRIMTR) } En el código anterior, podemos ver que MyBaits usa XPATH para analizar el archivo de configuración del mapeador y luego crea el resultado de resultados, parametermap, caché, declaración y otros nodos utilizando el constructor asociado y asocia el objeto obtenido en el objeto de configuración. Este objeto de configuración se puede obtener de SQLSession, que explica el problema de cómo mybaits obtiene el mapeador y ejecuta las declaraciones SQL cuando usamos SQLSession para operar la base de datos.