《Java Web開發(fā)從入門到實戰(zhàn)(IntelliJ IDEA版·微課視頻版)》 課件 第15章 MyBatis與MyBatis-Plus_第1頁
《Java Web開發(fā)從入門到實戰(zhàn)(IntelliJ IDEA版·微課視頻版)》 課件 第15章 MyBatis與MyBatis-Plus_第2頁
《Java Web開發(fā)從入門到實戰(zhàn)(IntelliJ IDEA版·微課視頻版)》 課件 第15章 MyBatis與MyBatis-Plus_第3頁
《Java Web開發(fā)從入門到實戰(zhàn)(IntelliJ IDEA版·微課視頻版)》 課件 第15章 MyBatis與MyBatis-Plus_第4頁
《Java Web開發(fā)從入門到實戰(zhàn)(IntelliJ IDEA版·微課視頻版)》 課件 第15章 MyBatis與MyBatis-Plus_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第15章MyBatis與MyBatis-Plus學習目的與要求本章將重點介紹MyBatis與MyBatis-Plus的基礎(chǔ)知識,并詳細介紹SpringBoot如何整合MyBatis與MyBatis-Plus。通過本章的學習,掌握SpringBoot整合MyBatis與MyBatis-Plus的基本步驟?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

目錄15.1SpringBoot整合MyBatis15.2MyBatis基礎(chǔ)15.3MyBatis-Plus快速入門15.4MyBatis-Plus基礎(chǔ)《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.1SpringBoot整合MyBatisMyBatis本是apachesoftwarefoundation的一個開源項目iBatis,2010年這個項目由apachesoftwarefoundation遷移到googlecode,并改名為MyBatis。MyBatis是一個基于Java的持久層框架。MyBatis提供的持久層框架包括SQLMaps和DataAccessObjects(DAO),它消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis使用簡單的XML或注解用于配置和原始映射,將接口和Java的POJOs(PlainOldJavaObjects,普通的Java對象)映射成數(shù)據(jù)庫中的記錄?!纠?5-1】在SpringBoot應(yīng)用中使用MyBatis框架操作數(shù)據(jù)庫(基于XML的映射配置)。《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

1.創(chuàng)建SpringBootWeb應(yīng)用在創(chuàng)建SpringBootWeb應(yīng)用ch15_1時,選擇MyBatisFramework(mybatis-spring-boot-starter)依賴,如圖15.1所示。在該應(yīng)用中,操作的數(shù)據(jù)庫是springtest,操作的數(shù)據(jù)表是user表?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

2.修改pom.xml文件在pom.xml文件中添加MySQL連接器依賴,具體如下:<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version></dependency>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

3.設(shè)置Web應(yīng)用ch15_1的上下文路徑及數(shù)據(jù)源配置信息server.servlet.context-path=/ch15_1spring.datasource.url=jdbc:mysql://localhost:3306/springtest?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8spring.datasource.username=rootspring.datasource.password=rootspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#設(shè)置包別名(在Mapper映射文件中直接使用實體類名)mybatis.type-aliases-package=com.ch.ch15_1.entity#告訴系統(tǒng)在哪里去找mapper.xml文件(映射文件)mybatis.mapperLocations=classpath:mappers/*.xml#在控制臺輸出SQL語句日志.ch.ch15_1.repository=debug#讓控制器輸出的JSON字符串格式更美觀spring.jackson.serialization.indent-output=true《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

4.創(chuàng)建實體類@DatapublicclassMyUser{privateIntegeruid;//與數(shù)據(jù)表中的字段名相同

privateStringuname;privateStringusex;}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

5.創(chuàng)建數(shù)據(jù)訪問接口創(chuàng)建名為com.ch.ch15_1.repository的包,并在該包中創(chuàng)建MyUserRepository接口。/*@Repository可有可無,但有時提示依賴注入找不到(不影響運行),加上后可以消去依賴注入的報錯信息。這里不再需要@Mapper,是因為在啟動類中使用@MapperScan注解,將數(shù)據(jù)訪問層的接口都注解為Mapper接口的實現(xiàn)類@Mapper與@MapperScan兩者用其一即可*/@RepositorypublicinterfaceMyUserRepository{ List<MyUser>findAll();}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.創(chuàng)建Mapper映射文件在src/main/resources目錄下,創(chuàng)建名為mappers的包,并在該包中創(chuàng)建SQL映射文件MyUserMapper.xml。<mappernamespace="com.ch.ch15_1.repository.MyUserRepository"> <selectid="findAll"resultType="MyUser"> select*fromuser </select></mapper>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.創(chuàng)建業(yè)務(wù)層創(chuàng)建名為com.ch.ch15_1.service的包,并在該包中創(chuàng)建MyUserService接口和MyUserServiceImpl實現(xiàn)類?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

8.創(chuàng)建控制器類MyUserController創(chuàng)建名為com.ch.ch15_1.controller的包,并在該包中創(chuàng)建控制器類MyUserController。@RestControllerpublicclassMyUserController{ @Autowired privateMyUserServicemyUserService; @GetMapping("/findAll") publicList<MyUser>findAll(){ returnmyUserService.findAll(); }}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

9.在應(yīng)用程序的主類中掃描Mapper接口在應(yīng)用程序的Ch151Application主類中,使用@MapperScan注解掃描MyBatis的Mapper接口。@SpringBootApplication//配置掃描MyBatis接口的包路徑@MapperScan(basePackages={"com.ch.ch15_1.repository"})publicclassCh151Application{ publicstaticvoidmain(String[]args){

SpringApplication.run(Ch151Application.class,args); }}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

10.運行首先,運行Ch151Application主類。然后,訪問“http://localhost:8080/ch15_1/findAll”。《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

目錄15.1SpringBoot整合MyBatis15.2MyBatis基礎(chǔ)15.3MyBatis-Plus快速入門15.4MyBatis-Plus基礎(chǔ)《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.2MyBatis基礎(chǔ)映射器是MyBatis最復雜且最重要的組件,由一個接口加一個XML文件(SQL映射文件)組成。MyBatis的映射器也可以使用注解完成,但在實際應(yīng)用中使用不多,原因主要來自這幾個方面:其一,面對復雜的SQL會顯得無力;其二,注解的可讀性較差;其三,注解丟失了XML上下文相互引用的功能。元素名稱描

述備注select查詢語句,最常用、最復雜的元素之一可以自定義參數(shù),返回結(jié)果集等insert插入語句執(zhí)行后返回一個整數(shù),代表插入的行數(shù)update更新語句執(zhí)行后返回一個整數(shù),代表更新的行數(shù)delete刪除語句執(zhí)行后返回一個整數(shù),代表刪除的行數(shù)sql定義一部分SQL,在多個位置被引用例如,一張表列名,一次定義,可以在多個SQL語句中使用resultMap用來描述從數(shù)據(jù)庫結(jié)果集中來加載對象,是最復雜、最強大的元素之一提供映射規(guī)則《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.2.1<select>元素在SQL映射文件中,<select>元素用于映射SQL的select語句,其示例代碼如下。<!--根據(jù)uid查詢一個用戶信息--><selectid="selectUserById"parameterType="Integer"resultType="MyUser">

select*fromuserwhereuid=#{uid}</select>上述示例代碼中,id的值是唯一標識符(對應(yīng)Mapper接口的某個方法),它接收一個Integer類型的參數(shù),返回一個MyUser類型的對象,結(jié)果集自動映射到MyUser的屬性。但需要注意的是,MyUser的屬性名稱一定與查詢結(jié)果的列名相同?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.2.1<select>元素屬性名稱描

述id它和Mapper的命名空間組合起來使用(對應(yīng)Mapper接口的某個方法),是唯一標識符,供MyBatis調(diào)用parameterType表示傳入SQL語句的參數(shù)類型的全限定名或別名。是個可選屬性,MyBatis能推斷出具體傳入語句的參數(shù)。resultTypeSQL語句執(zhí)行后返回的類型(全限定名或者別名)。如果是集合類型,返回的是集合元素的類型。返回時可以使用resultType或resultMap之一resultMap它是映射集的引用,與<resultMap>元素一起使用。返回時可以使用resultType或resultMap之一flushCache它的作用是在調(diào)用SQL語句后,是否要求MyBatis清空之前查詢本地緩存和二級緩存。默認值為false。如果設(shè)置為true,則任何時候只要SQL語句被調(diào)用,都將清空本地緩存和二級緩存useCache啟動二級緩存的開關(guān)。默認值為true,表示將查詢結(jié)果存入二級緩存中timeout用于設(shè)置超時參數(shù),單位是秒。超時將拋出異常。fetchSize獲取記錄的總條數(shù)設(shè)定statementType告訴MyBatis使用哪個JDBC的Statement工作,取值為STATEMENT(Statement)、PREPARED(PreparedStatement)、CALLABLE(CallableStatement),默認值為PREPAREDresultSetType這是針對JDBC的ResultSet接口而言,其值可設(shè)置為FORWARD_ONLY(只允許向前訪問)、SCROLL_SENSITIVE(雙向滾動,但不及時更新)、SCROLL_INSENSITIVE(雙向滾動,及時更新)《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

1.使用Map接口傳遞參數(shù)在MyBatis中,允許Map接口通過鍵值對傳遞多個參數(shù)。假設(shè)數(shù)據(jù)操作接口中有個實現(xiàn)查詢陳姓男性用戶信息功能的方法:List<MyUser>testMapSelect(Map<String,Object>param);此時,傳遞給MyBatis映射器的是一個Map對象,使用該Map對象在SQL中設(shè)置對應(yīng)的參數(shù),對應(yīng)SQL映射文件代碼如下:<!--查詢陳姓男性用戶信息--><selectid="testMapSelect"resultType="MyUser"parameterType="map">

select*fromuser

whereunamelikeconcat('%',#{u_name},'%')

andusex=#{u_sex}</select>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

【例15-2】在15.1節(jié)【例15-1】的基礎(chǔ)上實現(xiàn)Map接口傳遞參數(shù)。(1)添加接口方法在SpringBootWeb應(yīng)用ch15_1的MyUserRepository接口中添加接口方法testMapSelect(Map<String,Object>param),實現(xiàn)查詢陳姓男性用戶信息。(2)添加SQL映射在應(yīng)用ch15_1的SQL映射文件MyUserMapper.xml中添加SQL映射(見上述),實現(xiàn)查詢陳姓男性用戶信息。(3)添加請求處理方法在應(yīng)用ch15_1的MyUserController控制器類中,添加測試方法testMapSelect?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

2.使用JavaBean傳遞參數(shù)在MyBatis中,需要將多個參數(shù)傳遞給映射器時,可以將它們封裝在一個JavaBean中?!纠?5-3】在【例15-2】的基礎(chǔ)上實現(xiàn)JavaBean傳遞參數(shù)。(1)添加接口方法在SpringBootWeb應(yīng)用ch15_1的MyUserRepository接口中添加接口方法selectAllUserByJavaBean(),在該方法中使用MyUser類的對象將參數(shù)信息封裝。接口方法selectAllUserByJavaBean()的定義如下。List<MyUser>selectAllUserByJavaBean(MyUseruser);《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

【例15-3】在【例15-2】的基礎(chǔ)上實現(xiàn)JavaBean傳遞參數(shù)。(2)添加SQL映射在應(yīng)用ch15_1的SQL映射文件MyUserMapper.xml中,添加接口方法對應(yīng)的SQL映射,具體代碼如下。<!--通過JavaBean傳遞參數(shù)查詢陳姓男性用戶信息,#{uname}的uname為參數(shù)MyUser的屬性--><selectid="selectAllUserByJavaBean"resultType="MyUser"parameterType="MyUser">

select*fromuser

whereunamelikeconcat('%',#{uname},'%')

andusex=#{usex}</select>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

【例15-3】在【例15-2】的基礎(chǔ)上實現(xiàn)JavaBean傳遞參數(shù)(3)添加請求處理方法在應(yīng)用ch15_1的MyUserController控制器類中,添加請求處理方法selectAllUserByJavaBean(),具體代碼如下。@GetMapping("/selectAllUserByJavaBean")

publicList<MyUser>selectAllUserByJavaBean(){

//通過MyUser封裝參數(shù),查詢所有陳姓男性用戶。

MyUsermu=newMyUser();

mu.setUname("陳");

mu.setUsex("男");

returnmyUserRepository.selectAllUserByJavaBean(mu);}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

3.使用@Param注解傳遞參數(shù)不管是Map傳參,還是JavaBean傳參,它們都是將多個參數(shù)封裝在一個對象中,實際上傳遞的還是一個參數(shù)。而使用@Param注解可以將多個參數(shù)依次傳遞給MyBatis映射器。接口方法示例代碼如下。List<MyUser>selectAllUserByParam(@Param("puname")Stringuname,@Param("pusex")Stringusex);在上述示例代碼中,puname和pusex是傳遞給MyBatis映射器的參數(shù)名。接口方法selectAllUserByParam()對應(yīng)的SQL映射,具體代碼如下。<!--通過@Param注解傳遞參數(shù)查詢陳姓男性用戶信息,這里不需要定義參數(shù)類型--><selectid="selectAllUserByParam"resultType="MyUser">

select*fromuser

whereunamelikeconcat('%',#{puname},'%')

andusex=#{pusex}</select>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

4.使用POJO存儲結(jié)果集在前面的例子中,都是直接使用JavaBean(MyUser)存儲的結(jié)果集,這是因為MyUser的屬性名與查詢結(jié)果集的列名相同。如果查詢結(jié)果集的列名與JavaBean的屬性名不同,那么可以結(jié)合<resultMap>元素將JavaBean的屬性與查詢結(jié)果集的列名一一對應(yīng)。《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

4.使用POJO存儲結(jié)果集首先,創(chuàng)建一個名為MapUser的POJO(PlainOrdinaryJavaObject,普通的Java類)類:packagecom.ch.ch15_1.entity;importlombok.Data;@DatapublicclassMapUser{ privateIntegerm_uid; privateStringm_uname; privateStringm_usex; @Override publicStringtoString(){ return"User[uid="+m_uid+",uname="+m_uname+",usex="+m_usex+"]"; }}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

4.使用POJO存儲結(jié)果集然后,添加數(shù)據(jù)操作接口方法selectAllUserPOJO(),該方法的返回值類型是List<MapUser>:List<MapUser>selectAllUserPOJO();《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

4.使用POJO存儲結(jié)果集最后,在SQL映射文件中,首先使用<resultMap>元素將MapUser類的屬性與查詢結(jié)果列名一一對應(yīng)。然后添加接口方法selectAllUserPOJO()對應(yīng)的SQL映射:<!--使用自定義結(jié)果集類型--><resultMaptype="com.ch.ch15_1.entity.MapUser"id="myResult">

<!--property是MapUser類中的屬性-->

<!--column是查詢結(jié)果的列名,可以來自不同的表-->

<idproperty="m_uid"column="uid"/>

<resultproperty="m_uname"column="uname"/>

<resultproperty="m_usex"column="usex"/></resultMap><!--使用自定義結(jié)果集類型查詢所有用戶--><selectid="selectAllUserPOJO"resultMap="myResult">

select*fromuser</select>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

5.使用Map存儲結(jié)果集在MyBatis中,任何查詢結(jié)果都可以使用Map存儲,具體示例如下。首先,添加數(shù)據(jù)操作接口方法selectAllUserMap(),該方法的返回值類型是List<Map<String,Object>>:List<Map<String,Object>>selectAllUserMap();其次,在SQL映射文件中,添加接口方法selectAllUserMap()對應(yīng)的SQL映射:<!--使用Map存儲查詢結(jié)果,查詢結(jié)果的列名作為Map的key,列值為Map的value--><selectid="selectAllUserMap"resultType="map">

select*fromuser</select>最后,在控制器類中,添加請求處理方法selectAllUserMap():@GetMapping("/selectAllUserMap")

publicList<Map<String,Object>>selectAllUserMap(){

//使用Map存儲查詢結(jié)果

returnmyUserRepository.selectAllUserMap();

}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.2.2<insert>、<update>以及<delete>元素1.<insert>元素<insert>元素用于映射添加語句,MyBatis執(zhí)行完一條添加語句后,將返回一個整數(shù)表示其影響的行數(shù)。它的屬性與<select>元素的屬性大部分相同,在本節(jié)講解它的幾個特有屬性。keyProperty:添加時將自動生成的主鍵值回填給PO(PersistantObject)類的某個屬性,通常會設(shè)置為主鍵對應(yīng)的屬性。如果是聯(lián)合主鍵,可以在多個值之間用逗號隔開。keyColumn:設(shè)置第幾列是主鍵,當主鍵列不是表中的第一列時需要設(shè)置。如果是聯(lián)合主鍵時,可以在多個值之間用逗號隔開。useGeneratedKeys:該屬性將使MyBatis使用JDBC的getGeneratedKeys()方法獲取由數(shù)據(jù)庫內(nèi)部生產(chǎn)的主鍵,如MySQL、SQLServer等自動遞增的字段,其默認值為false?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

主鍵回填MySQL、SQLServer等數(shù)據(jù)庫的表格可以采用自動遞增的字段作為主鍵。有時可能需要使用這個剛剛產(chǎn)生的主鍵,用以關(guān)聯(lián)其它業(yè)務(wù)。因為本書采用的數(shù)據(jù)庫是MySQL數(shù)據(jù)庫,所以可以直接使用自動遞增主鍵回填的使用方法,具體步驟如下。首先,添加數(shù)據(jù)操作接口方法addUserBack(),該方法的返回值類型是int:intaddUserBack(MyUsermu);其次,在SQL映射文件中,添加接口方法addUserBack()對應(yīng)的SQL映射:<!--添加一個用戶,成功后將主鍵值回填給uid(po類的屬性)--><insertid="addUserBack"parameterType="MyUser"keyProperty="uid"useGeneratedKeys="true">

insertintouser(uname,usex)values(#{uname},#{usex})</insert>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

2.<update>與<delete>元素<update>和<delete>元素比較簡單,它們的屬性和<insert>元素的屬性基本一樣,執(zhí)行后也返回一個整數(shù),表示影響數(shù)據(jù)庫的記錄行數(shù)。SQL映射文件示例代碼如下。<!--修改一個用戶--><updateid="updateUser"parameterType="MyUser"> updateusersetuname=#{uname},usex=#{usex}whereuid=#{uid}</update><!--刪除一個用戶--><deleteid="deleteUser"parameterType="Integer"> deletefromuserwhereuid=#{uid}</delete>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.2.3動態(tài)SQL開發(fā)人員通常根據(jù)需求手動拼接SQL語句,這是一個極其麻煩的工作,而MyBatis提供了對SQL語句動態(tài)組裝的功能,恰能解決這一問題。MyBatis的動態(tài)SQL元素和使用JSTL或其它類似基于XML的文本處理器相似,常用元素有<if>、<choose>、<when>、<otherwise>、<trim>、<where>、<foreach>和<bind>等元素?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

1.<if>元素動態(tài)SQL通常要做的事情是有條件地包含where子句的一部分。所以在MyBatis中,<if>元素是最常用的元素。它類似于Java中的if語句,示例代碼如下:<!--使用if元素,根據(jù)條件動態(tài)查詢用戶信息--><selectid="selectAllUserByIf"resultType="MyUser"parameterType="MyUser">

select*fromuserwhere1=1

<iftest="uname!=nullanduname!=''">

andunamelikeconcat('%',#{uname},'%')

</if>

<iftest="usex!=nullandusex!=''">

andusex=#{usex}

</if></select>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

2.<choose>、<when>、<otherwise>元素有時不需要用到所有的條件語句,而只需從中擇其一二。針對這種情況,MyBatis提供了<choose>元素,它有點像Java中的switch語句,示例代碼如下:<!--使用choose、when、otherwise元素,根據(jù)條件動態(tài)查詢用戶信息--><selectid="selectUserByChoose"resultType="MyUser"parameterType="MyUser">

select*fromuserwhere1=1

<choose>

<whentest="uname!=nullanduname!=''">

andunamelikeconcat('%',#{uname},'%')

</when>

<whentest="usex!=nullandusex!=''">

andusex=#{usex}

</when>

<otherwise>

anduid>3

</otherwise>

</choose></select>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

3.<trim>元素<trim>元素的主要功能是可以在自己包含的內(nèi)容前加上某些前綴,也可以在其后加上某些后綴,與之對應(yīng)的屬性是prefix和suffix;可以把包含內(nèi)容的首部某些內(nèi)容覆蓋,即忽略,也可以把尾部的某些內(nèi)容覆蓋,對應(yīng)的屬性是prefixOverrides和suffixOverrides;正因為<trim>元素有這樣的功能,所以也可以非常簡單地利用<trim>來代替<where>元素的功能。示例代碼如下:<!--使用trim元素,根據(jù)條件動態(tài)查詢用戶信息--><selectid="selectUserByTrim"resultType="MyUser"parameterType="MyUser">

select*fromuser

<trimprefix="where"prefixOverrides="and|or">

<iftest="uname!=nullanduname!=''"> andunamelikeconcat('%',#{uname},'%') </if>

<iftest="usex!=nullandusex!=''"> andusex=#{usex} </if>

</trim></select>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

4.<where>元素<where>元素的作用是輸出一個where語句,優(yōu)點是不考慮<where>元素的條件輸出,MyBatis將智能處理。如果所有的條件都不滿足,那么MyBatis將會查出所有記錄,如果輸出是and開頭,MyBatis將把第一個and忽略,如果是or開頭的,MyBatis也將把它忽略;在<where>元素中不考慮空格的問題,MyBatis將智能加上。<!--使用where元素,根據(jù)條件動態(tài)查詢用戶信息--><selectid="selectUserByWhere"resultType="MyUser"parameterType="MyUser">

select*fromuser

<where>

<iftest="uname!=nullanduname!=''">

andunamelikeconcat('%',#{uname},'%')

</if>

<iftest="usex!=nullandusex!=''">

andusex=#{usex}

</if>

</where></select>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

5.<foreach>元素<foreach>元素主要用于構(gòu)建in條件,它可以在SQL語句中進行迭代一個集合。<foreach>元素的屬性主要有item,index,collection,open,separator,close。item表示集合中每一個元素進行迭代時的別名,index指定一個名字,用于表示在迭代過程中,每次迭代到的位置,open表示該語句以什么開始,separator表示在每次進行迭代之間以什么符號作為分隔符,close表示以什么結(jié)束。在使用<foreach>時,最關(guān)鍵的也是最容易出錯的是collection屬性,該屬性是必選的,但在不同情況下,該屬性的值是不一樣的,主要有以下3種情況:(1)如果傳入的是單參數(shù)且參數(shù)類型是一個List的時候,collection屬性值為list。(2)如果傳入的是單參數(shù)且參數(shù)類型是一個array數(shù)組的時候,collection的屬性值為array。(3)如果傳入的參數(shù)是多個時,需要把它們封裝成一個Map,當然單參數(shù)也可以封裝成Map。Map的key是參數(shù)名,所以collection屬性值是傳入的List或array對象在自己封裝的Map中的key?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

5.<foreach>元素<!--使用foreach元素,查詢用戶信息--><selectid="selectUserByForeach"resultType="MyUser"parameterType="List">

select*fromuserwhereuidin

<foreachitem="item"index="index"collection="list"

open="("separator=","close=")">

#{item}

</foreach></select>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.<bind>元素在模糊查詢時,如果使用“${}”拼接字符串,則無法防止SQL注入問題。如果使用字符串拼接函數(shù)或連接符號,但不同數(shù)據(jù)庫的拼接函數(shù)或連接符號不同,如MySQL的concat函數(shù)、Oracle的連接符號“||”。這樣,SQL映射文件就需要根據(jù)不同的數(shù)據(jù)庫提供不同的實現(xiàn),顯然是比較麻煩,且不利于代碼的移植。幸運的是,MyBatis提供了<bind>元素來解決這一問題。示例代碼如下:<!--使用bind元素進行模糊查詢--><selectid="selectUserByBind"resultType="MyUser"parameterType="MyUser">

<!--bind中uname是com.po.MyUser的屬性名-->

<bindname="paran_uname"value="'%'+uname+'%'"/>

select*fromuserwhereunamelike#{paran_uname}</select>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

目錄15.1SpringBoot整合MyBatis15.2MyBatis基礎(chǔ)15.3MyBatis-Plus快速入門15.4MyBatis-Plus基礎(chǔ)《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.3.1MyBatis-Plus簡介MyBatis-Plus是一個MyBatis的增強工具,在MyBatis的基礎(chǔ)上只做增強不做改變,為簡化開發(fā)、提高效率而生。MyBatis-Plus的特性,具體如下。(1)無侵入:只做增強不做改變,引入它不會對現(xiàn)有工程產(chǎn)生影響;(2)損耗?。簡蛹磿詣幼⑷牖綜URD,性能基本無損耗,直接面向?qū)ο蟛僮?;?)強大的CRUD操作:內(nèi)置通用Mapper、通用Service,僅僅通過少量配置即可實現(xiàn)單表大部分CRUD操作,更有強大的條件構(gòu)造器,滿足各類使用需求;(4)支持Lambda形式調(diào)用:通過Lambda表達式,方便編寫各類查詢條件,無需再擔心字段寫錯;(5)支持主鍵自動生成:支持多種主鍵策略,可自由配置,完美解決主鍵問題;(6)支持ActiveRecord模式:支持ActiveRecord形式調(diào)用,實體類只需繼承Model類即可進行強大的CRUD操作;(7)支持自定義全局通用操作:支持全局通用方法注入;(8)內(nèi)置代碼生成器:采用代碼或者Maven插件可快速生成Mapper、Model、Service、Controller層代碼,支持模板引擎,提供更多自定義配置;(9)內(nèi)置分頁插件:基于MyBatis物理分頁,開發(fā)者無需關(guān)心具體操作,配置好插件之后,實現(xiàn)分頁等同于普通List遍歷?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.3.2SpringBoot整合MyBatis-Plus在SpringBoot應(yīng)用中,添加mybatis-plus-boot-starter依賴即可整合MyBatis-Plus,具體如下:<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.x.y.z</version></dependency>在SpringBoot應(yīng)用中,通過mybatis-plus-boot-starter引入MyBatis-Plus依賴后,將自動引入MyBatis、MyBatis-Spring等相關(guān)依賴,所以,不再需要引入這些依賴,避免因版本差異導致問題?!纠?5-4】在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫1.創(chuàng)建SpringBootWeb應(yīng)用創(chuàng)建基于Lombok依賴的SpringBootWeb應(yīng)用ch15_2。在該應(yīng)用中,操作的數(shù)據(jù)庫與15.1節(jié)一樣,都是springtest,操作的數(shù)據(jù)表是user表。2.修改pom.xml文件在pom.xml文件中添加MySQL連接器與MyBatis-Plus依賴<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version></version></dependency>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫3.設(shè)置Web應(yīng)用ch15_2的上下文路徑及數(shù)據(jù)源配置信息server.servlet.context-path=/ch15_2spring.datasource.url=jdbc:mysql://localhost:3306/springtest?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8spring.datasource.username=rootspring.datasource.password=rootspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#設(shè)置包別名(在Mapper映射文件中直接使用實體類名)mybatis-plus.type-aliases-package=com.ch.ch15_2.entity#告訴系統(tǒng)在哪里去找mapper.xml文件(映射文件)mybatis-plus.mapper-locations=classpath:mappers/*.xml#在控制臺輸出SQL語句日志.ch.ch15_2.mapper=debug#讓控制器輸出的JSON字符串格式更美觀spring.jackson.serialization.indent-output=true《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫4.創(chuàng)建實體類創(chuàng)建名為com.ch.ch15_2.entity的包,并在該包中創(chuàng)建MyUser實體類。@Data@TableName("user")publicclassMyUser{privateIntegeruid;//與數(shù)據(jù)表中的字段名相同

privateStringuname;privateStringusex;}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫5.創(chuàng)建數(shù)據(jù)訪問接口創(chuàng)建名為com.ch.ch15_2.mapper的包,并在該包中創(chuàng)建UserMapper接口。UserMapper接口通過繼承BaseMapper<MyUser>接口(15.4節(jié)將講解該接口),對實體類MyUser對應(yīng)的數(shù)據(jù)表user進行CRUD操作。@RepositorypublicinterfaceUserMapperextendsBaseMapper<MyUser>{List<MyUser>myFindAll();}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫6.創(chuàng)建Mapper映射文件在src/main/resources目錄下,創(chuàng)建名為mappers的包,并在該包中創(chuàng)建SQL映射文件MyUserMapper.xml(當Mapper接口中沒有自定義方法時,可以不創(chuàng)建此文件)<mappernamespace="com.ch.ch15_2.mapper.UserMapper"> <selectid="myFindAll"resultType="MyUser"> select*fromuser </select></mapper>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫15.創(chuàng)建控制器類MyUserController創(chuàng)建名為com.ch.ch15_2.controller的包,并在該包中創(chuàng)建控制器類MyUserController。

@AutowiredprivateUserMapperuserMapper;@GetMapping("/findAll")publicList<MyUser>findAll(){ //通過BaseMapper接口方法selectList查詢

returnuserMapper.selectList(null);}@GetMapping("/myFindAll")publicList<MyUser>myFindAll(){

//通過自定義方法myFindAll查詢

returnuserMapper.myFindAll();

}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫8.在應(yīng)用程序的主類中掃描Mapper接口在應(yīng)用程序的Ch152Application主類中,使用@MapperScan注解掃描MyBatis的Mapper接口。核心代碼如下:@SpringBootApplication@MapperScan(basePackages={"com.ch.ch15_2.mapper"})publicclassCh152Application{ publicstaticvoidmain(String[]args){

SpringApplication.run(Ch152Application.class,args); }}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫9.運行首先,運行Ch152Application主類。然后,訪問“http://localhost:8080/ch15_2/findAll”和“http://localhost:8080/ch15_2/myFindAll”進行測試?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

目錄15.1SpringBoot整合MyBatis15.2MyBatis基礎(chǔ)15.3MyBatis-Plus快速入門15.4MyBatis-Plus基礎(chǔ)《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.4.1MyBatis-Plus注解1.@TableName當實體類的類名與要操作表的表名不一致時,需要使用@TableName注解標識實體類對應(yīng)的表。示例代碼如下:@TableName("user")publicclassMyUser{}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.4.1MyBatis-Plus注解2.@TableId@TableId注解為主鍵注解,指定實體類中某屬性為主鍵字段。示例代碼如下:@TableName("user")publicclassMyUser{

@TableId(type=IdType.AUTO)privateIntegeruid;}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.4.1MyBatis-Plus注解3.@TableField@TableField注解為非主鍵字段注解。若實體類中的屬性使用的是駝峰命名風格,而表中的字段使用的是下劃線命名風格,例如實體類屬性userName,表中字段user_name,此時MyBatis-Plus會自動將下劃線命名風格轉(zhuǎn)化為駝峰命名風格。若實體類中的屬性和表中的字段不滿足上述條件,例如實體類屬性為name,表中字段為username,此時需要在實體類屬性上使用@TableField("username")設(shè)置屬性所對應(yīng)的字段名?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.4.1MyBatis-Plus注解4.@Version樂觀鎖注解,@Version標記在字段上。樂觀鎖:當要更新一條記錄時,希望這條記錄沒有被別人更新。樂觀鎖實現(xiàn)方式:取出記錄時,獲取當前version;更新時,帶上這個version;執(zhí)行更新時,setversion=newVersionwhereversion=oldVersion,如果version不對,則更新失敗?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.4.1MyBatis-Plus注解5.@EnumValue普通枚舉類注解,注解在枚舉字段上。示例代碼如下:@Getter//類中屬性都生成getter方法publicenumSexEnum{MALE(1,"男"),FEMALE(2,"女");@EnumValue//標記數(shù)據(jù)庫存的值是sexprivateIntegersex;privateStringsexName;SexEnum(Integersex,StringsexName){this.sex=sex;this.sexName=sexName;}}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.4.1MyBatis-Plus注解6.@TableLogic注解@TableLogic的使用,代表著實體類中的屬性是邏輯刪除的屬性。邏輯刪除,即假刪除,將對應(yīng)數(shù)據(jù)中代表是否被刪除字段的狀態(tài)修改為“被刪除狀態(tài)”,之后在數(shù)據(jù)庫中仍舊能看到此條數(shù)據(jù)記錄。《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

15.4.2CRUD接口MyBatis-Plus利用MyBatis接口編程實現(xiàn)機制,默認提供了一系列增刪改查基礎(chǔ)方法,并且開發(fā)人員對于這些基礎(chǔ)操作方法,不需要編寫SQL語句即可進行處理操作。1.MapperCRUD接口MyBatis-Plus內(nèi)置了可以實現(xiàn)對單表CRUD的BaseMapper<T>接口,泛型T為任意實體對象。BaseMapper<T>接口是針對Dao層的CRUD方法進行封裝。自定義數(shù)據(jù)訪問接口時,繼承BaseMapper<T>接口,即可使用BaseMapper<T>接口方法進行單表的CRUD,如:publicinterfaceUserMapperextendsBaseMapper<MyUser>{}?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

1.MapperCRUD接口//插入一條記錄intinsert(Tentity);//根據(jù)entity條件,刪除記錄intdelete(@Param(Constants.WRAPPER)Wrapper<T>wrapper);//刪除(根據(jù)ID批量刪除)intdeleteBatchIds(@Param(Constants.COLLECTION)Collection<?extendsSerializable>idList);//根據(jù)ID刪除intdeleteById(Serializableid);//根據(jù)columnMap條件,刪除記錄intdeleteByMap(@Param(Constants.COLUMN_MAP)Map<String,Object>columnMap);//根據(jù)whereWrapper條件,更新記錄intupdate(@Param(Constants.ENTITY)TupdateEntity,@Param(Constants.WRAPPER)Wrapper<T>whereWrapper);//根據(jù)ID修改intupdateById(@Param(Constants.ENTITY)Tentity);//根據(jù)ID查詢TselectById(Serializableid);……《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

1.MapperCRUD接口(5)ActiveRecord模式所謂ActiveRecord模式,在SpringBoot應(yīng)用中,如果已注入對應(yīng)實體的BaseMapper,如:publicinterfaceUserMapperextendsBaseMapper<MyUser>{},那么實體類MyUser只需繼承Model類即可進行強大的CRUD

操作,如:publicclassMyUserextendsModel<MyUser>{}?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

2.ServiceCRUD接口通用ServiceCRUD封裝IService<T>接口,進一步封裝CRUD,采用get查詢單行、remove

刪除、list查詢集合、page分頁等前綴命名方式區(qū)分Mapper層,避免混淆。創(chuàng)建Service接口及其實現(xiàn)類,示例代碼如下。publicinterfaceUserServiceextendsIService<MyUser>{}/*ServiceImpl實現(xiàn)了IService,提供了IService中基礎(chǔ)功能的實現(xiàn)。若ServiceImpl無法滿足業(yè)務(wù)需求,則可以使用自定的UserService定義方法,并在實現(xiàn)類中實現(xiàn)*/@ServicepublicclassUserServiceImplextendsServiceImpl<UserMapper,MyUser>implementsUserServiceIService<T>接口針對業(yè)務(wù)邏輯層的封裝,需要指定Dao層接口和對應(yīng)的實體類,是在BaseMapper<T>基礎(chǔ)上的加強,ServiceImpl<M,T>是針對業(yè)務(wù)邏輯層的實現(xiàn)?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

2.ServiceCRUD接口//插入一條記錄(選擇字段,策略插入)booleansave(Tentity);//插入(批量)booleansaveBatch(Collection<T>entityList);//根據(jù)entity條件,刪除記錄booleanremove(Wrapper<T>queryWrapper);//根據(jù)ID刪除booleanremoveById(Serializableid);//根據(jù)UpdateWrapper條件,更新記錄需要設(shè)置sqlsetbooleanupdate(Wrapper<T>updateWrapper);//根據(jù)whereWrapper條件,更新記錄booleanupdate(TupdateEntity,Wrapper<T>whereWrapper);通用ServiceCRUD接口提供一些get、list、page及count查詢方法通用ServiceCRUD接口提供了query及update鏈式方法query().eq("column",value).one();lambdaQuery().eq(Entity::getId,value).list();……《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

演示MapperCRUD接口和ServiceCRUD接口的使用方法【例15-5】演示MapperCRUD接口和ServiceCRUD接口的使用方法1.創(chuàng)建SpringBootWeb應(yīng)用創(chuàng)建基于Lombok依賴的SpringBootWeb應(yīng)用ch15_3。在該應(yīng)用中,操作的數(shù)據(jù)庫與15.1節(jié)一樣,都是springtest,操作的數(shù)據(jù)表是user表。2.修改pom.xml文件在pom.xml文件中添加MySQL連接器與MyBatis-Plus依賴,與【例15-4】相同,不再贅述。3.設(shè)置Web應(yīng)用ch15_3的上下文路徑及數(shù)據(jù)源配置信息在應(yīng)用

溫馨提示

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

評論

0/150

提交評論