Ao aprender hibernado, o editor foi exposto a vários mapeamentos. Como funciona o mapeamento em mybatis? Nesta postagem do blog hoje, o editor apresentará principalmente brevemente o mapeamento avançado em Mybatis, incluindo um para um, um para muitos e muitos para muitos. Espero que mais e mais amigos necessitados sejam úteis. O editor apresenta principalmente o modelo de dados do produto Order, a consulta individual, a consulta individual e a consulta muitos para muitos.
1. Modelo de dados do produto Encomendar
1. O script de execução do banco de dados é o seguinte:
<span style = "font-family: Comic Sans ms; font-size: 18px;"> Crie itens de tabela (id não nulo Auto_increme, itensName varchar (32) não nulo Comentário 'Nome do produto', pic float (10,1) não nulo 'Comentário' Produto 'Preço', Comentário do texto 'Produto' PRODUTO ', Varchar (64) data ', chave primária (id)) charset = utf8; / *Estrutura da tabela para a tabela `orderDetail` */ Crie a tabela OrderDetail (ID int não nulo Auto_increme, ordens_id int não nulo Comentário 'ID do pedido', itens_id int não nulo 'ID do produto', itens_num int padrão comentário nulo 'Quantidade do produto', chave primária (id), chave ''), itens itens, itens), itens itens, itens, itens` `` `` `` ”'', afirmou. `Fk_orderdetail_2` (` itens_id`), restrição `fk_orderdetail_1` key estranho (` orders_id`) referências `ordens` (` id`) em exclusão sem ação na atualização sem ação, restrição `fk_orderdetail_2`` `` `` `` `` `` ”' Charset = utf8; / *Estrutura da tabela para tabela `ordens` */ crie pedidos de tabela (id não nulo automo_increntle, user_id int não nulo comentário 'ID do pedido', número varchar (30) não nulo comentário 'número' número ', nulo com comentário de dados (` `` `` `` `”' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'aproin' '' '' '' ', Restrição `fk_orders_id` Foreign Key (` user_id`) Referências `t_user` (` id`) em excluir nenhuma ação na atualização sem ação) padrão charset = utf8; / *Estrutura da tabela para a tabela `t_user` */ crie a tabela t_user (id não nulo auto_increme, nome de usuário varchar (32) não comentar nulo 'nome de usuário', data de aniversário padrão nulo comentário 'aniversário', com comentário de sexo (1) kninike null 'gênero', endereço de` `` `` `` `” '', </span>
Teste de código de dados
<span style = "Fonte-família: Comic Sans MS; font-size: 18px;">/ *Dados para a tabela `itens` */ inserir em itens (itensName, preço, detalhe, pic, CreateTime) valores ('Desktop', 3000.0, 'este computador é de ótima qualidade! ('Notebook', 6000.0, 'Notebook', bom desempenho, boa qualidade! / *Dados para a tabela `orderDetail` */ inserir em` orderDetail` (`orders_id`,` itens_id`, `itens_num`) valores (1,1,1), (1,2,3), (2,3,4), (3,2,3); / *Dados para a tabela `ordens` */ inserir em` ordens` (`user_id`,` número`, `CreateTime`,` nota`) valores (1, '1000010', '2015-06-04 13: 22: 35', null), (1, '1000011', '2015-07-08 13: 35', NULL), (1, '1000011', '2015-07-08 13: (2, '1000012', '2015-07-17 14: 13: 23', NULL), (3, '1000012', '2015-07-16 18: 13: 23', NULL), (4, '1000012', '2015-07-15 19: 13: 23', NULL), (5, '10000', '2015-07-15 19: 13: 23', NULL), (5, '10000', (6, '1000012', '2015-07-13 16: 13: 23', nulo); /*Data for the table `user` */ INSERT INTO `t_user`(`username`,`birthday`,`sex`,`address`) VALUES ('Wang Wu',NULL,'2',NULL), ('Zhang San','2014-07-10','1','Beijing'), ('Zhang Xiaoming',NULL,'1','Zhengzhou, Henan'), ('Chen Xiaoming',NULL,'1','Zhengzhou, Henan'), ('Zhang Sanfeng',NULL,'1','Zhengzhou, Henan'), ('Zhang Sanfeng',NULL,'1','Zhengzhou, Henan'), ('Chen Xiaoming',NULL,'1','Zhengzhou, Henan'), ('Wang Wu',NULL,NULL,NULL), ('Xiao A','2015-06-27','2','Beijing'), ('Xiao B','2015-06-27','2','Beijing'), ('Xiao C ',' 2015-06-27 ',' 1 ',' Pequim '), (' Xiao D ',' 2015-06-27 ',' 2 ',' Beijing '); </span>2. Idéias de análise de modelo de dados
(1). Conteúdo de dados registrado em cada tabela: familiarize -se com o conteúdo registrado em cada tabela em módulos, o que é equivalente ao processo de requisitos do sistema de aprendizagem (funções);
(2). Configurações importantes de campo para cada tabela: campos não vazios, campos de chave estrangeira;
(3). A relação entre tabelas e tabelas no nível do banco de dados: relacionamento de chave estrangeira;
(4). Relacionamento comercial entre tabelas: Ao analisar o relacionamento comercial entre tabelas, deve se basear em um certo significado de negócios para analisar.
3. Análise de idéias de banco de dados para modelos de produtos para pedidos, conforme mostrado na figura abaixo:
2. Consulta individual
2.1. Requisitos: Informações sobre pedidos de consulta e informações associadas ao usuário
2.2. ResultyType Implementation
2.2.1 Declaração SQL
Determine a tabela principal da consulta: a tabela de pedidos, determine a tabela de associação da consulta, a tabela de usuários, o código é o seguinte:
<span style = "font-family: Comic Sans MS; font-size: 18px;"> selecione T1.
2.2.2 Crie uma entidade de entidade
A entidade do usuário user.java, o código é o seguinte:
<span style = "font-family: Comic Sans ms; font-size: 18px;"> pacote com.mybatis.entity; importar java.util.date; importar java.util.list; / ** * @className: Usuário * @Description: TODO (entidade do usuário) * @Author Ahvari */ Public Class User {ID do número inteiro privado; // Nome do nome de string privado; // sexo de cordas privadas de gênero; // endereço de endereço de sequência privada; // Aniversário Private Date Birthday; // Lista privada de OrdersList criada pelo usuário // getter e setter ......} </span>Ordem Ordens de Entidade. Java
<span style = "font-family: Comic Sans ms; font-size: 18px;"> pacote com.mybatis.entity; importar java.util.date; importar java.util.list; / *** @ClassName: Ordens* @Description: TODO (Entidade do pedido)* @Author Ahvari*/ Public Class Ordens {/ ** ID da ordem -chave primária*/ ID inteiro privado; / ** Pedido ID do usuário*/ UserID Inteiro privado; / ** Número do pedido*/ número da string privada; / ** Hora do pedido*/ data privada createTime; / ** Nota*/ nota de sequência privada; // Informações do usuário Usuário privado do usuário; // Detalhes do pedido Lista privada <DermDetail> OrderDetails; // getter e setter ......} </span>Entidade do produto: item.java
<span style = "font-family: Comic Sans ms; font-size: 18px;"> pacote com.mybatis.entity; importar java.util.date; / *** @className: itens* @Description: TODO (classe de entidade do produto)* @Author Ding Guohua*/ Itens da classe pública {/ ** Tabela de produtos ID da chave primária*/ ID inteiro privado; / ** Nome do produto*/ itens de sequência privada itens Nome; / ** Preço do produto*/ preço de flutuação privada; / ** Descrição do produto*/ Detalhes da string privada; / ** Imagem do produto*/ imagem de sequência privada; / ** Data de produção*/ data privada createTime; // getter e setter ......} </span>Encomendar detalhe entity orderdetail.java
<span style = "font-family: Comic Sans ms; font-size: 18px;"> pacote com.mybatis.entity; / *** @ClassName: OrderDetail* @Description: TODO (Entidade de detalhes do pedido)* @Author Ding Guohua*/ public class OrderDetail {/ **, principal, ID da lista de detalhes*/ ID inteiro privado; / ** ID*/ Inteiro Privado OrdersId; / ** ID do produto*/ itens inteiros privadosIDID; / ** Quantidade de compra do produto*/ itens inteiros privados Num; // Informações do produto correspondentes aos detalhes de itens privados de itens; // getter e setter ......} </span>Crie uma classe de wrapper para mapear todas as informações de consulta para esta classe ordenscustom.java
<span style = "font-family: Comic Sans ms; font-size: 18px;">/ ** * @className: ordenscustom * @Description: TODO (a classe prolongada de pedidos, que mapea ordens e consultas de usuários através desta classe para permitir essa classe para herdar mais entidades) * @author: dinghuhu-dinghuhu (dinge dinge através desta classe para permitir essa classe para herdar mais entidades) * @author: dinghuhu. atributos nome de string privado nome de usuário; sexo privado de cordas; endereço de string privado; // getter e setter ......} </span>
2.2.3 Criar Ordensccustompapper.java, o código é o seguinte:
<span style = "font-family: Comic Sans ms; font-size: 18px;"> pacote com.mybatis.mapper; importar java.util.list; importação com.mybatis.entity.orderscustom; / *** @ClassName: OrdersMapperCustom* @Description: TODO (OrderMapperCustom Mapper)* @Author Ding Guohua*/ Public Interface OrdersCustompper {/ ** Ordens de consulta Associar Informações do usuário*/ Public List <Orderscustom> FindersUser (); } </span>2.2.4 Criando OrdersCustompapper.xml é o mesmo que o nome da interface correspondente. Ao carregar o arquivo de configuração através da interface do mapeador, o código é o seguinte:
<span style = "font-family: Comic Sans ms; font-size: 18px;"> <? xml versão = "1.0" coding = "utf-8"?> <! "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-namespace namespace, a função é classificar o gerenciamento do SQL, que é entendido como o SQL Isolation Note: Using Mapper Agent Development, o nome do nome da names é igual ao nome do nome do nome, o nome do nome do nome do nome do nome do nome do nome do nome do nome do nome do names é o nome do namespper. namespace = "com.mybatis.mapper.orderscustompapper"> <!-Consulta Ordens, associar informações do usuário de consulta-> <select id = "findordersuser" resultype = "com.mybatis.entity.orderscustom"> selecione t1. t1.User_Id = T2.id </leclect> </mapper> </span>
2.3 Implementação do ResultMap
2.3.1 Declaração SQL igual à acima
2.3.2 Idéias de mapeamento de mapa resultante:
Use o ResultMap para mapear as informações do pedido no resultado da consulta ao objeto Ordens, adicione o atributo do usuário na classe Orders e mapeie as informações do usuário da consulta associada ao atributo do usuário no objeto Ordens (ele foi adicionado na entidade Ordens acima).
2.3.3 OrdersCustompapper.xml
1. Definir ResultMap, o código é o seguinte:
<span style = "font-family: Comic Sans ms; font-size: 18px;"> <!-Defina o mapa resultante do usuário associado à ordem de consulta, mapeie todo o resultado da consulta para com.mybatis.entity.orders-> <esterMap type = "com.mybatis.entity.ERDERS" IDERSERSERSERSERSERSERSURRAPERSURRAPERSURRAPERSUNTRAGERSURANTES = ID: o identificador exclusivo na coluna de consulta, o identificador exclusivo nas informações do pedido. Se várias colunas formarem um identificador exclusivo (como: a tabela de dicionário no design de banco de dados geral usa uma chave primária junta), vários IDs precisam ser configurados na coluna: coluna de identificação exclusiva para a propriedade de informações: a chave de atributo mapeada para a ordem de ordem é ordenada com a ordem de identificação, e a chave de ordem é o nome da ordem dos database é ordenados. Column = "Orders_id" Property = "OrdersId"/>, semelhante à configuração do arquivo de mapeamento de entidades Hibernate). -> <id column = "id" property = "id"/> <resultado column = "user_id" propriedade = "userId"/> <resultado colun = "number" propriedade = "número"/> <resultado column = "createTime" propriedades = "createTime"/> <resultado column = "note"/"/> <resultado column =" mans "/> Informações associadas ao usuário-> <!-Associação: Informações usadas para mapear a consulta associada Propriedade de objeto único: para mapear as informações do usuário da consulta associada a qual propriedade em ordens-> <Association Property = "User" javatype = "com.mybatis.entity.User Main the Tonestifs the UsueSties: o que é o usuário do usuário do usuário: Especificar a coluna que a coluna usely the Coluna the CloNey the CloNe the CloNe thatsicely thatestified: o que é o que é o que é o que é o que é o que é o que é o que é o que você está. column = "user_id" propriedade = "id"/> <resultado colun = "userName" propriedade = "nome de usuário"/> <resultado colun = "sexo" property = "sex"/> <resultado column = "endereço" property = "endereço"/> </association> </resultado> </span>
2. Definição da declaração, o código é o seguinte:
<span style = "font-family: Comic Sans MS; Font-Size: 18px;"> <!-Ordens de consulta, associar informações do usuário da consulta, use resultmap para implementar-> <select id = "findordersuserResultmap" resultMap = "OrdersUserrMultMap"> selecione T1. t1.User_Id = T2.id </leclect> </span>
3. Adicione o seguinte método à interface OrderCustompapper.java:
<span style = "font-family: Comic Sans MS; font-size: 18px;">/ ** Consulta de consulta de consulta Informações do usuário, use ReslutMap para implementar*/ public list <orders> findordersuserResultmap (); </span>
4. O teste JUNIT da implementação do ResultType e ResultMap, o código é o seguinte:
<span style = "font-family: Comic Sans ms; font-size: 18px;"> pacote com.mybatis.test; importar java.io.inputStream; importar java.util.list; importar org.apache.ibatis.io.resources; importar org.apache.ibatis.session.sqlSessionFactory; importar org.apache.ibatis.session.sqlSessionFactoryBuilder; importar org.junit.be antes; importar org.junit.test; importação com.mybatis.entity.orders; importação com.mybatis.entity.orderscustom; importar com.mybatis.mapper.orderscustompapper; classe pública OrdersCustompAptest {private SQLSessionFactory SQLSessionFactory; // Este método é executar @Before public void Setup () lança Exceção {String Resource = "SQLMapConfig.xml"; InputStream inputStream = Resources.GetResourCeasStream (Resource); // crie sqlSessionFcatory sqlSessionFactory = new SQLSessionFactoryBuilder (). Build (inputStream); } // Consulta o pedido, associe as informações do usuário da consulta e use o resultado resultante para implementar o teste @test public void testFindordersUser () {sqlSession sqlSession = sqlSessionFactory.opensssion (); // Crie o objeto proxy OrdersCustompapper OC = SQLSession.GetMapper (OrdersCustompapper.class); // Lista de métodos de mapeador de chamada <OrdersCustom> List = OC.FindordersUser (); System.out.println (list); sqlSession.Close (); } // Consulte o pedido, associe as informações do usuário da consulta e os testes implementados usando o resultMap @test public void testFindordersuserResultmap () {sqlSession sqlSession = sqlSessionFactory.opensssion (); // crie proxy objeto ordenscustompapper oc = sqlsession.getmapper (orderscustompapper.class); // Lista de métodos do mapeador de chamada <Ordens> list = OC.FindordersuserResultMap (); System.out.println (list); sqlSession.Close (); }} </span>5. Resultype e ResultMap Implemente o resumo de consulta individual
Implementar uma consulta individual:
A.ResultType: é relativamente simples de implementar usando o resultado resultante. Se o nome da coluna de consulta não estiver incluído no Pojo, você precisará adicionar os atributos correspondentes do nome da coluna para concluir o mapeamento.
b. Se não houver requisitos especiais para resultados de consultas, é recomendável usar o ResultType.
C.ResultMap: O resultado do resultado precisa ser definido separadamente, o que é um pouco problemático. Se houver requisitos especiais para os resultados da consulta, o uso do ResultMap poderá preencher os atributos do Pojo de mapeamento de consulta associado.
D.ResultMap pode implementar carregamento preguiçoso, o resultado não pode implementar o carregamento preguiçoso.
3. Consulta individual
3.1 Requisitos: pedidos de consulta (usuários associados) e detalhes do pedido;
3.2 Adicione a lista da lista <OrderDetail> OrderDetails na classe Ordens.java (a entidade acima foi adicionada). Finalmente, as informações do pedido serão mapeadas para os pedidos, e os detalhes do pedido correspondentes ao pedido são mapeados na propriedade OrderDetails em pedidos.
3.3 Adicione o seguinte no OrdersCustompapper.xml
<span style = "font-family: Comic Sans MS; font-size: 18px;"> <!-Consulta de consulta de consulta Usuário e detalhe do pedido-> <select id = "findordersArderDetailResultMap" resultMap = "OrderArderDetailResultMap"> selecione T1. T3.Items_Id, T3.Items_Num, T3.orDers_id de Ordens T1, T_USER T2, OrderDetail T3 Onde T1.User_Id = T2.Id e T3.orders_id = T1.id </leclect> </span>
A definição de resultado também é adicionada ao ordenscustompapper.xml
<span style = "font-family: Comic Sans ms; font-size: 18px;"> <!-ResultMap para consultar ordens (usuários associados) e detalhes do pedido-> <resultMap type = "com.mybatis.entity.orders" id = "OrdersOrderDetailResultMultMaP"). Uso estende a herança, não configure o mapeamento das informações do pedido e das informações do usuário-> <!-Informações sobre detalhes da ordem associada Uma consulta de associação de pedidos tem vários detalhes do pedido. Você precisa usar a coleção de mapeamento de coleções: mapear vários registros consultados na propriedade Association para a propriedade Coleção de OfType: especifique o tipo de pojo na propriedade de coleção mapeada-> <coletor property = "orderDetails" ofttype = "com.mybatis.entity.orderdEtail"> <! com.mybatis.entity.orderDetail -> <id column = "OrderDetail_Id" Property = "Id"/> <Result Column = "Itens_Id" Property = "Itensid"/> <resultado column = "itens_num" Property = "Itensnum"/> Result = "Orders_id" ("ORDERSID" "/"> itens "/> Result =" Orders_id "(" ORDERSID "/"3.4 Adicione um método à classe de interface OrderCustomemapper.java, o código é o seguinte:
<span style = "font-family: Comic Sans ms; font-size: 18px;">/ ** Ordem de consulta (usuários associados) e detalhes do pedido*/ list public <DormarDetail> FindorderSandOrderDetailResultMap (); </span>
3.5 Adicione métodos de teste à classe de teste Junit, o código é o seguinte:
<span style = "Fonte-família: Comic Sans MS; font-size: 18px;"> // teste para ordens de consulta (usuários associados) e detalhes de pedido @test public void testFindordersArderDetailResultmap () {sqlSession sqlSession = sqlSessionFactory. // crie proxy objeto ordenscustompapper oc = sqlsession.getmapper (orderscustompapper.class); // Lista de métodos de mapeador de chamada <OrderDetail> List = OC.FindordersArDorderDetailResultMap (); System.out.println (list); sqlSession.Close (); } </span>3.6 Resumo
O Mybatis usa a coleção do ResultMap para mapear vários registros da consulta associada em uma propriedade de coleção de listas. Implementação usando os detalhes da ordem do resultado do resultado nos pedidos de encomendas em pedidos, que precisam ser processados por si mesmo, use travessias de loop duplo, remover registros duplicados e coloque detalhes do pedido em encomendas.
4. Muitas para muitas consultas
4.1 Requisitos: Consulte o usuário e as informações do produto adquiridas pelo usuário
4.2 Idéias de mapeamento
Mapear as informações do usuário no usuário, adicione a lista de atributos da lista de pedidos <Orders> OrdersList na classe de usuário para mapear a lista de pedidos; Adicione a lista de atributos da lista de detalhes do pedido <OrderDetail> OrderDetials em pedidos, mapeie os detalhes do pedido para o OrderDetials; Adicione o atributo de itens em OrderDetail para mapear os itens correspondentes aos detalhes do pedido ao item.
4.3 OrdersCustompapper.xml adiciona o seguinte código:
<span style = "font-family: Comic Sans ms; font-size: 18px;"> <!-ResultMap para consultar as informações do produto adquiridas pelo usuário-> <resultado propriedades = "nome de usuário"/> <resultado colun = "sexo" propriedade = "sexo"/> <resultado column = "endereço" propriedade = "endereço"/> <!-solicitar informações que um usuário corresponde a vários pedidos, usando mapeamento de coleção-> <coleção de propriedade = "orderslist" oftype = "com.mybatis.entity.orders"> <idslist " Property = "UserId"/> <resultado colun = "number" Property = "número"/> <resultado column = "CreateTime" Property = "CreateTime"/> <Result Column = "Note" Property = "Note"/> <Result Column = "Note"/> <Result Column = "Note" = "Note"/> <!-One One Detalhe OFTYPE = "COM.MYBATIS.ENTITY.OrderDetail"> <id column = "OrderDetail_id" Property = "Id"/> <Result Column = "Itens_id" Property = "Itensid"/> <Result Column = "itens_num" Property = "Itens"/> <Result Column = "Order_id" ") Property = "ItensName"/> <Result Column = "ItensName"/> <Result Column = "ItensName"/> <Result Column = "Itens" javatype = "com.mybatis.entity.items"> <id column = "itens_id" Property = "ID"/Result Column = "Itens_Name" property="itemsName"/> <result column="items_detail" property="detail"/> <result column="items_price" property="price"/> </association> </collection> </collection> </resultMap> <!-- To query the product information purchased by users and users, use resulaMap--> <select id="findUserAndItemsResultMap" ResultMap = "UserAndItemSResultMap"> Selecione T1. OrderDetail T3, itens T4 onde T1.User_Id = T2.ID e T3.orders_id = T1.id e T3.Items_id = T4.id </leclect> </span>
4.4 Adicione o seguinte método em OrderCustompapper.java:
<span style = "font-family: Comic Sans ms; font-size: 18px;"> / ** Consulte as informações do produto adquiridas por usuários e usuários* / list public <suser> findUserAnditemsResultMap (); </span>
4.5 Adicionar métodos de teste ao teste Junit, o código é o seguinte:
<span style = "font-family: Comic Sans MS; font-size: 18px;"> // Consulte as informações dos produtos comprados pelo usuário e pelo usuário @test public void testFindUserAnditemsResultmap () {sqlSession sqlSession = sqlSessionFactory. // Crie um objeto proxy ordenscustompapper oc = sqlsession.getmapper (orderscustompapper.class); // Lista de métodos de mapeador de chamada <suser> list = OC.FindUserAnditemSResultMap (); System.out.println (list); sqlSession.Close (); } </span> 4.6 Resumo Resumo
ResultType:
Função: Mapeie os resultados da consulta em POJO De acordo com o nome da coluna SQL POJO Nome do atributo Consistência.
Ocasionalmente: Exibição comum de registros detalhados, como quando os usuários compram detalhes do produto e exibem todas as informações de consulta associadas na página, você pode usar diretamente o ResultType para mapear cada registro em um Pojo e atravessar a lista (Pojo na lista) na página front-end.
ResultMap:
Uso: Associação e Coleção para concluir o mapeamento avançado individual e um para muitos (existem requisitos de mapeamento especiais para os resultados).
associação:
Função: mapeie as informações de consulta associadas em um objeto Pojo.
Ocasião: Para facilitar as informações associadas à consulta, você pode usar a associação para mapear as informações da ordem associada aos atributos POJO de objetos de usuário, como: Consultando pedidos e informações associadas ao usuário.
O uso do resultado do resultado não pode mapear os resultados da consulta para o atributo pojo do objeto Pojo. Escolha se deve usar o resultado resultante ou o resultado de acordo com as necessidades de atravessar a consulta do conjunto de resultados.
Coleção:
Função: mapeie as informações de consulta associadas em uma coleção de listas.
Ocasião: Para facilitar as informações da Associação Traversal de consulta, você pode usar a coleção para mapear as informações da associação para a coleção de listas. Por exemplo: Consultando o módulo de escopo de permissão do usuário e o menu no módulo, você pode usar a coleção para mapear a lista de módulos para mapear os atributos da lista de menus do objeto do módulo. O objetivo disso é facilitar o Traversal consulta o conjunto de resultados da consulta.
Se você usar o ResultType, não poderá mapear os resultados da consulta para a coleção de listas.
O exposto acima é o mapeamento avançado em Mybatis apresentado a você pelo editor. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!