MyBatis 3(中文版) 第四章 使用注解配置SQL映射器


本章將涵蓋以下話題:

  • l 在映射器Mapper接口上使用注解
  • l 映射語句

           @Insert,@Update,@Delete,@SeelctStatements

  • l 結果映射

           一對一映射

           一對多映射

  • l 動態SQL

           @SelectProvider

           @InsertProvider

           @UpdateProvider

           @DeleteProvider

 

4.1 在映射器Mapper接口上使用注解

    MyBatis對於大部分的基於XML的映射器元素(包括<select>,<update>)提供了對應的基於注解的配置項。然而在某些情況下,基於注解配置 還不能支持基於XML的一些元素。

4.2 映射語句

MyBatis提供了多種注解來支持不同類型的語句(statement)如SELECT,INSERT,UPDATE,DELETE。讓我們看一下具體怎樣配置映射語句。

4.2.1 @Insert

我們可以使用@Insert注解來定義一個INSERT映射語句:

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. package com.mybatis3.mappers;  
  2. public interface StudentMapper  
  3. {  
  4.     @Insert("INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,ADDR_ID, PHONE)  
  5.             VALUES(#{studId},#{name},#{email},#{address.addrId},#{phone})")  
  6.     int insertStudent(Student student);  
  7. }  
使用了@Insert注解的insertMethod()方法將返回insert語句執行后影響的行數。

[自動生成主鍵]

在上一章中我們討論過主鍵列值可以自動生成。我們可以使用@Options注解的userGeneratedKeys 和keyProperty屬性讓數據庫產生auto_increment(自增長)列的值,然后將生成的值設置到輸入參數對象的屬性中。

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. @Insert("INSERT INTO STUDENTS(NAME,EMAIL,ADDR_ID, PHONE)  
  2.         VALUES(#{name},#{email},#{address.addrId},#{phone})")  
  3. @Options(useGeneratedKeys = true, keyProperty = "studId")  
  4. int insertStudent(Student student);  

這里STUD_ID列值將會通過MySQL數據庫自動生成。並且生成的值將會被設置到student對象的studId屬性中。
[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);  
  2. mapper.insertStudent(student);  
  3. int studentId = student.getStudId();  

有一些數據庫如Oracle,並不支持AUTO_INCREMENT列屬性,它使用序列(SEQUENCE)來產生主鍵的值。

我們可以使用@SelectKey注解來為任意SQL語句來指定主鍵值,作為主鍵列的值。

假設我們有一個名為STUD_ID_SEQ的序列來生成STUD_ID主鍵值。
[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. @Insert("INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,ADDR_ID, PHONE)   
  2. VALUES(#{studId},#{name},#{email},#{address.addrId},#{phone})")  
  3. @SelectKey(statement="SELECT STUD_ID_SEQ.NEXTVAL FROM DUAL",   
  4. keyProperty="studId", resultType=int.class, before=true)  
  5. int insertStudent(Student student);  

這里我們使用了@SelectKey來生成主鍵值,並且存儲到了student對象的studId屬性上。由於我們設置了before=true,該語句將會在執行INSERT語句之前執行。

如果你使用序列作為觸發器來設置主鍵值,我們可以在INSERT語句執行后,從sequence_name.currval獲取數據庫產生的主鍵值。
[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. @Insert("INSERT INTO STUDENTS(NAME,EMAIL,ADDR_ID, PHONE)   
  2. VALUES(#{name},#{email},#{address.addrId},#{phone})")  
  3. @SelectKey(statement="SELECT STUD_ID_SEQ.CURRVAL FROM DUAL",   
  4. keyProperty="studId", resultType=int.class, before=false)  
  5. int insertStudent(Student student);  

4.2.2 @Update

我們可以使用@Update注解來定義一個UPDATE映射語句,如下所示:

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. @Update("UPDATE STUDENTS SET NAME=#{name}, EMAIL=#{email},   
  2. PHONE=#{phone} WHERE STUD_ID=#{studId}")  
  3. int updateStudent(Student student);  

使用了@Update的updateStudent()方法將會返回執行了update語句后影響的行數。

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);  
  2. int noOfRowsUpdated = mapper.updateStudent(student);  

4.2.3 @Delete

我們可以使用@Delete  注解來定義一個DELETE映射語句,如下所示:

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. @Delete("DELETE FROM STUDENTS WHERE STUD_ID=#{studId}")  
  2. int deleteStudent(int studId);  
使用了@Delete的deleteStudent()方法將會返回執行了update語句后影響的行數。

4.2.4 @Select

我們可以使用@ Select注解來定義一個SELECT映射語句。

讓我們看一下怎樣使用注解配置一個簡單的select查詢。
[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. package com.mybatis3.mappers;  
  2. public interface StudentMapper  
  3. {  
  4.     @Select("SELECT STUD_ID AS STUDID, NAME, EMAIL, PHONE FROM  
  5.             STUDENTS WHERE STUD_ID=#{studId}")  
  6.     Student findStudentById(Integer studId);  
  7. }  

為了將列名和Studentbean屬性名匹配,我們為stud_id起了一個studId的別名。如果返回了多行結果,將拋出 TooManyResultsException異常。

4.3 結果映射

我們可以將查詢結果通過別名或者是@Results注解與JavaBean屬性映射起來。

現在讓我們看看怎樣使用@Results注解將指定列於指定JavaBean屬性映射器來,執行SELECT查詢的:
[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. package com.mybatis3.mappers;  
  2. public interface StudentMapper  
  3. {  
  4.     @Select("SELECT * FROM STUDENTS")  
  5.     @Results(  
  6.     {  
  7.         @Result(id = true, column = "stud_id", property = "studId"),  
  8.         @Result(column = "name", property = "name"),  
  9.         @Result(column = "email", property = "email"),  
  10.         @Result(column = "addr_id", property = "address.addrId")  
  11.     })  
  12.     List<Student> findAllStudents();  
  13. }  

例如,看下面的findStudentById()和findAllStudents()方法:
[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. @Select("SELECT * FROM STUDENTS WHERE STUD_ID=#{studId}")  
  2. @Results(  
  3. {  
  4.     @Result(id = true, column = "stud_id", property = "studId"),  
  5.     @Result(column = "name", property = "name"),  
  6.     @Result(column = "email", property = "email"),  
  7.     @Result(column = "addr_id", property = "address.addrId")  
  8. })  
  9. Student findStudentById(int studId);  
  10. @Select("SELECT * FROM STUDENTS")  
  11. @Results(  
  12. {  
  13.     @Result(id = true, column = "stud_id", property = "studId"),  
  14.     @Result(column = "name", property = "name"),  
  15.     @Result(column = "email", property = "email"),  
  16.     @Result(column = "addr_id", property = "address.addrId")  
  17. })  
  18. List<Student> findAllStudents();  

這里兩個語句的@Results配置完全相同,但是我必須得重復它。這里有一個解決方法。我們可以創建一個映射器Mapper配置文件, 然后配置<resultMap>元素,然后使用@ResultMap注解引用此<resultMap>。

在StudentMapper.xml中定義一個ID為StudentResult的<resultMap>。

[html]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. <mapper namespace="com.mybatis3.mappers.StudentMapper">  
  2.   <resultMap type="Student" id="StudentResult">  
  3.     <id property="studId" column="stud_id" />  
  4.     <result property="name" column="name" />  
  5.     <result property="email" column="email" />  
  6.     <result property="phone" column="phone" />  
  7.   </resultMap>  
  8. </mapper>  

在StudentMapper.java中,使用@ResultMap引用名為StudentResult的resultMap。
[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. public interface StudentMapper  
  2. {  
  3.     @Select("SELECT * FROM STUDENTS WHERE STUD_ID=#{studId}")  
  4.     @ResultMap("com.mybatis3.mappers.StudentMapper.StudentResult")  
  5.     Student findStudentById(int studId);  
  6.     @Select("SELECT * FROM STUDENTS")  
  7.     @ResultMap("com.mybatis3.mappers.StudentMapper.StudentResult")  
  8.     List<Student> findAllStudents();  
  9. }  

4.3.1 一對一映射

MyBatis提供了@One注解來使用嵌套select語句(Nested-Select)加載一對一關聯查詢數據。讓我們看看怎樣使用@One注解獲取學生及其地址信息。
[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. public interface StudentMapper  
  2. {  
  3.     @Select("SELECT ADDR_ID AS ADDRID, STREET, CITY, STATE, ZIP, COUNTRY  
  4.             FROM ADDRESSES WHERE ADDR_ID=#{id}")  
  5.     Address findAddressById(int id);  
  6.     @Select("SELECT * FROM STUDENTS WHERE STUD_ID=#{studId} ")  
  7.     @Results(  
  8.     {  
  9.         @Result(id = true, column = "stud_id", property = "studId"),  
  10.         @Result(column = "name", property = "name"),  
  11.         @Result(column = "email", property = "email"),  
  12.         @Result(property = "address", column = "addr_id",  
  13.         one = @One(select = "com.mybatis3.mappers.StudentMapper.  
  14.         findAddressById"))  
  15.     })  
  16.     Student selectStudentWithAddress(int studId);  
  17. }  

這里我們使用了@One注解的select屬性來指定一個使用了完全限定名的方法上,該方法會返回一個Address對象。使用column=”addr_id”,則STUEDNTS表中列addr_id的值將會作為輸入參數傳遞給findAddressById()方法。如果@OneSELECT查詢返回了多行結果,則會拋出TooManyResultsException異常。
[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. int studId = 1;  
  2. StudentMapper studentMapper =   
  3. sqlSession.getMapper(StudentMapper.class);  
  4. Student student = studentMapper.selectStudentWithAddress(studId);  
  5. System.out.println("Student :"+student);  
  6. System.out.println("Address :"+student.getAddress());  

在第三章,使用XML配置SQL映射器中我們討論過,我們可以通過基於XML的映射器配置,使用嵌套結果ResultMap來加載一對一關聯的查詢。而MyBatis3.2.2版本,並沒有對應的注解支持。但是我們可以在映射器Mapper配置文件中配置<resultMap>並且使用@ResultMap注解來引用它。

在StudentMapper.xml中配置<resultMap>,如下所示:
[html]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. <mapper namespace="com.mybatis3.mappers.StudentMapper">  
  2.   <resultMap type="Address" id="AddressResult">  
  3.     <id property="addrId" column="addr_id" />  
  4.     <result property="street" column="street" />  
  5.     <result property="city" column="city" />  
  6.     <result property="state" column="state" />  
  7.     <result property="zip" column="zip" />  
  8.     <result property="country" column="country" />  
  9.   </resultMap>  
  10.   <resultMap type="Student" id="StudentWithAddressResult">  
  11.     <id property="studId" column="stud_id" />  
  12.     <result property="name" column="name" />  
  13.     <result property="email" column="email" />  
  14.     <association property="address" resultMap="AddressResult" />  
  15.   </resultMap>  
  16. </mapper>  

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. public interface StudentMapper  
  2. {  
  3.     @Select("select stud_id, name, email, a.addr_id, street, city,  
  4.             state, zip, country" + " FROM students s left outer join addresses a  
  5.             on s.addr_id=a.addr_id" + " where stud_id=#{studId} ")  
  6.     @ResultMap("com.mybatis3.mappers.StudentMapper.  
  7.                StudentWithAddressResult")  
  8.     Student selectStudentWithAddress(int id);  
  9. }  

4.3.2 一對多映射

MyBatis提供了@Many注解,用來使用嵌套Select語句加載一對多關聯查詢。

現在讓我們看一下如何使用@Many注解獲取一個講師及其教授課程列表信息:

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. public interface TutorMapper  
  2. {  
  3.     @Select("select addr_id as addrId, street, city, state, zip,  
  4.             country from addresses where addr_id=#{id}")  
  5.     Address findAddressById(int id);  
  6.     @Select("select * from courses where tutor_id=#{tutorId}")  
  7.     @Results(  
  8.     {  
  9.         @Result(id = true, column = "course_id", property = "courseId"),  
  10.         @Result(column = "name", property = "name"),  
  11.         @Result(column = "description", property = "description"),  
  12.         @Result(column = "start_date" property = "startDate"),  
  13.         @Result(column = "end_date" property = "endDate")  
  14.     })  
  15.     List<Course> findCoursesByTutorId(int tutorId);  
  16.     @Select("SELECT tutor_id, name as tutor_name, email, addr_id  
  17.             FROM tutors where tutor_id=#{tutorId}")  
  18.     @Results(  
  19.     {  
  20.         @Result(id = true, column = "tutor_id", property = "tutorId"),  
  21.         @Result(column = "tutor_name", property = "name"),  
  22.         @Result(column = "email", property = "email"),  
  23.         @Result(property = "address", column = "addr_id",  
  24.         one = @One(select = " com.mybatis3.  
  25.         mappers.TutorMapper.findAddressById")),  
  26.         @Result(property = "courses", column = "tutor_id",  
  27.         many = @Many(select = "com.mybatis3.mappers.TutorMapper.  
  28.         findCoursesByTutorId"))  
  29.     })  
  30.     Tutor findTutorById(int tutorId);  
  31. }  

 

這里我們使用了@Many注解的select屬性來指向一個完全限定名稱的方法,該方法將返回一個List<Course>對象。使用column=”tutor_id”,TUTORS表中的tutor_id列值將會作為輸入參數傳遞給findCoursesByTutorId()方法。

在第三章,使用XML配置SQL映射器中我們討論過,我們可以通過基於XML的映射器配置,使用嵌套結果ResultMap來加載一對多關聯的查詢。而MyBatis3.2.2版本,並沒有對應的注解支持。但是我們可以在映射器Mapper配置文件中配置<resultMap>並且使用@ResultMap注解來引用它。

在TutorMapper.xml中配置<resultMap>,如下所示:

[html]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. <mapper namespace="com.mybatis3.mappers.TutorMapper">  
  2.   <resultMap type="Address" id="AddressResult">  
  3.     <id property="addrId" column="addr_id" />  
  4.     <result property="street" column="street" />  
  5.     <result property="city" column="city" />  
  6.     <result property="state" column="state" />  
  7.     <result property="zip" column="zip" />  
  8.     <result property="country" column="country" />  
  9.   </resultMap>  
  10.   <resultMap type="Course" id="CourseResult">  
  11.     <id column="course_id" property="courseId" />  
  12.     <result column="name" property="name" />  
  13.     <result column="description" property="description" />  
  14.     <result column="start_date" property="startDate" />  
  15.     <result column="end_date" property="endDate" />  
  16.   </resultMap>  
  17.   <resultMap type="Tutor" id="TutorResult">  
  18.     <id column="tutor_id" property="tutorId" />  
  19.     <result column="tutor_name" property="name" />  
  20.     <result column="email" property="email" />  
  21.     <association property="address" resultMap="AddressResult" />  
  22.     <collection property="courses" resultMap="CourseResult" />  
  23.   </resultMap>  
  24. </mapper>  

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. public interface TutorMapper  
  2. {  
  3.     @Select("SELECT T.TUTOR_ID, T.NAME AS TUTOR_NAME, EMAIL,  
  4.             A.ADDR_ID, STREET, CITY, STATE, ZIP, COUNTRY, COURSE_ID, C.NAME,  
  5.             DESCRIPTION, START_DATE, END_DATE  FROM TUTORS T LEFT OUTER  
  6.             JOIN ADDRESSES A ON T.ADDR_ID=A.ADDR_ID LEFT OUTER JOIN COURSES  
  7.             C ON T.TUTOR_ID=C.TUTOR_ID WHERE T.TUTOR_ID=#{tutorId}")  
  8.     @ResultMap("com.mybatis3.mappers.TutorMapper.TutorResult")  
  9.     Tutor selectTutorById(int tutorId);  
  10. }  

4.4 動態SQL

有時候我們需要根據輸入條件動態地構建SQL語句。MyBatis提供了各種注解如@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,來幫助構建動態SQL語句,然后讓MyBatis執行這些SQL語句。

4.4.1 @SelectProvider

現在讓我們來看一個使用@SelectProvider注解來創建一個簡單的SELECT映射語句的例子。

創建一個TutorDynaSqlProvider.java類,以及findTutorByIdSql()方法,如下所示:

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. package com.mybatis3.sqlproviders;  
  2. import org.apache.ibatis.jdbc.SQL;  
  3. public class TutorDynaSqlProvider  
  4. {  
  5.     public String findTutorByIdSql(int tutorId)  
  6.     {  
  7.         return "SELECT TUTOR_ID AS tutorId, NAME, EMAIL FROM TUTORS  
  8.                WHERE TUTOR_ID=" + tutorId;  
  9.     }  
  10. }  
在TutorMapper.java接口中創建一個映射語句,如下:

 

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. @SelectProvider(type=TutorDynaSqlProvider.class, method="findTutorByIdSql")  
  2. Tutor findTutorById(int tutorId);  

 

這里我們使用了@SelectProvider來指定了一個類,及其內部的方法,用來提供需要執行的SQL語句。

但是使用字符串拼接的方法唉構建SQL語句是非常困難的,並且容易出錯。所以MyBaits提供了一個SQL工具類不使用字符串拼接的方式,簡化構造動態SQL語句。

現在,讓我們看看如何使用org.apache.ibatis.jdbc.SQL工具類來准備相同的SQL語句。

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. package com.mybatis3.sqlproviders;  
  2. import org.apache.ibatis.jdbc.SQL;  
  3. public class TutorDynaSqlProvider  
  4. {  
  5.     public String findTutorByIdSql(final int tutorId)  
  6.     {  
  7.         return new SQL()  
  8.         {  
  9.             {  
  10.                 SELECT("tutor_id as tutorId, name, email");  
  11.                 FROM("tutors");  
  12.                 WHERE("tutor_id=" + tutorId);  
  13.             }  
  14.         } .toString();  
  15.     }  
  16. }  

 

SQL工具類會處理以合適的空格前綴和后綴來構造SQL語句。

動態SQL provider方法可以接收以下其中一種參數:

  •            ž 無參數
  •            ž 和映射器Mapper接口的方法同類型的參數
  •            ž java.util.Map

 

如果SQL語句的准備不取決於輸入參數,你可以使用不帶參數的SQL Provider方法。

例如:

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. public String findTutorByIdSql()  
  2. {  
  3.     return new SQL()  
  4.     {  
  5.         {  
  6.             SELECT("tutor_id as tutorId, name, email");  
  7.             FROM("tutors");  
  8.             WHERE("tutor_id = #{tutorId}");  
  9.         }  
  10.     } .toString();  
  11. }  

這里我們沒有使用輸入參數構造SQL語句,所以它可以是一個無參方法。

如果映射器Mapper接口方法只有一個參數,那么可以定義SQLProvider方法,它接受一個與Mapper接口方法相同類型的參數。

例如映射器Mapper接口有如下定義:

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-family:Microsoft YaHei;font-size:12px;">Tutor findTutorById(int tutorId);</span>  

這里findTutorById(int)方法只有一個int類型的參數。我們可以定義findTutorByIdSql(int)方法作為SQL provider方法。

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. public String findTutorByIdSql(final int tutorId)  
  2. {  
  3.     return new SQL()  
  4.     {  
  5.         {  
  6.             SELECT("tutor_id as tutorId, name, email");  
  7.             FROM("tutors");  
  8.             WHERE("tutor_id=" + tutorId);  
  9.         }  
  10.     } .toString();  
  11. }  
如果映射器Mapper接口有多個輸入參數,我們可以使用參數類型為java.util.Map的方法作為SQLprovider方法。然后映射器Mapper接口方法所有的輸入參數將會被放到map中,以param1,param2等等作為key,將輸入參數按序作為value。你也可以使用0,1,2等作為key值來取的輸入參數。

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. @SelectProvider(type = TutorDynaSqlProvider.class,  
  2.                 method = "findTutorByNameAndEmailSql")  
  3. Tutor findTutorByNameAndEmail(String name, String email);  
  4. public String findTutorByNameAndEmailSql(Map<String, Object> map)  
  5. {  
  6.     String name = (String) map.get("param1");  
  7.     String email = (String) map.get("param2");  
  8.     //you can also get those values using 0,1 keys  
  9.     //String name = (String) map.get("0");  
  10.     //String email = (String) map.get("1");  
  11.     return new SQL()  
  12.     {  
  13.         {  
  14.             SELECT("tutor_id as tutorId, name, email");  
  15.             FROM("tutors");  
  16.             WHERE("name=#{name} AND email=#{email}");  
  17.         }  
  18.     } .toString();  
  19. }  

 

SQL工具類也提供了其他的方法來表示JOINS,ORDER_BY,GROUP_BY等等。

讓我們看一個使用LEFT_OUTER_JOIN的例子:

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. public class TutorDynaSqlProvider  
  2. {  
  3.     public String selectTutorById()  
  4.     {  
  5.         return new SQL()  
  6.         {  
  7.             {  
  8.                 SELECT("t.tutor_id, t.name as tutor_name, email");  
  9.                 SELECT("a.addr_id, street, city, state, zip, country");  
  10.                 SELECT("course_id, c.name as course_name, description,  
  11.                        start_date, end_date");  
  12.                 FROM("TUTORS t");  
  13.                 LEFT_OUTER_JOIN("addresses a on t.addr_id=a.addr_id");  
  14.                 LEFT_OUTER_JOIN("courses c on t.tutor_id=c.tutor_id");  
  15.                 WHERE("t.TUTOR_ID = #{id}");  
  16.             }  
  17.         } .toString();  
  18.     }  
  19. }  
  20.   
  21. public interface TutorMapper  
  22. {  
  23.     @SelectProvider(type = TutorDynaSqlProvider.class,  
  24.                     method = "selectTutorById")  
  25.     @ResultMap("com.mybatis3.mappers.TutorMapper.TutorResult")  
  26.     Tutor selectTutorById(int tutorId);  
  27. }  
由於沒有支持使用內嵌結果ResultMap的一對多關聯映射的注解支持,我們可以使用基於XML的<resultMap>配置,然后與@ResultMap映射。

 

 

[html]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. <mapper namespace="com.mybatis3.mappers.TutorMapper">  
  2.   <resultMap type="Address" id="AddressResult">  
  3.     <id property="id" column="addr_id" />  
  4.     <result property="street" column="street" />  
  5.     <result property="city" column="city" />  
  6.     <result property="state" column="state" />  
  7.     <result property="zip" column="zip" />  
  8.     <result property="country" column="country" />  
  9.   </resultMap>  
  10.   <resultMap type="Course" id="CourseResult">  
  11.     <id column="course_id" property="id" />  
  12.     <result column="course_name" property="name" />  
  13.     <result column="description" property="description" />  
  14.     <result column="start_date" property="startDate" />  
  15.     <result column="end_date" property="endDate" />  
  16.   </resultMap>  
  17.   <resultMap type="Tutor" id="TutorResult">  
  18.     <id column="tutor_id" property="id" />  
  19.     <result column="tutor_name" property="name" />  
  20.     <result column="email" property="email" />  
  21.     <association property="address" resultMap="AddressResult" />  
  22.     <collection property="courses" resultMap="CourseResult"></collection>  
  23.   </resultMap>  
  24. </mapper>  
使用了動態的SQL provider,我們可以取得講師及其地址和課程明細。

 

 

4.4.2 @InsertProvider

我們可以使用@InsertProvider注解創建動態的INSERT語句,如下所示:

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. public class TutorDynaSqlProvider  
  2. {  
  3.     public String insertTutor(final Tutor tutor)  
  4.     {  
  5.         return new SQL()  
  6.         {  
  7.             {  
  8.                 INSERT_INTO("TUTORS");  
  9.                 if (tutor.getName() != null)  
  10.                 {  
  11.                     VALUES("NAME", "#{name}");  
  12.                 }  
  13.                 if (tutor.getEmail() != null)  
  14.                 {  
  15.                     VALUES("EMAIL", "#{email}");  
  16.                 }  
  17.             }  
  18.         } .toString();  
  19.     }  
  20. }  
  21. public interface TutorMapper  
  22. {  
  23.     @InsertProvider(type = TutorDynaSqlProvider.class,  
  24.                     method = "insertTutor")  
  25.     @Options(useGeneratedKeys = true, keyProperty = "tutorId")  
  26.     int insertTutor(Tutor tutor);  
  27. }  

4.4.3 @UpdateProvider

我們可以通過@UpdateProvider注解創建UPDATE語句,如下所示:

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. public class TutorDynaSqlProvider  
  2. {  
  3.     public String updateTutor(final Tutor tutor)  
  4.     {  
  5.         return new SQL()  
  6.         {  
  7.             {  
  8.                 UPDATE("TUTORS");  
  9.                 if (tutor.getName() != null)  
  10.                 {  
  11.                     SET("NAME = #{name}");  
  12.                 }  
  13.                 if (tutor.getEmail() != null)  
  14.                 {  
  15.                     SET("EMAIL = #{email}");  
  16.                 }  
  17.                 WHERE("TUTOR_ID = #{tutorId}");  
  18.             }  
  19.         } .toString();  
  20.     }  
  21. }  
  22. public interface TutorMapper  
  23. {  
  24.     @UpdateProvider(type = TutorDynaSqlProvider.class,  
  25.                     method = "updateTutor")  
  26.     int updateTutor(Tutor tutor);  
  27. }  

4.4.4 @DeleteProvider

我們可以使用@DeleteProvider注解創建動態地DELETE語句,如下所示:

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到我的代碼片
  1. public class TutorDynaSqlProvider  
  2. {  
  3.     public String deleteTutor(int tutorId)  
  4.     {  
  5.         return new SQL()  
  6.         {  
  7.             {  
  8.                 DELETE_FROM("TUTORS");  
  9.                 WHERE("TUTOR_ID = #{tutorId}");  
  10.             }  
  11.         } .toString();  
  12.     }  
  13. }  
  14. public interface TutorMapper  
  15. {  
  16.     @DeleteProvider(type = TutorDynaSqlProvider.class,  
  17.                     method = "deleteTutor")  
  18.     int deleteTutor(int tutorId);  
  19. }  

4.5 總結

在本章中,我們學習了怎樣使用注解書寫SQL映射語句。討論了如何配置簡單語句,一對一關系語句和一對多關系語句。我們還探討了怎樣使用SqlProvider注解來構建動態SQL語句。在下一章,我們將討論如何將MyBatis與Spring框架集成。

 

 

《Java Persistence with MyBatis 3(中文版)》導航:

Java Persistence with MyBatis 3(中文版)

Java Persistence with MyBatis 3(中文版) 前言

Java Persistence with MyBatis 3(中文版) 第一章 MyBatis入門

Java Persistence with MyBatis 3(中文版) 第二章 引導MyBatis

Java Persistence with MyBatis 3(中文版) 第三章 使用XML配置SQL映射器

Java Persistence with MyBatis 3(中文版) 第四章 使用注解配置SQL映射器

Java Persistence with MyBatis 3(中文版) 第五章 與Spring集成 


 

----------------------------------------------------------------------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM