2015-09-17 17 views
5

Tôi đã đọc sách và tài liệu về Mybatis, cả XML và chú thích đều làm những gì tôi muốn, nhưng từ trang web chính thức của myBatis, họ tuyên bố XML là một cách tốt hơn để làm Mappers, bởi vì chú thích Java có những hạn chế.Mybatis XML vs Annotation

Cá nhân tôi thích Chú thích ví dụ

public interface PersonDAO { 

    String INSERT_PERSON = "insert into person (title,firstName,surName,jobTitle,dob,email,mobile,landPhone,fax,twitter,facebook,linkedin) VALUES (#{title},#{firstName},#{surName},#{jobTitle},#{dob},#{email},#{mobile},#{landPhone},#{fax},#{twitter},#{facebook},#{linkedin})"; 
    String UPDATE_PERSON = "update person set title=#{title},firstName=#{firstName},surName=#{surName},jobTitle=#{jobTitle},dob=#{dob},email=#{email},mobile=#{mobile},landPhone=#{landPhone},fax=#{fax},twitter=#{twitter},facebook=#{facebook},linkedin=#{linkedin} where id=#{id}"; 
    String GET_PERSON_BY_ID = "SELECT * FROM vw_person WHERE id = #{personId}"; 
    String DELETE_PERSON = "DELETE FROM person WHERE id = #{personId}"; 

    @Select(GET_PERSON_BY_ID) 
    public PersonVO doSelectPerson(long personId) throws Exception; 

    @Update(UPDATE_PERSON)@Options(flushCache = true, useCache = true) 
    public int doUpdatePerson(PersonVO vo) throws Exception; 


    @Insert(INSERT_PERSON)@Options(useGeneratedKeys = true, keyProperty = "id", flushCache = true) 
    public int doCreatePerson(PersonVO person) throws Exception; 

    @Delete(DELETE_PERSON)@Options(flushCache = true) 
    public int doDeletePerson(long personId) throws Exception; 

} 

Tôi tự hỏi những gì mà giới hạn là gì? Không có gì có vẻ hiển nhiên với tôi.

+0

Đọc bài đăng này để nhận những chú thích được giới hạn đối với [cấu hình Xml so với cấu hình dựa trên chú thích] (http://stackoverflow.com/a/183401/1793718). Theo như myBatis có liên quan đến [tài liệu nói] (https://mybatis.github.io/mybatis-3/getting-started.html) rằng ánh xạ XML vẫn được yêu cầu cho các ánh xạ tiên tiến nhất. 'Nested Join Mapping' là một ví dụ về điều đó. – Lucky

+0

Cũng đọc câu hỏi liên quan này về [Chú giải Mybatis trong các ứng dụng phức tạp] (http://stackoverflow.com/questions/15352242/mybatis-annotations-in-complex-applications) – Lucky

Trả lời

7

Phía trên cùng của Bản đồ tham gia lồng nhau mà Pitchers cho biết, resultMap ở định dạng XML hỗ trợ kế thừa, không thể đạt được trong chú thích, bạn đã viết lại mỗi lần. Ngoài ra, chú thích @Results là một đối tác của phần tử XML Mapper <resultMap>. Tuy nhiên, như MyBatis 3.2.2, chúng tôi không thể cung cấp ID cho chú thích @Results. Vì vậy, không giống như yếu tố XML <resultMap>, chúng tôi không thể sử dụng lại tuyên bố @Results trên các câu lệnh được ánh xạ khác nhau. Điều này có nghĩa là bạn cần sao chép cấu hình @Results mặc dù nó giống nhau. Ví dụ, xem findStudentBy()findAllStudents() phương pháp sau đây:

@Select("SELECT * FROM STUDENTS WHERE STUD_ID=#{studId}") 
@Results({ 
    @Result(id=true, column="stud_id", property="studId"), 
    @Result(column="name", property="name"), 
    @Result(column="email", property="email"), 
    @Result(column="addr_id", property="address.addrId") 
}) 
Student findStudentById(int studId); 

@Select("SELECT * FROM STUDENTS") 
@Results({ 
    @Result(id=true, column="stud_id", property="studId"), 
    @Result(column="name", property="name"), 
    @Result(column="email", property="email"), 
    @Result(column="addr_id", property="address.addrId") 
}) 
List<Student> findAllStudents(); 

Đây là cấu hình @Results là giống nhau cho cả hai báo cáo, nhưng chúng ta cần phải lặp lại nó. Ngoài ra còn có một công việc xung quanh cho vấn đề này. Chúng ta có thể tạo một tệp XML Mapper và định cấu hình phần tử <resultMap> và tham chiếu resultMap bằng cách sử dụng chú thích @ResultMap.

Xác định <resultMap> với ID StudentResult theo số StudentMapper.xml.

<mapper namespace="com.mybatis3.mappers.StudentMapper"> 
    <resultMap type="Student" id="StudentResult"> 
    <id property="studId" column="stud_id"/> 
    <result property="name" column="name"/> 
    <result property="email" column="email"/> 
    <result property="phone" column="phone"/> 
    </resultMap> 
</mapper> 

SQL Mappers Sử dụng chú thích

Trong StudentMapper.java, tham khảo các resultMap thuộc tính StudentResult sử dụng @ResultMap.

public interface StudentMapper 

@Select("SELECT * FROM STUDENTS WHERE STUD_ID=#{studId}") 
@ResultMap("com.mybatis3.mappers.StudentMapper.StudentResult") 
Student findStudentById(int studId); 

@Select("SELECT * FROM STUDENTS") 
@ResultMap("com.mybatis3.mappers.StudentMapper.StudentResult") 
List<Student> findAllStudents(); 

trích dẫn từ Java Persistence-với-MyBatis3

+0

Tái sử dụng '@ Results' thực sự có thể hiện nay. Nếu bạn cung cấp 'id' với' @ Results' thì bạn có thể tham chiếu nó từ '@ ResultMap'. Xem [tài liệu] (http://www.mybatis.org/mybatis-3/java-api.html#Mapper_Annotations) và [gitlab issue] (https://github.com/mybatis/mybatis-3/issues/ 155). – Stim

3

Có, tài liệu hướng dẫn cho Mybatis lưu ý rằng các chú thích có thể đơn giản hơn và dễ đọc hơn đối với các dự án nhỏ hơn, đơn giản hơn. Tuy nhiên, chú thích bị giới hạn so với cấu hình XML. Nếu dự án của bạn bao gồm các đối tượng phức tạp hoặc cấu trúc cơ sở dữ liệu phức tạp, hãy xem xét sử dụng cấu hình XML thay vì chú thích Java.

Ánh xạ XML vẫn được yêu cầu cho các ánh xạ tiên tiến nhất như Lập bản đồ tham gia lồng nhau trong MyBatis.

+1

Tôi chắc chắn chú thích có thể đạt được ánh xạ nối lồng nhau, isn ' t? – user5324782

1

Có trường hợp sử dụng nhiều khi sử dụng .xml có thể được nhiều hơn nữa consice và cách tiếp cận rõ ràng hơn. Say, bạn có thể tạo ra một số Common.xml, xác định một loạt các truy vấn, như

<sql id="inStmt"> 
    IN 
    <foreach item="id" collection="ids" separator="," open="(" close=")"> 
     #{id} 
    </foreach> 
</sql> 

và tái sử dụng mã này trong dự án của bạn.

Hơn nữa, truy vấn mẫu có thể được xác định, ví dụ::

<sql id="selectDistinct"> 
    SELECT DISTINCT(${column}), #{param} 
    FROM ${entityTable} 
</sql> 

Và sau đó bạn có thể tham khảo nó qua

<include refid="Common.selectDistinct"> 
     <property name="column" value="id"/> 
     <property name="entityTable" value="some_table"/> 
</include> 

Cách tiếp cận này là ít dễ bị lỗi và sao chép ít hơn nhiều/dán. (bạn có thể xem here).

Điều kiện, lặp lại, v.v. cũng nên được đề cập.

Các vấn đề liên quan