Métodos internos para maperar
A camada do modelo é a classe de entidade, correspondente à tabela do banco de dados. A camada do controlador é um servlet, que é principalmente responsável pelo controle do processo do módulo de negócios, chamando o método da interface de serviço e no Struts2 é a ação. A camada de serviço faz principalmente julgamentos lógicos, e a camada DAO é a camada de acesso a dados, que se conecta ao banco de dados. Quanto ao mapeador, o arquivo de mapeamento do mapeador é usado na camada DAO.
Aqui está uma descrição do método interno de mapeador:
1. CountByExample ===> Consulte a quantidade de acordo com as condições
int countByExample (exemplo useRexample); // a seguir é uma lista completa de casos. UseRexample exemplo = new useRexample (); Critérios critérios = exemplo.createcriteria (); critérios.andusenameEqualto ("Joe"); int conting = userdao.countByExample (exemplo); Equivalente a: Selecione a contagem (*) do usuário onde o nome de usuário = 'Joe'
2. DeleteByExample ===> Exclua vários itens de acordo com as condições
int deLeteByExample (exemplo da conta); // a seguir é um exemplo completo userexample exemplo = new useRexample (); Critérios critérios = exemplo.createcriteria (); critérios.andusenameEqualto ("Joe"); userdao.deleteByExample (exemplo); Equivalente a: Excluir do usuário onde o nome de usuário = 'Joe' 3. DeletebyPrimaryKey ===> Excluir um único item de acordo com as condições
int DeLeteByPrimaryKey (ID inteiro); Userdao.DeleteByPrimaryKey (101);
Equivalente a:
Exclua do usuário onde id = 101
4. Inserir ===> Inserir dados
int insert (registro de conta); // a seguir é o usuário do caso completo do usuário = new User (); //User.SetId(101); user.setUserName ("teste"); user.setPassword ("123456") user.setemail ("[email protected]"); userdao.insert (usuário);Equivalente a:
inserir valores de usuário (ID, nome de usuário, senha, email) (101, 'teste', '123456', '[email protected]');
5. InsertSelective ===> Insira dados
int insertSelective (registro da conta);
6. SelectByExample ===> Dados de consulta com base nas condições
List <Count> SelectByExample (Exemplo da AccountExample); // a seguir é um caso completo userexample exemplo = new useRexample (); critérios critérios = exemplo.createcriteria (); critérios.andUserNameEqualTo ("joe"); critério.aMemernameisnull (); exemplo.setOrderByCláuse ("usernames aSc (e -mail descend); lista <? Usuário WHERE UserName = 'Joe' e Nome de usuário são NULL ORDEM PELO NOME DE USERNO ASC, EMAIL DESC // NOTA: O arquivo userexample.java gerado pelo ibator contém um critério de classe interna estática. Existem muitos métodos em critérios, principalmente para definir as condições de consulta após a instrução SQL onde.7. SelectByPrimaryKey ===> Dados de consulta com base na chave primária
Conta selectByPrimaryKey (ID inteiro); // equivalente a selecionar * do usuário onde id = ID da variável
8. UpdateByExMpleSelective ===> Atualizar campos com valores não nulos de acordo com as condições
int updateByExampleSelective (@param ("registro") registro de conta, @param ("exemplo") exemplo de conta); // a seguir é uma lista completa da lista useRexample Exemplo = new UseRexample (); Critérios critérios = exemplo.createcriteria (); critérios.andusenameEqualto ("Joe"); Usuário do usuário = novo usuário (); user.setPassword ("123"); userdao.UpDateByPrimaryKeySelective (usuário, exemplo); Equivalente a: Atualizar usuário Definir senha = '123' onde o nome de usuário = 'Joe'
9. UpdateByExMpleSelective ===> Atualização por condição
int updateByExample (@param ("registro") registro de conta, @param ("exemplo") exemplo de conta);10. UpdateByPrimaryKeySelective ===> Atualizar de acordo com as condições
int updateByPrimaryKeySelective (registro da conta); // A seguir, é apresentado um usuário completo de usuário do caso = novo user (); user.setId (101); user.setPassword ("joe"); userdao.updateByPrimaryKeySelective (usuário);Equivalente a:
Atualizar usuário Definir senha = 'Joe' onde id = 101
int updateByPrimaryKeySelective (registro da conta); // a seguir é um usuário completo do caso do usuário = new User (); user.setId (101); user.setPassword ("joe"); userdao.UpDateByPrimaryKeySelective (Usuário);Equivalente a: Atualizar o usuário Definir senha = 'Joe' onde id = 101
11. UpdateByPrimaryKey ===> Pressione a tecla primária para atualizar
int updateByPrimaryKey (registro da conta); // A seguir, é apresentado um usuário completo do caso do usuário = new User (); user.setId (101); user.setUserName ("Joe"); user.setPassword ("Joe"); user.setemail ("[email protected]"); userdao.UpDateByPrimaryKey (usuário);Equivalente a:
Atualizar usuário definido nome de usuário = 'Joe', senha = 'Joe', email = '[email protected]' onde id = 101
int updateByPrimaryKey (registro da conta); // a seguir é um usuário completo de caixa do caso = novo usuário (); user.setId (101); user.setUserName ("Joe"); user.setPassword ("Joe"); user.setemail ("[email protected]"); userdao.UpDateByPrimaryKey (usuário);Equivalente a:
Atualizar usuário definido nome de usuário = 'Joe', senha = 'Joe', email = '[email protected]' onde id = 101
Analisando o arquivo de configuração XML do mapeador
Vamos dar uma olhada em como o Mybatis lê o arquivo de configuração XML do mapeador e analisa as instruções SQL nele.
Ainda nos lembramos de configurar o SQLSessionFactory como este:
<bean id = "sqlSessionFactory"> <propriedade name = "dataSource" ref = "dataSource"/> <propriedade name = "configLocation" value = "classPath: configuration.xml"> </property> <names/"mapperlocations" = "classPath: com/xxx/mybatis/mapper/". value = "com.tiantian.mybatis.model" /> < /bean>
Aqui está uma propriedade MapperLocations, que é uma expressão. O SQLSessionFactory lerá todos os arquivos de formato XML abaixo do pacote com.xxx.mybaits.mapper De acordo com esta expressão. Então, como você lê o arquivo de configuração com base neste atributo?
A resposta está no método BuildSQLSessionFactory na classe SQLSessionFactoryBean:
if (! isEmpty (this.mapperlocations)) {for (Recurso MapperLocation: this.mapperlocations) {if (mapperLocation == null) {continuação; } tente {xmlmapperBuilder xmlmapperBuilder = new XMLMapperBuilder (mapperLocation.getInputStream (), Configuration, mapperLocation.tostring (), configuration.getsqlfragments ()); xmlmapperBuilder.parse (); } catch (Exceção e) {THROW NOVA NORTEEXCECTION ("Falha ao analisar o recurso de mapeamento: '" + mapperLocation + "'", e); } finalmente {ErrorContext.Instance (). Reset (); } if (logger.isdebugenabled ()) {Logger.debug ("arquivo de mapeador parsed: '" + mapperLocation + "'"); }}}O Mybatis usa uma instância da classe XMLMapperBuilder para analisar arquivos de configuração do Mapper.
public xmlmapperbuilder (leitor leitor, configuração de configuração, recurso de string, mapa <string, xnode> sqlfragments) {this (novo xpathParser (leitor, true, configuration.getvariables (), new xmlmapperentityResolver ()), confundência, recurso, recurso, sqfrutes, sqfrutes, sqfrutes, sqfrutes, sqfrutes, sqfrutes, sqfrutes, sqfrutes, sqfrutes, sqfrutes, sqfrutes, sqfrutes, sqfrutes, sqfrutes, sqfrutes, sqfruments, sqfrutments, sqfrutments; } private xmlmapperBuilder (analisador xpathParser, configuração de configuração, recurso de string, mapa <string, xnode> sqlfragments) {super (configuração); this.builderAssistant = new MapperBuilderArsistant (Configuração, Recurso); this.parser = analisador; this.sqlfragments = sqlfragments; this.Resource = Resource; }Em seguida, o sistema chama o método Parse do XMLMapperBuilder para analisar o 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 do recurso a ser carregado if (! Configuration.isResourceLoaded (Resource)) {ConfigurationElement (parser.evalnode ("/mapper"); Configuration.adDloadedResource (recurso); bindMapperForNamespace (); } // Analisar o nó <s ResultMap> que não foi processado ao processar o ResultMap na função ConfigurationElement. ParsependingResultmaps (); // Analisar o nó <cache> que não existe ao processar o cache-ref na função ConfigurationElement (isso acontecerá se o cache-ref for carregado antes do nó do cache apontar) parsependerchacherefs (); // O mesmo que acima, se o cache não for carregado, uma exceção também será lançada ao processar a instrução parsependingstatements (); }O processo de Mybatis analisando o arquivo XML do mapeador já é muito óbvio. Vamos dar uma olhada em como ele analisa o mapeador:
private void ConfigurationElement (xnode context) {try {// Obtenha o atributo namespace do espaço nomes de string de nó do mapeador = context.getStringAttribute ("namespace"); if (namespace.equals ("")) {lança nova builderexception ("o espaço para nome do mapper não pode estar vazio"); } // Defina o namespace atual BuilderArsistant.SetCurrentNamesPace (namespace); // analisa o Mapper's <cache-ref> node CacherefElement (context.evalnode ("cache-ref")); // analisa o cacheelement do Mapper's <cache> (context.evalnode ("cache")); // analisa o nó do mapeador <ametermap> parameterMapelement (context.evalnodes ("/mapper/parameterMap")); // analisa o <ResultMap> do MAPERMAP do mapeador (context.evalnodes ("/mapper/resultmap")); // analisa o nó do mapeador <sql> sqlelement (context.evalnodes ("/mapper/sql")); // Use o objeto xmlstatementBuilder para analisar os nós <select>, <snsert>, <puerping>, <lete>, // myBaits usarão a classe MappEdStatement.Builder para construir um objeto MappedStatement, // um Sql em MyBaits corresponde a uma mapeada BuildStatementFromContext (Context.Evalnodes ("SELECT | inserir | Update | delete")); } Catch (Exceção e) {THROW NOVA BuildException ("Erro Parsing Mapper XML. Causa:" + e, e); }}A função ConfigurationElement analisa quase todos os nós filhos no nó do mapeador. Nesse ponto, o MyBaits analisa todos os nós no mapeador e os adiciona ao objeto de configuração para que o objeto SQLSessionFactory seja usado a qualquer momento. Aqui, precisamos adicionar alguma explicação sobre como o MyBaits usa a função de parsestatementNode do objeto da classe XMLStatementBuilder para emprestar o estatuto adicional do objeto MapperBuilderSisistent BuilderAssistant para analisar a estatição mapeada e associá -lo ao objeto de configuração::
public void parsestatementNode () {// ID ATRIÇÃO STRING ID = context.getStringAttribute ("id"); // DatabaseId attribute string string databaseId = context.getStringAttribute ("DatabaseId"); if (! DatabaseIdMatchesCurrent (ID, DatabaseId, this.ReQuiredDatabaseId)) {return; } // buscar atributo inteiro fetchSize = context.getIntattribute ("fetchSize"); // Timeout Atributo Timeout inteiro = context.getIntattribute ("Timeout"); // parametermap attribute string parametermap = context.getStringAttribute ("parametermap"); // parameterType atributo string parameterType = context.getStringAttribute ("parameterType"); Classe <?> ParameterTyPeclass = resolveclass (parameterType); // ResultMap Attribute String resultMap = context.getStringAttribute ("resultMap"); // ResultType attribute string resultType = context.getStringAttribute ("ResultType"); // atributo lang string lang = context.getStringAttribute ("lang"); Languagedriver Langdriver = GetLanguagagedriver (Lang); Classe <?> ResultyPeclass = resolveclass (resultadoType); // ResultetSettype Attribute String ResultSettype = context.getStringAttribute ("ResultSettype"); DeclarationTyPE DeclarationType = DeclarationType.Valueof (context.getStringAttribute ("Declaração", DeclarationType.Prepared.toString ())); ResultSettype ResultSettypeenum = ResolverSultSettype (ResultSettype); String nodename = context.getNode (). GetNodename (); SqlCommandType sqlCommandType = sqlCommandtype.valueof (nodename.ToupPercase (Locale.English)); // é um <select> nó boolean isSselect = sqlCommandType == sqlCommandType.Select; // atributo de flushcache boolean flushCache = context.getBooleanAttribute ("FlushCache", KUSELECT); // atributo usecache boolean usecache = context.getBooleanAttribute ("USECACHE", ISSELECT); // ATRIBUIÇÃO ATRESTORDODOUNOUNDOUNOUNDOUNEDOUNODOLEANDOUNDOUNDOURSODED = CONTEXT.GETBOOLEANATTRIBUTO ("ResultOmeded", False); // inclui fragmentos antes de analisar xmlincludetransformer IncluirParser = novo xmlincludetransformer (configuração, construtora); IncluirParser.Applyincludes (context.getNode ()); // parse selectKey após incluí -los e removê -los. ProcessSelectKeyNodes (ID, ParameterTyPeclass, Langdriver); // Analisar o SQL (pré: <selectKey> e <cubs> foram analisados e removidos) sqlsource sqlsource = langdriver.createsqlsource (configuração, contexto, parameterTypeclass); // Resultados da propriedade String Resultados = context.getStringAttribute ("Resultados"); // KeyProperty Property String keyProperty = context.getStringAttribute ("KeyProperty"); // KeyColumn Property String keyColumn = context.getStringAttribute ("keyColumn"); KeyGenerator KeyGenerator; String keystatementId = id + selectKeyGenerator.Select_Key_Suffix; keystatementId = BuilderAssistant.ApplyCurrentNamespace (KeyStateMementId, true); if (Configuration.hasKeyGenerator (KeyStateMementId)) {keyGenerator = Configuration.getKeyGenerator (KeyStateMementId); } else {// useGeneratedKeys attribute keyGenerator = context.getBooleanAttribute ("usegeneratedkeys", configuration.isusegeneratedkeys () && sqlCommandtype.insert.equals (sqlCommandType))? novo jdbc3KeyGenerator (): new noKeyGenerator (); } builderAssistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, parameterMap, parameterTypeClass, resultTypeClass, resultSetTypeEnum, flushCache, useCache, resultOrdered, keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets); } A partir do código acima, podemos ver que o MyBaits usa o XPath para analisar o arquivo de configuração do mapeador e, em seguida, cria o resultado, parametermap, cache, instrução e outros nós usando o construtor associado e associa o objeto obtido no objeto de configuração. Esse objeto de configuração pode ser obtido do SQLSession, que explica o problema de como o MyBaits recebe o mapeador e executa as instruções SQL nele quando usamos o SQLSession para operar o banco de dados.