이 기사는 편집자가 가져온 Mybatis의 엔티티 클래스 및 테이블 매핑 문제에 대한 지식입니다. 이 튜토리얼을 배우면 다른 필드 이름과 엔티티 클래스 속성 이름의 충돌 문제를 빠르게 해결하는 데 도움이 될 수 있습니다. 필요한 친구, 살펴 보겠습니다!
1. 데모에 사용할 테이블과 데이터 준비
테이블 주문 생성 (Order_ID int 기본 키 auto_increment, order_no varchar (20), order_price float); Orders (Order_No, Order_Price) 값 ( 'AAAA', 23); Orders에 삽입 (Order_No, Order_Price) 값 ( 'BBBB', 33); 'CURTER (ORDER_NO, 33); 22);
2. 엔티티 클래스를 정의하십시오
packing me.gacl.domain;/*** @author gaCl*주문 테이블*/public class Order {/*** 테이블 주문 생성 (Order_ID int 기본 키 auto_increment, order_no varchar (20), order_price float);*// 주문 엔티티 클래스 및 주문 테이블은 다른 개인 int id; // id ===> order_idprivate String orderno; // orderno ===> order_noprivate float 가격; // price ===> order_pricepublic int getId () {return id;} public void setId (int id) {this.id = id;} public string getOrderno (return orderno;} public void setorderno (String Orderno) {this.orderno = Orderno;} public setprise (flate getprise) {this.price = price;}@attradepublic string tostring () {return "order [id =" + id + ", orderno =" + orderno + ", price =" + price + "];}}3. 테스트 코드를 작성하십시오
3.1. SQL XML 매핑 파일을 작성하십시오
1. OrderMapper.xml 파일을 만듭니다. OrderMapper.xml의 내용은 다음과 같습니다.
<? xml version = "1.0"encoding = "utf-8"?> <! doctype mapper public "-// mybatis.org//dtd Mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><-- 네임 스페이스의 값은 일반적으로 패키지 이름 + SQL 매핑 파일 이름으로 설정되어 네임 스페이스의 값이 고유 한 것으로 보장 될 수 있습니다.
예를 들어, namespace = "me.gacl.mapping.ordermapper"는 me.gacl.mapping (패키지 이름) + OrderMapper (OrderMapper.xml 파일)입니다.
-> <Mapper Namespace = "me.gacl.mapping.orderMapper"> <!-ID 쿼리를 기반으로 주문 객체를 가져옵니다. 이 쿼리를 사용하면 원하는 결과를 쿼리 할 수 없습니다. 이는 주로 엔티티 클래스의 속성 이름이 데이터베이스의 필드 이름에 해당하지 않기 때문에 해당 레코드를 쿼리 할 수 없기 때문입니다.> <select id = "getOrderById"parameterType = "int"resultType = "me.gacl.domain.order"> order_id = {id} </select> <! 이 쿼리를 사용하면 일반적으로 원하는 결과를 쿼리 할 수 있습니다. 이는 엔티티 클래스 속성 이름과 동일한 별칭을 가진 쿼리에 쿼리를 제공하므로 엔티티 클래스의 속성 이름과 쿼리 결과의 필드 이름이 하나씩 해당 할 수 있기 때문입니다.> <select id = "selectorder"parametertype = "int"resulttype = "me.gacl.domain.order"> ordert_id id, order_no wrice, order_no wrice whanes whanes whane order_id =#{id} </select> <!- ID 쿼리를 기반으로 주문 객체를 가져옵니다. 이 쿼리를 사용하면 정상적으로 원하는 결과를 쿼리 할 수 있습니다. 엔티티 클래스 속성 이름과 테이블의 필드 이름 사이의 일대일 서신을 매핑하기 때문입니다. <resultMap>----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 열 = "order_id"/> <!-결과 속성을 사용하여 비 예정된 키 필드를 매핑하기 위해 결과 속성을 사용합니다-> <결과 속성 = "orderno"column = "order_no"/> <result property = "price"column = "order_price"/<result property = "order"열 = "order_price"/> <resultmap> </mapper>2. conf.xml 파일에 OrderMapper.xml 매핑 파일 등록
<Mappers> <!- OrderMapper.xml 파일을 등록하십시오. OrderMapper.xml은 패키지 Me.gacl.mapping에 있으며 리소스는 ME/GACL/MAPPING/ORDERMAPPER.XML-> <Mapper Resource = "Me/Gacl/Mapping/OrderMapper.xml"/> </Mappers>로 작성됩니다.
3.2. 단위 테스트 코드를 작성하십시오
packing me.gacl.test; import me.gacl.domain.order; import me.gacl.util.mybatisutil; import org.apache.ibatis.session.sqlsession; import org.junit.test; public class test2 {@testpublic void testgetByid () {sqlsessions sqlsession = = public class test2. mybatisutil.getSqlSession ();/*** SQL 매핑에 대한 식별 문자열,* me.gacl.mapping.orderMapper는 OrderMapper.xml 파일에서 Mapper 태그의 네임 스페이스 속성 값입니다. 선택 태그의 ID 속성 값을 통해 SQL을 실행할 SQL을 찾을 수 있습니다*/string state = "me.gacl.mapping.ordermapper.getOrderById"; // SQL 식별 문자열을 매핑 // 쿼리 작업을 실행하고 주문 객체로 자동으로 accapting 순서 대상을 캡슐화하고 주문 = SqlSESSE.SelectOne (1); sqlsession sql을 실행하려면 sqlsessionsqlsession.close ()를 닫아야합니다. System.out.println (Order); // 인쇄 결과 : null, 즉, 해당 레코드가 발견되지 않았다} @TestPublic void testGetOrderById2 () {sqlsession sqlsession = myBatisutil.getSqlsession ();/*** MAP SQL 식별 문자열,* me.gacl.mapper.mapper. OrderMapper.xml 파일, * selectorder는 선택 태그의 ID 속성 값입니다. 선택 태그의 ID 속성 값을 통해 SELECT TAG*/String 문의 ID 속성 값을 사용하여 실행될 SQL을 찾을 수 있습니다. // SQL Identity string // 쿼리 실행 및 순서 순서를 자동으로 accaptine하는 SQL Identitity String // SQL Query = SQLSESSION (STERETONE) (STERTION) (STERTION) (STERTONE) (STERTONE) 주문 테이블의 ID 1 // sqlsession을 사용하여 SQL을 실행 한 후 sqlsessionsqlsession.close ()를 닫아야합니다. System.out.println (Order); // 인쇄 결과 : Order [id = 1, orderno = aaaa, price = 23.0]}@testpublic void testgetOrderById3 () {sqlsession sqlsession = mybatisutil.getSqlSession (/*** map sql wintitication string,* me.gacl.mappor is the the the the the the the the the the the the the the the the the the value OrderMapper.xml 파일의 Mapper 태그의 * selectorDerresultMap은 선택 태그의 id 속성 값입니다. 선택 태그의 ID 속성 값을 통해 실행될 SQL을 찾을 수 있습니다*/String state = "me.gacl.mapping.ordermapper.selectordectorderresultMap"; // SQL Identity String // Query Operation을 맵핑하고 Query 결과를 순서 대상으로 자동 캡슐화하고 순서 순서 = sqlsession.slectone (1). 테이블 // sqlsession을 사용하여 sql을 실행 한 후에는 sqlsessionsqlsession.close ()를 닫아야합니다. System.out.println (Order); // 인쇄 결과 : Order [id = 1, OrderNo = AAAA, 가격 = 23.0]}}단위 테스트 실행 결과 :
1. TestGetOrderByID 메소드는 쿼리를 실행 한 후 NULL을 반환합니다.
2. TestGetOrderByID2 메소드 및 TestGetOrderByID3 메소드가 쿼리를 실행 한 후에는 원하는 결과를 정상적으로 얻을 수 있습니다.
4. 요약
위의 테스트 코드는 엔티티 클래스의 속성 이름과 테이블의 필드 이름이 일치하지 않으면 쿼리 작업에 myBatis를 사용할 때 해당 결과를 쿼리 할 수 없으며 문제에 대해 두 가지 메소드가 채택된다는 문제를 보여줍니다.
솔루션 1 : 쿼리 SQL 문에서 필드 이름의 별칭을 정의하여 필드 이름의 별칭이 엔티티 클래스의 속성 이름과 일치하도록하므로 테이블의 필드 이름이 엔티티 클래스의 속성 이름에 하나씩 해당 할 수 있습니다. 이 메소드는 SQL 문에서 별칭을 정의하여 필드 이름과 속성 이름 간의 매핑 관계를 해결합니다.
솔루션 2 : 맵핑을 통해 필드 이름과 엔티티 클래스 속성 이름 사이의 일대일 서신을 매핑하십시오. 이 방법은 Mybatis가 제공 한 솔루션을 사용하여 필드 이름과 속성 이름 사이의 매핑 관계를 해결합니다.