No desenvolvimento do projeto, geralmente encontramos situações em que os nomes de campo na tabela e os nomes de atributos das classes de entidade correspondentes da tabela podem não ser exatamente os mesmos. O editor a seguir demonstrará como resolver o problema de conflito de diferentes nomes de campo e classes de entidades nesse caso. Amigos interessados aprenderão juntos.
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*Defina 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 (), ordem_price float); o nome da ordem de 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 () {return 3. 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 = "." Encoding = "utf-"?> <! O valor do espaço para nome está convencionalmente definido como o nome do pacote + o nome do arquivo do mapa SQL, para que o valor do espaço para nome possa ser garantido para ser exclusivo. Por exemplo, Namespace = "me.gacl.mapping.ordermapper" é me.gacl.mapping (nome do pacote) + OrderMapper (sufixo de remoção de arquivos OrderMapper.xml)-> <Mapper namespace = "me.gacl.mapping.ordermapper"> <!-!-
Um objeto de ordem é obtido 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 * de ordens onde order_id =#{id} </select> <!- Um objeto de ordem é obtido com base na consulta de ID. Usando esta consulta, normalmente podemos consultar o resultado que queremos.
Isso ocorre porque daremos o alias de consulta com o mesmo nome de atributo que o nome do atributo de 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 a um.
-> <select id = "Selectorder" parameterType = "int" resulttype = "me.gacl.domain.order"> selecione order_id id, order_no orderno, order_price preço de ordens onde order_id =#{id} </leclect> <!-!- De acordo com a consulta de ID, podemos obter um objeto de pedido. 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 através de <sultmap>->
<select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap">select * from orders where order_id=#{id}</select><!--Mapping the correspondence between the entity class attribute name and the table's field name through <resultMap>--Mapping the correspondence between the entity class attribute name and the table's field name through <resultMap>--Mapping the primary Campo da chave usando a propriedade ID-> <id de propriedade = "id" column = "order_id"/> <!-mapeando o campo de chave não primária usando a propriedade Result-> <Result Property = "OrderNo" Column = "Order_no"/> <Result Property = "Price" Column = "Order_price"/> </ResultMap> <//" 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; importe me.gacl.util.mybatisutil; importar org.apache.ibatis.session.sqlSession; importação org.junit.test; public class Test {@testpublic void testGetoportEdridIdId () {sqlsel; 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 Identity String // Executar a operação de consulta e encapsular automaticamente o resultado da consulta em um objeto de ordem e retornar a ordem = sqlSession.serlectOne.set.setnectone (a ordem da consulta; Executando o SQL usando o SQLSession, você precisa fechar o sqlSessionsqlSession.Close (); System.out.println (ordem); // Resultado de impressão: nulo, isto é, nenhum registro correspondente é encontrado} @testpublic void testGetGeRonderById () {sqlSession sqlSession = mybatisutil.getsqlSession ();/*** Map Sql Identification of the SayspApport.GetMapMapM.GETSQLSession (); OrderMapper.xml File, * Selectorder é o valor do atributo de identificação da tag Selecionar. Através do valor do atributo de ID da tag Selecionar, você pode encontrar o SQL a ser executado. */String declaration = "me.gacl.mapping.ordermapper.selectorder"; // mapear sql identificação string // executar operações de consulta e encapsular automaticamente os resultados da consulta em um objeto de ordem e de retorno de ordem = sqlSession.SelectOne (declaração); // Queriry the registro com ID na tabela de tabela // SqlSessionsSqlSession.Close (); System.out.println (ordem); // Resultado de impressão: order [id =, orderno = aaaa, price =.]}@Testpublic void testGetorderById () {sqlSession sqlSession = mybatisutil.getsqlsession ();/*** map sp spratification string,* me.m.g.g.g.g.g.g.glitMoStion.MaPertOnSetM.GatiSutil.g.g.g.gtlitMeStion.Ampation. Tag no arquivo OrderMapper.xml. * SelectorderResultMap é o valor do atributo de identificação da tag Selecionar. Através do valor do atributo de ID da tag Selecionar, você pode encontrar o SQL a ser executado. */String declaration = "me.gacl.mapping.ordermapper.selectorerResultmap"; // mapeando string de identificação SQL // Executa operações de consulta e encapsula automaticamente os resultados da consulta em um objeto de ordem e retorno de ordem = sqlSession.Selectone (); SqlSessionsSqlSession.Close (); System.out.println (ordem); // Resultado de impressão: ordem [id =, orderno = aaaa, preço =.]}} 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 da classe de entidade através do <sultMap>. 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.
O acima é o tutorial de aprendizado Mybatis apresentado pelo editor (iv) - como resolver rapidamente o conflito entre nomes de campo e nomes de atributos de classe de entidade. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!