Este artigo é o conhecimento sobre a classe de entidade e os problemas de mapeamento de tabela em Mybatis trazidos a você pelo editor. Aprender este tutorial pode nos ajudar a resolver o problema de conflito de diferentes nomes de campos e nomes de atributos de classe de entidade. Amigos que precisam, vamos dar uma olhada!
1. Prepare as tabelas e dados a serem usados para demonstração
Criar ordens da tabela (order_id int primário Auto_increntle, order_no varchar (20), ordem do Order_price); inserir em pedidos (order_no, order_price) valores ('aaaa', 23); insert em ordens (order_no, order_price) ('bbbb', 33); 22);2. Definir classes de entidade
pacote me.gacl.Domain;/*** @author gacl*define a classe de entidade correspondente à tabela de pedidos*/public class Ordem {/*** Crie pedidos de tabela (order_id int primário Auto_increment, Order_no varchar (20), ordem do campo e o nome da ordem da ordem; // id ===> order_idprivate string orderno; // orderno ===> order_noprivate Float Preço; // preço ===> order_pricePublic int getId () {return id;} public void setId (int id) {this.id = id;} public string getDorderNo () {return orderno;} public SetorderNo (string Orderno) {this.Orderno =};} Void SetPrice GETPRICE () {this.price = price;}@Substringpublic string tostring () {return3. Escreva o código de teste
3.1. Escreva um arquivo de mapeamento SQL XML
1. Crie um arquivo OrderMapper.xml. O conteúdo do ordermapper.xml é o seguinte:
<? xml versão = "1.0" coding = "utf-8"?> <! O valor do espaço para nome é convencionalmente definido como o nome do pacote + nome do arquivo de mapeamento SQL, para que o valor do espaço para nome possa ser garantido
Por exemplo, namespace = "me.gacl.mapping.ordermapper" é me.gacl.mapping (nome do pacote) + ordermapper (arquivo ordermapper.xml para remover o sufixo)
-> <Mapper Namespace = "me.gacl.mapping.ordermapper"> <!-Obtenha um objeto de pedido com base na consulta de ID. Usar esta consulta não pode consultar o resultado que queremos. Isso ocorre principalmente porque o nome do atributo da classe de entidade não corresponde ao nome do campo do banco de dados; portanto, o registro correspondente não pode ser consultado-> <select ID = "getOrderById" ParameterType = "int" ResultType = "me.gacl.domain.order"> selecione * Ordes Wherend um Ordem_Id =#{id.d} Usando esta consulta, normalmente podemos consultar o resultado que queremos. Isso ocorre porque daremos à consulta um alias com o mesmo alias que o nome do atributo da classe da entidade, para que o nome do atributo da classe de entidade e o nome do campo no resultado da consulta possam corresponder um por um-> <select id = "selettorder" PARMETRYPE = "int" resulttype = "me.gacl.doman.omer"> selectTy_id ID = " order_id =#{id} </select> <!- Obtenha um objeto de pedido com base na consulta ID. Usando esta consulta, podemos consultar o resultado que queremos normalmente. Isso ocorre porque mapeamos a correspondência individual entre o nome do atributo da classe da entidade e o nome de campo da tabela <IltMap> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- colun = "order_id"/> <!-use o atributo de resultado para mapear os campos de chave não primários-> <resultado de propriedade = "orderno" column = "order_no"/> <resulte Property = "Price" Column = "Order_Price"/> <Result Property = "Price" Column = "2. Registre o arquivo de mapeamento OrderMapper.xml no arquivo conf.xml
<Mappers> <!- Registre o arquivo ordermapper.xml. O OrderMapper.xml está localizado no pacote me.gacl.mapping, portanto o recurso é escrito como eu/gacl/mapping/ordermapper.xml-> <mapper Resource = "me/gacl/maping/ordermapper.xml"/> </mappers>
3.2. Escreva o código de teste da unidade
pacote me.gacl.test; importar me.gacl.domain.order; importar me.gacl.util.mybatisutil; importar org.apache.ibatis.session.sqlsession; importação org.junit.test; public class; Mybatisutil.getSqlSession ();/*** A sequência de identificação para mapear o SQL,* me.gacl.mapping.ordermapper é o valor do atributo namespace da tag de mapeador na tag Ordermapper.xml,* getorderById é o valor do atributo de identificação da tag Select. Através do valor de atributo ID da tag Selecionar, você pode encontrar o SQL a ser executado*/String declaration = "me.gacl.mapping.ordermapper.getorderbyid"; // mapeando o SQL Identification string // Execute a operação de consulta e encapsula automaticamente o resultado da consulta em um objeto de ordem e retorna a ordem = sqlSession.Session. Tabela // Após o uso do SQLSession Execute SQL, você precisa fechar o SQLSessionsqlSession.Close (); System.out.println (ordem); // Resultado de impressão: nulo, isto é, nenhum registro correspondente foi encontrado} @TestPublic void testGetGerorMerById2 () {sqlSession sqlsession = mybatisutil.getSqlSession ();/*** MapAPration of the SayspAppM.Gacl.MagingM.GenMapMingMapperMapperMapperMapperMapPerpAptM.GaPl.Gacl.GenMapMap OrderMapper.xml File, * Selectorder é o valor do atributo de identificação da tag Selecionar. Through the id attribute value of the select tag, you can find the SQL to be executed by using the id attribute value of the select tag*/String statement = "me.gacl.mapping.orderMapper.selectOrder";//Mapping the sql identity string//Execute the query operation and automatically encapsulate the query result into an Order object and return the Order order = sqlSession.selectOne(statement,1);//Query the Registre com ID 1 na tabela de pedidos // Depois de executar o SQL usando o SQLSession, você precisa fechar o SQLSessionsqlSession.Close (); System.out.println (ordem); // Resultado de impressão: order [id = 1, orderno = aaaa, preço = 23.0]}@testpublic void testGetorderById3 () {sqlSession sqlSession = mybatisutil.getSqSession ();/*** map sqlSession string string,* mybatisutil.getSession (); Da tag de mapeador no arquivo OrderMapper.xml, * SelectorderResultMap é o valor do atributo de identificação da tag Selecionar. Por meio do valor do atributo de ID da tag Selecionar, o SQL a ser executado pode ser encontrado*/String declaration = "me.gacl.mapping.ordermapper.SelectorDerResultmap"; // mapeando o SQL Identity String // Executa a operação de consulta e encapsulou automaticamente o resultado da consulta em uma ordem e retirada; Pedidos Tabela // Após o uso do SQLSession para executar o SQL, você precisa fechar o SQLSessionsqlSession.Close (); System.out.println (ordem); // Resultado de impressão: ordem [id = 1, orderno = aaaa, preço = 23.0]}}Resultados da execução de testes de unidade:
1. O método TestGetorderById retorna um nulo após a execução da consulta.
2. Após o método TestGetorderByID2 e o método TestGetorderByID3 executam a consulta, você pode obter o resultado desejado normalmente.
4. Resumo
O código de teste acima demonstra o problema de que, quando o nome do atributo na classe da entidade e o nome do campo na tabela são inconsistentes, os resultados correspondentes não podem ser consultados ao usar o Mybatis para operações de consulta, e dois métodos são adotados para o problema:
Solução 1: Defina o alias do nome do campo na instrução SQL de consulta, para que o alias do nome do campo seja consistente com o nome do atributo da classe de entidade, para que o nome do campo da tabela possa corresponder um por um ao nome do atributo da classe da entidade. Este método resolve a relação de mapeamento entre o nome do campo e o nome do atributo, definindo alias na instrução SQL.
Solução 2: Mapeie a correspondência individual entre nomes de campos e nomes de atributos de classe de entidade pelo mapeamento. Este método usa a solução fornecida pela Mybatis para resolver a relação de mapeamento entre nomes de campo e nomes de atributos.