프로젝트 개발에서, 우리는 종종 테이블의 필드 이름과 테이블의 해당 엔티티 클래스의 속성 이름이 정확히 같지 않은 상황을 종종 만나게됩니다. 다음 편집자는이 경우 다른 필드 이름 및 엔티티 클래스의 충돌 문제를 해결하는 방법을 보여줍니다. 관심있는 친구들이 함께 배울 것입니다.
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. 엔티티 클래스를 정의하십시오
package me.gacl.domain;/*** @author gaCl*주문 테이블*/public class Order {/*** 테이블 주문 생성 (Order_ID int 기본 키 auto_increment, order_no varchar (), order_price float);*/// 주문 테이블의 필드 이름이 다릅니다. // 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 버전 = "." 인코딩 = "utf-"?> <! doctype mapper public "-// mybatis.org//dtd mapper .//en" "http://mybatis.org/dtd/mybatis-mapper.dtd"><! 네임 스페이스의 값은 일반적으로 패키지 이름 + SQL 맵 파일 이름으로 설정되므로 네임 스페이스의 값이 고유 한 것으로 보장 될 수 있습니다. 예를 들어, namespace = "me.gacl.mapping.ordermapper"는 me.gacl.mapping (패키지 이름) + OrderMapper (OrderMapper.xml 파일 제거 접미사)-> <Mapper 네임 스페이스 = "me.gacl.mapping.orderMapper"> <!-
주문 객체는 ID 쿼리에 따라 얻습니다. 이 쿼리를 사용하면 원하는 결과를 쿼리 할 수 없습니다. 이는 주로 엔티티 클래스의 속성 이름이 데이터베이스의 필드 이름에 해당하지 않기 때문에 해당 레코드를 쿼리 할 수 없기 때문입니다.
-> <select id = "getOrderById"parameterType = "int"resultType = "me.gacl.domain.order"> select * where ther ther ther ther ther ther ther ther there_id =#{id} </select> <!- 주문 객체는 ID 쿼리에 따라 얻습니다. 이 쿼리를 사용하면 일반적으로 원하는 결과를 쿼리 할 수 있습니다.
이는 엔티티 클래스 속성 이름과 동일한 속성 이름을 가진 쿼리 별칭을 제공하므로 엔티티 클래스의 속성 이름과 쿼리 결과의 필드 이름이 일대일로 일치 할 수 있기 때문입니다.
-> <select id = "selectorder"parametertype = "int"resulttype = "me.gacl.domain.order"> Order_No OrderNo, Order_No Orderno, Order_ID =#{id} </select> <!- ID 쿼리에 따르면 주문 객체를 얻을 수 있습니다. 이 쿼리를 사용하면 정상적으로 원하는 결과를 쿼리 할 수 있습니다. 이는 엔티티 클래스 속성 이름과 테이블의 필드 이름 사이의 일대일 서신을 <resultmap>->를 통해 매핑하기 때문입니다.
<select id = "select _ electmap ="int "resultmap ="orderresultmap "> select * select * select * orders _id =#{id} </select> <!-엔티티 클래스 속성 이름과 <resultmap>을 통해 엔티티 클래스 속성 이름과 테이블의 필드 이름 사이의 서신을 매핑하십시오. ID 속성-> <id property = "id"column = "order_id"/> <!-결과 속성을 사용하여 비 예정 키 필드 매핑-> <result property = "orderno"column = "order_no"/<result property = "price"column = "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. 단위 테스트 코드를 작성하십시오
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 test {@testpublic void testgetgetryid () {sqlsessions sqlsessions mybatisutil.getSqlSession ();/*** SQL 매핑에 대한 식별 문자열,* me.gacl.mapping.orderMapper는 OrderMapper.xml 파일에서 Mapper 태그의 네임 스페이스 속성 값입니다. 선택 태그의 ID 속성 값을 통해 SQL을 실행할 SQL을 찾을 수 있습니다*/string 문 = "me.gacl.mapping.ordermapper.getOrderById"; // SQL Identity String을 매핑 // 쿼리 작업을 실행하고 주문 객체 및 Return Order = SQLSESSION (STATER) (// QUERY); SQL SQLSESSION을 사용하여 sqlsessionsqlsession.close ()를 닫아야합니다. System.out.println (Order); // 인쇄 결과 : null, 즉, 해당 레코드가 발견되지 않음} @TestPublic void testGetOrderById () {sqlsession sqlsession = myBatisutil.getSqlsession ();/*** MAP SQL 식별 문자열,* me.gacl.mapping.mapper의 가치는 이름의 값입니다. OrderMapper.xml 파일, * selectorder는 선택 태그의 ID 속성 값입니다. 선택 태그의 ID 속성 값을 통해 실행될 SQL을 찾을 수 있습니다. */string 문 = "me.gacl.mapping.ordermapper.selectorder"; // QL 식별 문자열 // 쿼리 작업을 실행하고 쿼리 결과를 주문 객체에 자동으로 캡슐화하고 순서 순서로 캡슐화하고 순서 순서 = sqlsession.selectone (station, selectone); // sqlsession을 사용하여 sqls를 실행 한 후 id qls with work to rowne to the close to the close to the close to the close sqlsessionsqlsession.close (); System.out.println (Order); // 인쇄 결과 : Order [id =, orderno = aaaa, price =.]}@testpublic void testGetOrderById () {sqlsession sqlsession = myBatisutil.getSqlSession (/*** 맵 sql Identification,* me.gacl.mapper. Ordermapper.xml 파일에서 태그를 지정합니다. * selectorDerresultMap은 선택 태그의 ID 속성 값입니다. 선택 태그의 ID 속성 값을 통해 실행될 SQL을 찾을 수 있습니다. */string 문 = "me.gacl.mapping.ordermapper.selectorderresultmap"; // 쿼리 식별 문자열 맵핑 // 쿼리 작업을 자동으로 캡처하고 쿼리 결과를 주문 객체에 자동으로 캡슐화하고 주문 순서 = sqlsession.selectone (sqlsession)을 사용하여 레코드를 쿼리하십시오. sqlsessionsqlsession.close (); System.out.println (Order); // 인쇄 결과 : Order [id =, OrderNo = AAAA, 가격 =.]}} 단위 테스트 실행 결과 :
1. TestGetOrderByID 메소드는 쿼리를 실행 한 후 NULL을 반환합니다.
2. TestGetOrderByID2 메소드 및 TestGetOrderByID3 메소드가 쿼리를 실행 한 후에는 원하는 결과를 정상적으로 얻을 수 있습니다.
4. 요약
위의 테스트 코드는 엔티티 클래스의 속성 이름과 테이블의 필드 이름이 일치하지 않으면 쿼리 작업에 myBatis를 사용할 때 해당 결과를 쿼리 할 수 없으며 문제에 대해 두 가지 메소드가 채택된다는 문제를 보여줍니다.
솔루션 1 : 쿼리 SQL 문에서 필드 이름의 별칭을 정의하여 필드 이름의 별칭이 엔티티 클래스의 속성 이름과 일치하도록하므로 테이블의 필드 이름이 엔티티 클래스의 속성 이름에 하나씩 해당 할 수 있습니다. 이 메소드는 SQL 문에서 별칭을 정의하여 필드 이름과 속성 이름 간의 매핑 관계를 해결합니다.
솔루션 2 : 필드 이름과 엔티티 클래스 속성 이름 사이의 일대일 서신을 <resultmap>을 통해 매핑하십시오. 이 방법은 Mybatis가 제공 한 솔루션을 사용하여 필드 이름과 속성 이름 사이의 매핑 관계를 해결합니다.
위는 편집자 (IV)가 귀하에게 소개 한 Mybatis 학습 자습서입니다. 필드 이름과 엔티티 클래스 속성 이름 사이의 충돌을 신속하게 해결하는 방법. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!