MyBatis configuração XML resultMap configuração de arquivo

 construtor - para, quando a classe é instanciado, o resultado é injetado no construtor
        idArg - parâmetro de identificação, como resultado da etiqueta de identificação pode ajudar a melhorar o desempenho global
        arg - será injetado em um comum construtor resultado
    id - um resultado ID; na sequência da etiqueta de identificação podem ajudar a melhorar as propriedades gerais
    resultar - injectar num atributo de campo ou resultados JavaBean ordinário
    associação - associação de um tipo complexo, muitos dos resultados deste tipo de embalagens em
        mapeamentos resultado do assentamento - associação pode ser especificado como um elemento resultMap , ou uma referência
    recolha - recolha de um tipo complexo
        mapeamentos resultado aninhados - conjunto pode ser especificado como um elemento resultMap, ou uma referência a um
    discriminador - usar a valor resultante utilizado para determinar qual resultMap
        caso - mapeamento com base num resultado de algum valor
            aninhada mapeamentos resultado - um caso é em si um resultado de mapeamento, assim, pode compreender muitos dos mesmos elementos ou pode referir-se a um resultMap externo.

lista resultMap de atributos Atributo Descrição
id namespace atual um identificador exclusivo para identificar um mapa resultado.
nome da classe totalmente qualificado do tipo ou um tipo de alias (aliases pode ser construído em cima com referência à mesa).
Se Automapping este atributo, MyBatis ser mapeados para abrir ou fechar automaticamente o resultMap. Esta propriedade irá substituir a propriedade mundial autoMappingBehavior. O valor padrão é a seguinte: unset.

Melhor prática deve dar um passo para estabelecer os resultados do mapeamento. teste de unidade pode jogar uma grande ajuda neste processo. Se tentar criar um mapa como um grande resultado como exemplo acima e, em seguida, pode ser errado e difícil de usá-lo a completar o trabalho. De forma mais simples, evoluiu progressivamente. E não esqueça o teste de unidade! As desvantagens do uso de quadros é que às vezes eles se parecem com uma caixa preta (independentemente de se o código-fonte é visível). Garantir que você alcançar o comportamento desejado e consistente, a melhor opção é escrever testes de unidade. Ao apresentar um bug também pode desempenhar um importante papel.

A secção seguinte será descrita em detalhe para cada elemento.
& Resultado ID

<ID Propriedade = coluna "ID" = "a post_id" />
<Property Resultado = coluna "Assunto" = "post_subject" />

Estes mapas são o resultado do conteúdo básico. ID de valor e o resultado será um simples uma coluna para o tipo de dados (string, inteiro, ponto flutuante de precisão dupla, data, etc.) propriedade ou campo.

A única diferença entre os dois é que ID serão identificadas propriedades de um objecto, a qual vai ser utilizada ao comparar instâncias de objectos. Isso pode melhorar a performance geral, especialmente resultados de nidificação caching e cartografia (ou seja, juntar mapeamento) tempo.

Elemento tem dois atributos:
Atributo Descrição Id e Resultado da
um campo mapeado para uma propriedade ou propriedades dos resultados de coluna. Se JavaBeans propriedades para coincidir com o nome dado existe, então ele será usado. Caso contrário, MyBatis vai olhar para a propriedade no campo de uma dada nomes. Em qualquer um dos casos, pode ter complexo de navegação propriedade utilizando o formato habitual separados por ponto. Por exemplo, você pode mapear a algo muito simples: "username", ou mapeado para algo mais complicado como: "address.street.number".
Coluna coluna nome no banco de dados ou alias de coluna. Em geral, este parâmetro e ResultSet.getString (columnName) como transmitido para o método.
javaType um completo Java nome classe, aliás, ou um type (ver lista de aliases internos do tipo acima). Se você está mapeamento para um JavaBean, MyBatis geralmente pode descobrir o tipo. No entanto, se você está mapeando para um HashMap, então você deve especificar explicitamente o comportamento desejado para garantir javaType.
jdbcType tipo JDBC, apoiada tipo JDBC Consulte a tabela seguinte "tipo JDBC suportados." Só ser necessário inserir, atualizar e excluir permitir valores nulos na coluna especificada tipo JDBC. Este é um requisito JDBC em vez de requisitos MyBatis. Se você dirigir programação orientada a JDBC, você precisa especificar o valor nulo tipo possível.
typeHandler tipo padrão de processador que discutimos anteriormente. Usando essa propriedade, você pode substituir o tipo padrão de processador. O valor é o nome completo de um processadores do tipo Classe, ou um tipo de alias.
Suportados Tipos JDBC

para referência futura, tipo MyBatis JDBC por jdbcType enumeração incluiu suporte abaixo.
CHAR TIMESTAMP FLUTUADOR OUTRAS INDEFIN a BIT
TINYINT do sistema binário VARCHAR NVARCHAR REAIS
SMALLINT DUPLO VARBINARY CLOB um LONGVARCHAR o NCHAR
booleano inteiro NCLOB um LongVarBinary a data numérica
BIGINT DECIMAL nulo CURSOR A matriz TEMPO
construtor

modificando os atributos do objecto modo, suficiente para a maioria dos objectos de transferência de dados (Data Transfer Object, DTO) e a grande maioria dos requisitos do modelo de domínio. Mas em alguns casos você quiser usar aulas imutáveis. De um modo geral, raramente ou nunca muda, incluindo uma tabela de referência ou consulta de dados, é apropriado usar classes imutáveis. Construtor de injeção permite que você definir o valor do atributo classe na inicialização, sem expor métodos públicos. MyBatis também suporta propriedades privadas e propriedades de JavaBeans privadas para conseguir isso, mas algumas pessoas preferem a injeção Constructor. elemento constructor nasce para fazer isso.

Considere o seguinte construtor:

public class User {
   // ...
   o público usuário (ID Integer, String nome de usuário, int Age) {
     // ...
  }
// ...
}

, a fim de injetar o construtor resultado, MyBatis precisa para localizar o método adequado para a construção de alguma forma. No exemplo a seguir, uma MyBatis pesquisados declararam parâmetro de construtor é três, a fim java.lang.Integer, java.lang.String e arranjo int.

<Construtor>
   <idArg coluna = "ID" do javaType = "int" />
   <Arg coluna = "username" o / javaType = "String">
   <Arg coluna = "Age" o javaType = "_ int" />
</ construtor>

quando você, na ordem correta para garantir que os elementos arg construtor quando se lida com uma pluralidade de parâmetro propenso a erros. A partir da versão 3.4.3, você pode estar sob a premissa do nome de parâmetro especificado, elementos arg escrito em qualquer ordem. De modo a fazer referência ao parâmetro de construtor pelo nome, você pode adicionar notas @ param, ou usar opções de compilação dos -parameters 'e permitir opção useActualParamName (ativado por padrão) para construir o projeto. O exemplo a seguir é ainda o mesmo método de construção é eficaz, embora a ordem segundo e terceiro parâmetro de ordem declarado no construtor para o desfasamento.

<Construtor>

   <Arg column = "Age" o javaType = "_ int" nome = "Age" />
   <Arg column = "username" o javaType = nome "String" = "username" />
</ construtor>

Se o nome eo tipo existem as classes mesma da propriedade, você pode javaType omitido.

O restante propriedades e regras e elemento comum id eo resultado é o mesmo.
Atributo descreve os
nomes das colunas na coluna de banco de dados, ou aliases de coluna. Em geral, este parâmetro e ResultSet.getString (columnName) como transmitido para o método.
javaType um completo Java nome classe, aliás, ou de um tipo (ver lista de aliases internos do tipo acima). Se você está mapeamento para um JavaBean, MyBatis geralmente pode descobrir o tipo. No entanto, se você está mapeando para um HashMap, então você deve especificar explicitamente o comportamento desejado para garantir javaType.
jdbcType tipo JDBC, tipos JDBC suportados consulte "Tipo de JDBC Suportado" Antes deste formulário. Só ser necessário inserir, atualizar e excluir permitir valores nulos na coluna especificada tipo JDBC. Este é um requisito JDBC em vez de requisitos MyBatis. Se você dirigir programação orientada a JDBC, você precisa especificar o valor nulo tipo possível.
typeHandler tipo padrão de processador que discutimos anteriormente. Usando esta propriedade Você pode substituir o tipo padrão de processador. O valor é o nome completo de um processadores do tipo classe, ou um tipo aliás.
ID seleccionar declaração para mapear o carregamento propriedade complexa, a coluna vai recuperar dados da coluna de atributo especificado, passados como um parâmetro para esta instrução SELECT. Para mais detalhes, consulte rótulo Association.
resultMap resultMap o ID, pode ser mapeamento conjunto de resultados aninhada a uma árvore objeto adequado, selecionar as funções e propriedades semelhantes aos mapas pode conseguir multi-table join resultados da operação em um único ResultSet. Tal ResultSet conterá os resultados dos conjuntos duplicados ou parcialmente duplicadas de dados são mapeados para a árvore correcta objecto aninhada. Para conseguir isso, MyBatis permite que você "tandem" resultMap, a fim de resolver o problema dos resultados aninhados. Para mais informações, por favor consulte os seguintes elementos da Associação.
constructor nome nome do parâmetro. A partir da versão 3.4.3, especificando um nome específico, você pode escrever elemento arg em qualquer ordem. Ver acima.
Associated

<Associação Propriedade = coluna "autor" = "blog_author_id" o javaType = "o autor">
  <ID Propriedade = coluna "ID" = "a author_id" />
  <Resultado Propriedade column = "username" = "author_username" />
</ Associação >

as associações ofertas elemento "tem um" tipo de relacionamento. Por exemplo, no nosso exemplo, um usuário tiver um blog. Um mapeamento da associação funciona como qualquer outro resultado. Você especifica a propriedade de destino para obter os valores da coluna,

associação diferente é que você precisa dizer MyBatis como carregar a associação. MyBatis a este respeito, haverá duas maneiras diferentes:

    SELECT aninhada: executando outra instrução SQL mapeada que retorna o tipo complexo desejado.
    Resultados aninhados: Por mapeamento utilizando resultado aninhado para processar um subconjunto dos resultados duplicados combinados. Em primeiro lugar, em seguida, vamos examinar as propriedades do elemento. Tudo o que você vai ver que ele é apenas por um seleto e ordinários e

atributos de mapeamento de resultados resultMap.
Atributo Descrição
propriedade mapear o campo resultado coluna ou propriedade. Se JavaBeans propriedades para coincidir com o nome dado existe, então ele será usado. Caso contrário, MyBatis vai olhar para o mesmo campo determinado nome. Em ambos casos é possível usar o ponto habitual de navegação propriedade complexa. Por exemplo, você pode mapear a algo: "username", ou mapeado para algumas coisas complexas: "address.street.number".
javaType um completo Java nome classe, aliás, ou um type (ver lista de aliases internos do tipo acima). Se você está mapeamento para um JavaBean, MyBatis geralmente pode descobrir o tipo. No entanto, como javaType se você está mapeando para um HashMap, então você deve explicitamente especificar javaType para garantir o comportamento desejado.
Tipo jdbcType antes esta forma de suportado lista Tipo de JDBC. JDBC tipo só é necessária para inserção, actualização, e operações de exclusão pode ser processado em colunas vazios. Este é um requisito JDBC, jdbcType não um MyBatis. Se foram codificação directamente JDBC, você precisa especificar este tipo -, mas apenas para pares de valores anuláveis.
typeHandler Discutimos manipuladores tipo padrão anteriormente. Usando este atributo, typeHandler pode sobrepor o tipo padrão de processador. O valor é o nome completo da classe ou tipo de um processador é implementado, ou um tipo de alias.
Associada consulta aninhada
atributo Descreve
nomes de coluna da coluna do banco de dados, ou rótulos de colunas de mudança de nome. Essa seqüência normalmente passado para ResultSet.getString métodos (columnName) são os mesmos. coluna NOTA: negócio Para com chaves compostas, é possível especificar uma pluralidade de nomes de coluna por coluna = "{PROP1 = col1, prop2 = col2}" sintaxe para passar isso para a consulta aninhada. Este prop1 causas e prop2 para definir o objeto de parâmetro para a consulta aninhada alvo.
selecionar outro tipo complexo mapeamento de declaração ID, ele pode carregar o mapeamento da propriedade desejada. Os valores listados na coluna especificado nas propriedades adquiridas vai ser transmitido para o comando SELECT alvo, como parâmetros. Há um exemplo detalhado da tabela abaixo. selecionar Nota: Para lidar com chave composta, você pode especificar uma pluralidade de nomes de coluna por coluna = "{prop1 = col1, prop2 = col2}" sintaxe para passar isso para a consulta aninhada. Este prop1 causas e prop2 para definir o objeto de parâmetro para a consulta aninhada alvo.
fetchType opcional. Os valores válidos são preguiçosos e ansioso. Se usado, ele vai substituir a configuração parâmetro global lazyLoadingEnabled.

Exemplo:

<O resultMap ID = "blogResult" type = "blogue">
  <Associação Propriedade = coluna "autor" = "o author_id o" javaType = "o autor", selecione = "selectAuthor" />
</ O resultMap>

<SELECT ID = "selectBlog" O resultMap = "blogResult">
  SELECT * FROM BLOG WHERE ID = # { } acima mencionado id
</ o SELECT>

<Selecionar o acima mencionado ID = "selectAuthor" resultType = "Autor">
  SELECT * FROM AUTOR WHERE ID = # {acima mencionados id}
</ SELECT>

temos duas consultas: uma blog para carga, o outro para carga autor, e os resultados do mapeamento blogue descreve "selectAuthor" declaração deve ser usado para carregar sua propriedade autor.

Todas as outras propriedades serão carregados automaticamente assumindo sua nomes das colunas e propriedade jogo.

Esta abordagem é simples, mas de grandes conjuntos de dados ou listas não terá um bom desempenho. Este problema é conhecido do "N + um problema de consulta." De um modo geral, N + 1 seleciona problema é causado assim:

    Você executar uma única instrução SQL para recuperar uma lista (o "+1").
    Cada registro da troca, Você executar uma instrução SELECT para detalhes de carga para cada (isto é, "N").

Este problema vai levar a milhares de instruções SQL para serem executadas. Isso geralmente não é desejável.

MyBatis podem preguiçosos carga tais consultas um benefício, portanto, você podem consumir estas declarações para executar simultaneamente. No entanto, se você carregar uma lista e, em seguida, imediatamente iterate para acessar os dados aninhados, você vai invocar todas as cargas preguiçosos e, assim, o desempenho pode ser muito ruim.

Portanto, não há outra maneira.
Resultados associados com o aninhada
descrição atributo
resultMap ID Isso é resultado do mapeamento do mapeamento podem ser associadas para os resultados de uma fig adequado aninhada objeto. Este é método alternativo para chamar outra consulta. Isso permite que você se juntar várias tabelas em um único conjunto de resultados resultMap. Este conjunto de resultados pode conter conjuntos duplicados, duplicados das necessidades de dados decomposto para ser mapeadas adequadamente para um objeto aninhado na FIG. Para torná-lo mais fácil MyBatis permite "ligação" resultado mapas juntos, para lidar com os resultados aninhados. Um exemplo seria fácil de seguir, e um segue esta tabela é um exemplo.
Quando columnPrefix Ao conectar várias tabelas, você terá que usar um alias de coluna para evitar nomes de coluna duplicado ResultSet. Designado columnPrefix permite mapear o nome de resultados coluna para um foco externo. Veja os exemplos que se seguem.
Sob notNullColumn padrão, apenas os sub-objectos, em pelo menos uma coluna mapeada para a sua propriedade não está vazia, quando criado. Ao especificar uma coluna não-vazia nesta propriedade irá alterar o comportamento padrão quando você faz MyBatis o único não-vazia quando você cria um objeto filho nestas colunas. Pode especificar vários os nomes de coluna, separados por vírgulas. Padrão: não definido (desactivado).
Automapping Se for utilizado, quando o resultado do mapeamento da propriedade atual, MyBatis irá ativar ou desativar mapeamento automático. Esta propriedade substitui o comportamento global de mapeamento automático. Nota Não tem nenhum efeito fora do conjunto de resultados, por isso esta escolha ou atributo resultMap não tem sentido. Padrão: não definido (desactivado).

Você já viu um exemplo de associações aninhadas muito complexas. O seguinte é um exemplo simples para ilustrar como funciona. Em vez de executar um comunicado separado, os nossos conjuntos de blog e autor mesas juntos, como:

<Selecionar o acima indicado id = "selectBlog" resultMap = "blogResult">
  SELECT
    B.id AS blog_id,
    b.title AS BLOG_TITLE,
    B.author_id blog_author_id aS,
    A.id o author_id aS,
    A.Username aS author_username,
    A.password aS author_password,
    A.email aS author_email,
    A.bio aS author_bio
  do Registro Blog Autor a B Outer deixou ON B.author_id = A.id
  ONDE B mencionados acima id = # {} .id
| </ o SELECT>

Observe a juntar-se, bem como os cuidados tomados para garantir que todos os resultados são nome único e claro para renomear. Esse mapeamento marcas é muito simples. Agora podemos mapear os resultados:

<resultMap o acima mencionado id = "blogResult" do tipo = "Blog">
  <propriedade ID = coluna "id" = "blog_id" />
  <property = coluna de resultado "título" = "titulo_blog" />
  <associação imóvel = coluna "autor" = "blog_author_id" javaType = "Autor" resultMap = "authorResult" />
</ resultMap>

<resultMap id = type "authorResult" = "Autor">
  <id property = coluna "ID" = "author_id" />
  <resultado property = coluna "username" = "author_username" />
  <property resultado = coluna de "password" = "author_password" />
  <resultado property = "E-mail" coluna = "author_email" />
  <resultado property = coluna de "bio" ="author_bio "/>
</ resultMap>

Na exemplo acima, você pode ver a relevância do blog representa" authorResult "para carregar os resultados de exemplos.

Muito Importante: elementos id desempenham um papel muito importante no mapa resultado aninhado. Você sempre deve especificar um ou mais atributos podem identificar exclusivamente os resultados. Se você realmente não especificá-lo, então, MyBatis ainda funcionam, mas têm sérios problemas de desempenho. No caso que identifica exclusivamente os resultados, como poucas propriedades selecionadas. Uma chave primária é uma escolha óbvia (mesmo compósito chave primária).

Agora, o exemplo acima usou o elemento exterior para mapear o resultado de associações. Isso faz com que os mapas Autor resultado pode ser reutilizado. No entanto, se você não precisa de reutilizá-lo, ou se você simplesmente seus mapeamentos resultado do mapeamento o resultado para um único ligado descrito. Você pode ser mapeamentos resultado aninhadas. Aqui estão alguns exemplos do uso desta mesma forma:

<O resultMap ID = tipo "blogResult" = "Blog">
  <ID Property = coluna "ID" = "blog_id" />
  <Property Resultado = coluna "título" = "BLOG_TITLE" />
  <Associação propriedade = "autor" do javaType = "o autor">
    <ID da propriedade = coluna de "identificação" = "o author_id" />
    <Resultado propriedade = coluna de "username" = "author_username" />
    <Resultado propriedade = "password" coluna = "


  </ Association ou>
</ resultMap>

Se houver um blog co-autor fazer como? seleccionar declaração seria algo como isto:

<selecionar o acima mencionado id = "selectBlog" resultMap = "blogResult">
  selecionar
    B.id AS blog_id,
    b.title AS BLOG_TITLE,
    A.id AS author_id,
    A.Username AS author_username,
    A.password AS author_password,
    A.email AS author_email,
    A.bio AS author_bio,
    CA.id AS co_author_id,
    CA.username AS co_author_username,
    CA.password AS co_author_password,
    CA.email AS co_author_email,
    co_author_bio CA.bio AS
  partir Blog B
Como os nomes de coluna e nomes de coluna na diferente resultado resultMap. Você precisa especificar columnPrefix de reutilizar resultMap mapeamento co-autora de resultados. <ResultMap acima mencionados ID = "blogResult" do type = "Blog">   <Property acima mencionados ID = "acima mencionados id" coluna = "blog_id" />


















  <Resultado Propriedade = coluna "título" = "BLOG_TITLE" />
  <Associação Propriedade = "autor"
    A resultMap = "authorResult" />
  <Associação Propriedade = "co-autor"
    A resultMap = "authorResult"
    columnPrefix = "CO_" />
</ O resultMap >

você viu acima como lidar com o associado "existe um" tipo. Mas "há muitas" O quê? A secção seguinte é discutir esse assunto.
Set

<= Property Collection "Mensagens" OfType = "domain.blog.Post">
  <Property ID = coluna "ID" = "a post_id" />
  <Resultado Propriedade = coluna "Assunto" = "post_subject" />
  <= Resultado Propriedade "corpo" = coluna "post_body" />
</ Colecção>

Ação e o elemento coleção associada são quase idênticas. De fato, eles são muito parecidos, documente as semelhanças seria redundante. Portanto, estamos mais focada em suas diferenças.

Vamos continuar o exemplo acima, apenas um autor de um blog. Mas há muitos artigos do blog. class blog, quais podem ser representada por algo como a seguinte:

Lista Privado <Post> Mensagens;

Para mapear um conjunto de resultados aninhados a uma lista, usamos o elemento coleção. Tal como o elemento de associação, podemos usar consultas aninhadas a partir da conexão, ou resultados aninhados.
Uma coleção de consulta aninhada

Primeiro, Vamos olhar usando um SELECT aninhada para carregar as mensagens do blog.

<ResultMap o acima mencionado id = "blogResult" o type = "blogue">
  <Property Collection = "Mensagens" do javaType = "ArrayList" coluna = "acima mencionados id" OfType = "Post" o SELECT = "selectPostsForBlog" />
</ resultMap>

<Selecionar o acima indicado id = "selectBlog" o resultMap = "blogResult">
  a SELECT * FROM BLOG WHERE ID = # {ID}
</ SELECT>

<SELECT ID = "selectPostsForBlog" o resultType = "Post">
  a SELECT * FROM o POST o ONDE blog_id = # {ID}
</ selecione>

aqui você deve prestar atenção a várias coisas, mas na maior parte do código acima e elementos associados são muito semelhantes. Em primeiro lugar, Devemos pagar a atenção está a utilizar o elemento colecção. Em seguida, a nota que o novo atributo "OfType". Esta propriedade é usada para distinguir JavaBean (e de campo) e o tipo do tipo de atributo é incluído na coleção é importante. Assim, você pode ler o seguinte mapeamento como este:

<Coleção property = "posts" javaType = coluna "ArrayList" = "id" OfType = "Post" select = "selectPostsForBlog" />

leia-se: "Post Tipo de coleção de um ArrayList de mensagens"

o atributo javaType não é necessária porque em muitos casos MyBatis vai funcionar para você. Então você pode encurtar o texto:

<Property Collection = coluna "Mensagens" = "acima mencionados id" = OfType "Post" = o SELECT "selectPostsForBlog" />
 

Publicou 966 artigos originais · ganhou elogios 11 · vê 30000 +

Acho que você gosta

Origin blog.csdn.net/xiaoyaGrace/article/details/105270742
Recomendado
Clasificación