Java Web編程技術 課件 第16章注解配置映射器_第1頁
Java Web編程技術 課件 第16章注解配置映射器_第2頁
Java Web編程技術 課件 第16章注解配置映射器_第3頁
Java Web編程技術 課件 第16章注解配置映射器_第4頁
Java Web編程技術 課件 第16章注解配置映射器_第5頁
已閱讀5頁,還剩34頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

JavaWeb編程技術

本章介紹常用的映射器注解,其中包括@Insert、@Update、@Delete、@Select、@ResultMap以及@SelectProvider、@InsertProvider、@UpdatetProvider、@DeleteProvider等提供器注解等。MyBatis映射器注解MyBatis常用映射器注解的使用SQL語句構建器的使用第16章注解配置映射器在MyBatis映射文件中不但可以構建固定的SQL語句,還可使用動態SQL語句,它通過一些子元素實現。還可以在MyBatis映射器接口中使用注解定義SQL語句,從而不需要映射文件。在Mapper接口上使用注解從MyBatis3開始增加了Java注解配置映射SQL語句,也就是在Mapper接口中為操作方法添加注解來實現語句映射,從而不需要在映射文件中配置SQL語句。提示:在Mapper接口中使用注解具有一定的局限,其表達能力及靈活性較差,有些復雜的映射不能用注解實現,還必須用映射文件定義。MyBatis注解定義在org.apache.ibatis.annotations包中,常用的注解如表16-1所示。16.1在Mapper接口上使用注解16.1注解說明@Insert@Delete@Update@Select映射SQL的INSERT、DELETE、UPDATE和SELECT語句,它們帶一個value屬性,用于指定一個字符串或數組,表示需要執行的SQL語句@Results@Result@Results注解指定查詢結果映射,主要完成映射文件的<resultMap>的功能。@Result注解用于指定單個的屬性和字段的映射,它的屬性包括id、column、property、javaType、jdbcType、one和many等@Options提供配置選項的附加值,它們通常在映射語句上作為附加功能配置出現@SelectKey使用@SelectKey注解來為任意SQL語句來指定主鍵值,作為主鍵列的值@One@Many@One指定單屬性值映射。必須指定select屬性,表示已映射的SQL語句的完全限定名。@Many指定集合屬性值映射。必須指定select屬性,表示已映射的SQL語句的完全限定名在Mapper接口上使用注解16.1@Param當映射器方法有多個參數時,可使用該注解為映射器方法的每個參數取一個名字。否則,多個參數將以它們的位置順序命名,如#{param1}、{param2}等。使用@Param(“person”),參數被命名為#{person}@InsertProvider@DeleteProvider@UpdateProvider@SelectProvider這些注解用于創建動態SQL。使用這些注解需要指定一個類名和一個返回SQL對象的方法。運行時,MyBatis將實例化類,然后執行方法指定的SQL語句@ConstructorArgs@Arg收集一組結果傳遞給結果對象的構造方法。屬性value的值是Arg注解數組。Arg注解指定構造方法的一個參數@Insert插入語句16.1.1使用@Insert注解定義一個INSERT語句映射:packagecom.boda.mapper;publicinterfaceStudentMapper{@Insert("INSERTINTOstudents(stud_id,name,gender,birthday,phone)VALUES(#{studId},#{name},#{gender},#{birthday},#{phone})")intinsertStudent(Studentstudent);}@Insert插入語句16.1.1主鍵列值可以自動生成。可以使用@Options注解的userGeneratedKeys和keyProperty屬性讓數據庫產生auto_increment(自增長)列的值,然后將生成的值設置到輸入參數對象的屬性中。@Insert("INSERTINTOstudents(name,gender,birthday,phone)VALUES(#{name},#{gender},#{birthday},#{phone})")@Options(useGeneratedKeys=true,keyProperty="studId")intinsertStudent(Studentstudent);@Insert插入語句16.1.1注意,使用注解的Mapper映射器接口不需要使用映射文件,但也需要在配置文件中使用<mappers>元素注冊映射器類,如下所示。<mappers><mapperclass="com.boda.mapper.StudentMapper"/></mappers>@Update更新語句16.1.2使用@Update注解來定義一個UPDATE映射語句,如下所示:@Update的updateStudent()方法將會返回執行UPDATE語句后影響的行數。@Update("UPDATEstudentsSETname=#{name},gender=#{gender},birthday=#{birthday},phone=#{phone}WHEREstud_id=#{studId}")intupdateStudent(Studentstudent);StudentMappermapper=sqlSession.getMapper(StudentMapper.class);intnoOfRowsUpdated=mapper.updateStudent(student);@Delete刪除語句16.1.3使用@Delete注解來定義一個DELETE映射語句,如下所示:@Delete的deleteStudent()方法將會返回執行DELETE語句后影響的行數。@Delete("DELETEFROMstudentsWHEREstud_id=#{studId}")intdeleteStudent(intstudId);@Select查詢語句16.1.4使用@Select注解定義一個SELECT映射語句。下面代碼使用注解配置一個簡單的SELECT查詢。為了將列名與Student類屬性名匹配,這里為stud_id提供了一個別名studId。如果查詢返回多行,將拋出TooManyResultsException異常。publicinterfaceStudentMapper{@Select("SELECTstud_idASstudId,name,gender,birthday,phoneFROMstudentsWHEREstud_id=#{studId}")StudentfindStudentById(IntegerstudId);}結果與關聯映射使用@Results注解映射到到JavaBean屬性,用@One注解實現一對一映射,使用@Many注解實現一對多映射。16.2@ResultMap結果映射16.2.1在@Select注解的SELECT語句中可以使用別名將查詢結果列名映射到JavaBean屬性名。也可以使用@Results注解直接將列名映射到到JavaBean屬性名。清單16.1給出了兩個語句的映射。@Select("SELECT*FROMstudents")@Results({@Result(id=true,column="stud_id",property="studId"),@Result(column="name",property="name"),@Result(column="gender",property="gender"),@Result(column="birthday",property="birthday"),@Result(column="phone",property="phone"),@Result(column="addr_id",property="address.addrId")})List<Student>findAllStudents();

@Select("SELECT*FROMstudentsWHEREstud_id=#{studId}")@Results({@Result(id=true,column="stud_id",property="studId"),@Result(column="name",property="name"),@Result(column="gender",property="gender"),@Result(column="birthday",property="birthday"),@Result(column="phone",property="phone"),@Result(column="addr_id",property="address.addrId")})StudentfindStudentById(intstudId);@ResultMap結果映射16.2.1如果要復用內容相同的@Results配置,我們可以在映射文件中配置一個<resultMap>元素,然后使用@ResultMap注解引用這個resultMap。例如,在StudentMapper.xml中定義一個id為studentResult的<resultMap>。<resultMapid="studentResult"type="com.boda.domain.Student"><idproperty="studId"column="stud_id"/><resultproperty="name"column="name"/><resultproperty="gender"column="gender"/><resultproperty="birthday"column="birthday"/><resultproperty="phone"column="phone"/></resultMap>@ResultMap結果映射16.2.1然后,在StudentMapper.java中,使用@ResultMap注解引用resultMap屬性studentResult。如下所示。publicinterfaceStudentMapper{@Select("SELECT*FROMstudents")@ResultMap("com.boda.mapper.StudentMapper.studentResult")List<Student>findAllStudents();@Select("SELECT*FROMstudentsWHEREstud_id=#{studId}")@ResultMap("com.boda.mapper.StudentMapper.studentResult")StudentfindStudentById(intstudId);}@One一對一映射16.2.2MyBatis提供了@One注解來使用嵌套select(Nested-Select)語句加載一對一關聯查詢數據。下面來看如何使用@One注解獲取學生及其地址信息。清單16.2StudentMapper.javapublic

interface

StudentMapper

{

@Select("SELECT

*

FROM

address

WHERE

addr_id=#{addrId}")

@Results({@Result(id=true,column="addr_id",property="addrId"),@Result(column="city",property="city"),@Result(column="street",property="street"),@Result(column="zipcode",property="zipcode")})

publicAddress

selectAddressById(int

addrId);

@Select("SELECT

*

FROM

studentsWHERE

stud_id=#{studId}

")

@Results(

{

@Result(id

=

true,

column

=

"stud_id",

property

=

"studId"),

@Result(column

=

"name",

property

=

"name"),

@Result(column

=

"gender",

property

=

"gender"),

@Result(column

=

"birthday",

property

=

"birthday"),

@Result(column

=

"phone",

property

=

"phone"),

@Result(property

=

"address",

column

=

"addr_id",

one

=

@One(select

=

"com.boda.mapper.StudentMapper.selectAddressById"))

})

public

Student

selectStudentById(int

studId);}@Many一對一映射16.2.3MyBatis提供了@Many注解,用來使用嵌套Select語句加載一對多關聯查詢。現在讓我們看一下如何使用@Many注解獲取一名教師及其講授課程的信息。清單16.3TutorMapper.javapublicinterfaceTutorMapper{@Select("SELECT*FROMcoursesWHEREtutor_id=#{tutorId}")@Results({@Result(id=true,column="course_id",property="courseId"),@Result(column="name",property="name"),@Result(column="start_date",property="startDate"),@Result(column="end_date",property="endDate")})List<Course>findCoursesByTutorId(inttutorId);@Select("SELECTtutor_id,nameastutor_name,title,emailFROMtutorsWHEREtutor_id=#{tutorId}")@Results({@Result(id=true,column="tutor_id",property="tutorId"),@Result(column="tutor_name",property="name"),@Result(column="title",property="title"),@Result(column="email",property="email"),@Result(property="courses",column="tutor_id",many=@Many(select="com.boda.mapper.TutorMapper.findCoursesByTutorId"))})TutorfindTutorById(inttutorId);}@Many一對一映射16.2.3下面是測試代碼。SqlSessionsession=MyBatisUtil.getSession();TutorMappermapper=session.getMapper(TutorMapper.class);Tutortutor=mapper.findTutorById(2);System.out.println(tutor);System.out.println(tutor.getCourses());動態構建SQLMyBatis提供了@SelectProvider、@InsertProvider、,@UpdateProvider和@DeleteProvider幾個注解,來動態構建SQL語句,然后讓MyBatis執行這些SQL語句。以上4個注解都包含type屬性和method屬性。type屬性指定一個類名,method屬性指定該類的一個方法,該方法用來提供需要執行的SQL語句。這里的SQL語句需要通過SQL類的有關方法構建,SQL類屬于org.apache.ibatis.jdbc包。SQL類的常用方法如表16-2所示。16.3動態構建SQL16.3方法名說明TSELECT(Stirng)TSELECT(String…)開始或追加到一個SELECT語句,參數是逗號分隔的列名或列別名。該方法可多次調用TFROM(String)TFROM(String…)開始或追加一個FROM子句。參數將被追加到FROM子句上。參數通常是表名或表別名。該方法可多次調用TJOIN(String)TINNER_JOIN(String)TLEFT_OUTER_JOIN(String)TRIGHT_OUTER_JOIN(String)添加一個適當類型的JOIN子句。參數可以指定連接的表名和條件TWHERE(String)TWHERE(String…)添加一個WHERE條件子句,條件通過AND連接。如果是或運算,使用OR()方法連接TOR()TAND()分離當前的WHERE子句,OR()方法表示或運算,AND()方法表示與運算動態構建SQL16.3TGROUPBY(String)追加一個新的GROUPBY子句元素THAVING(Stringconditions)追加一個HAVING子句條件TORDERBY(String)追加一個新的ORDERBY子句元素TINSERT_INTO(String)開始一個INSERT語句并指定要插入的表。后跟一個或多個VALUES()、INTO_COLUMNS()或INTO_VALUES()調用TVALUES(String,String)追加到INSERT語句,第一個參數是插入的列,第二個參數是插入的值TDELETE_FROM(String)開始一個DELETE語句,需指定刪除記錄的表。它通常后跟一個WHERE語句TUPDATE(String)開始一個UPDATE語句,需指定要更新的表。它通常后跟一個或多個SET()調用,通常還有一個WHERE()調用TSET(String)向UPDATE語句追加一個SET子句列表TINTO_COLUMNS(String…)向INSERT語句中添加列短語,它通常與INTO_VALUES()一起調用TINTO_VALUES(String…)向INSERT語句添加VALUES短語,它通常與INTO_COLUMNS()一起調用@SelectProvider動態查詢16.3.1

@SelectProvider注解用來創建動態的SELECT語句。下面的StudentSqlProvider.java類是一個動態SQL提供器類,其中的findStudentById()方法返回SQL語句,如下所示。清單16.4StudentSqlProvider.javapublic

class

StudentSqlProvider{

public

String

findStudentById(){

return

new

SQL(){{

SELECT("stud_idasstudId,name,gender,birthday,phone");

FROM("students");

WHERE("stud_id=#{studId}");

}}.toString();

}}@SelectProvider動態查詢16.3.1在映射器StudentMapper.java接口中創建一個映射語句,代碼如清單16.5所示:清單16.5StudentMapper.javaimportorg.apache.ibatis.annotations.SelectProvider;importcom.boda.domain.Student;importvider.StudentSqlProvider;public

interface

StudentMapper{@SelectProvider(type=StudentSqlProvider.class,

method="findStudentById")Student

findStudentById(int

id);}@SelectProvider動態查詢16.3.1使用下面代碼測試使用注解的Mapper對象。SqlSessionsession=MyBatisUtil.getSession();StudentMappermapper=session.getMapper(StudentMapper.class);StudentStudent=mapper.findStudentById(20221002);if(student!=null){System.out.println(student);}@SelectProvider動態查詢16.3.1由StudentSqlProvider提供的動態SQL語句也可以帶多個參數,參數通常使用Map對象提供。例如,下面方法帶一個Map參數。public

String

findWithParam(Map<String,Object>param){

return

new

SQL(){{

SELECT("*");

FROM("students");

if(param.get("studId")

!=null){WHERE("stud_id=#{studId}");}if(param.get("name")

!=null){WHERE("name=#{name}");}if(param.get("gender")

!=null){WHERE("gender=#{gender}");}@SelectProvider動態查詢16.3.1在映射器Mapper接口中,定義下面findWithParam()方法使用該SQL語句。@SelectProvider(type=StudentDynaSqlProvider.class,

method="findWithParam")Student

findWithParam(Map<String,Object>param);@InsertProvider動態插入16.3.2在StudentSqlProvider.java類中定義insertStudent()方法,如下所示:public

String

insertStudent(final

Student

student){

return

new

SQL(){{

INSERT_INTO("students");

if(student.getStudId()!=0){VALUES("stud_id","#{studId}");}

if

(student.getName()

!=

null){

VALUES("name",

"#{name}");

}

if

(student.getGender()

!=

null){

VALUES("gender",

"#{gender}");

}

if

(student.getBirthday()

!=

null){

VALUES("birthday",

"#{birthday}");

}

if

(student.getPhone()

!=

""

){

VALUES("phone",

"#{phone}");

}

}}.toString();

}

@InsertProvider動態插入16.3.2使用@InsertProvider注解創建動態的INSERT語句,如下所示:@InsertProvider(type=StudentSqlProvider.class,

method="insertStudent")@Options(useGeneratedKeys=true,keyProperty="stud_id")publicintinsertStudent(Studentstudent);@InsertProvider動態插入16.3.2insertStudent()方法會根據參數student對象的屬性動態構建INSERT語句。使用下面代碼測試向students表中插入一條記錄。SqlSessionsession=MyBatisUtil.getSession();StudentMappermapper=session.getMapper(StudentMapper.class);Studentstudent=newStudent();student.setStudId(20240001);student.setName("王小波");student.setGender("男");student.setBirthday(LocalDate.of(2022,Month.OCTOBER,20));student.setPhone("1354168899");intn=mapper.insertStudent(student);System.out.println("成功插入"+n+"行,id值為

:"+student.getStudId());@DeleteProvider動態刪除16.3.3在StudentSqlProvider.java類中定義deleteStudent()方法,如下所示:publicStringdeleteStudent(finalMap<String,Object>param){ returnnewSQL(){{ DELETE_FROM("students"); if(param.get("name")!=null){ WHERE("name=#{name}"); }WHERE("stud_id=#{studId}"); }}.toString();}@DeleteProvider動態刪除16.3.3使用@DeleteProvider注解創建動態的DELETE語句,在StudentMapper接口中定義下面的方法:@DeleteProvider(type=StudentSqlProvider.class,

method="deleteStudent")publicintdeleteStudent(Map<String,Object>param);

@DeleteProvider動態刪除16.3.3使用下面代碼測試從students表中刪除一條記錄。SqlSessionsession=MyBatisUtil.getSession();StudentMappermapper=session.getMapper(StudentMapper.class);Map<String,Object>param=newHashMap<>();param.put("studId",102)

;//param.put("name","王小波");intn=mapper.deleteStudent(param);System.out.println("成功刪除"+n+"行記錄。");@UpdateProvider動態更新16.3.4在Stud

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論