《 Spring Boot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》 課件 第7章 MyBatis與MyBatis-Plus_第1頁
《 Spring Boot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》 課件 第7章 MyBatis與MyBatis-Plus_第2頁
《 Spring Boot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》 課件 第7章 MyBatis與MyBatis-Plus_第3頁
《 Spring Boot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》 課件 第7章 MyBatis與MyBatis-Plus_第4頁
《 Spring Boot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》 課件 第7章 MyBatis與MyBatis-Plus_第5頁
已閱讀5頁,還剩70頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第7章MyBatis與MyBatis-Plus學(xué)習(xí)目的與要求本章將重點(diǎn)介紹MyBatis與MyBatis-Plus的基礎(chǔ)知識,并詳細(xì)介紹SpringBoot如何整合MyBatis與MyBatis-Plus。通過本章的學(xué)習(xí),掌握SpringBoot整合MyBatis與MyBatis-Plus的基本步驟。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

目錄7.1SpringBoot整合MyBatis7.2MyBatis基礎(chǔ)7.3MyBatis-Plus快速入門7.4MyBatis-Plus基礎(chǔ)《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

1.創(chuàng)建SpringBootWeb應(yīng)用在創(chuàng)建SpringBootWeb應(yīng)用ch7_1時,選擇MyBatisFramework(mybatis-spring-boot-starter)依賴,如圖7.1所示。在該應(yīng)用中,操作的數(shù)據(jù)庫是springtest,操作的數(shù)據(jù)表是user表?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

3.設(shè)置Web應(yīng)用ch7_1的上下文路徑及數(shù)據(jù)源配置信息server.servlet.context-path=/ch7_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映射文件中直接使用實(shí)體類名)mybatis.type-aliases-package=com.ch.ch7_1.entity#告訴系統(tǒng)在哪里去找mapper.xml文件(映射文件)mybatis.mapperLocations=classpath:mappers/*.xml#在控制臺輸出SQL語句日志.ch.ch7_1.repository=debug#讓控制器輸出的JSON字符串格式更美觀spring.jackson.serialization.indent-output=true《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

privateStringuname;privateStringusex;}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

5.創(chuàng)建數(shù)據(jù)訪問接口創(chuàng)建名為com.ch.ch7_1.repository的包,并在該包中創(chuàng)建MyUserRepository接口。/*@Repository可有可無,但有時提示依賴注入找不到(不影響運(yùn)行),加上后可以消去依賴注入的報(bào)錯信息。這里不再需要@Mapper,是因?yàn)樵趩宇愔惺褂聾MapperScan注解,將數(shù)據(jù)訪問層的接口都注解為Mapper接口的實(shí)現(xiàn)類@Mapper與@MapperScan兩者用其一即可*/@RepositorypublicinterfaceMyUserRepository{ List<MyUser>findAll();}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

7.創(chuàng)建業(yè)務(wù)層創(chuàng)建名為com.ch.ch7_1.service的包,并在該包中創(chuàng)建MyUserService接口和MyUserServiceImpl實(shí)現(xiàn)類。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

9.在應(yīng)用程序的主類中掃描Mapper接口在應(yīng)用程序的Ch71Application主類中,使用@MapperScan注解掃描MyBatis的Mapper接口。@SpringBootApplication//配置掃描MyBatis接口的包路徑@MapperScan(basePackages={"com.ch.ch7_1.repository"})publicclassCh71Application{ publicstaticvoidmain(String[]args){ SpringApplication.run(Ch71Application.class,args); }}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

10.運(yùn)行首先,運(yùn)行Ch71Application主類。然后,訪問“http://localhost:8080/ch7_1/findAll”。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

目錄7.1SpringBoot整合MyBatis7.2MyBatis基礎(chǔ)7.3MyBatis-Plus快速入門7.4MyBatis-Plus基礎(chǔ)《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

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

主編,清華大學(xué)出版社,2024

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

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

主編,清華大學(xué)出版社,2024

7.2.1<select>元素屬性名稱描

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

主編,清華大學(xué)出版社,2024

1.使用Map接口傳遞參數(shù)在MyBatis中,允許Map接口通過鍵值對傳遞多個參數(shù)。假設(shè)數(shù)據(jù)操作接口中有個實(shí)現(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>《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

【例7-3】在【例7-2】的基礎(chǔ)上實(shí)現(xiàn)JavaBean傳遞參數(shù)。(2)添加SQL映射在應(yīng)用ch7_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>《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

publicList<MyUser>selectAllUserByJavaBean(){

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

MyUsermu=newMyUser();

mu.setUname("陳");

mu.setUsex("男");

returnmyUserRepository.selectAllUserByJavaBean(mu);}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.使用@Param注解傳遞參數(shù)不管是Map傳參,還是JavaBean傳參,它們都是將多個參數(shù)封裝在一個對象中,實(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>《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

4.使用POJO存儲結(jié)果集最后,在SQL映射文件中,首先使用<resultMap>元素將MapUser類的屬性與查詢結(jié)果列名一一對應(yīng)。然后添加接口方法selectAllUserPOJO()對應(yīng)的SQL映射:<!--使用自定義結(jié)果集類型--><resultMaptype="com.ch.ch7_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>《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,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();

}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

主鍵回填MySQL、SQLServer等數(shù)據(jù)庫的表格可以采用自動遞增的字段作為主鍵。有時可能需要使用這個剛剛產(chǎn)生的主鍵,用以關(guān)聯(lián)其它業(yè)務(wù)。因?yàn)楸緯捎玫臄?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>《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,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>《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

7.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>等元素。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,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>《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

2.<choose>、<when>、<otherwise>元素有時不需要用到所有的條件語句,而只需從中擇其一二。針對這種情況,MyBatis提供了<choose>元素,它有點(diǎn)像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>《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.<trim>元素<trim>元素的主要功能是可以在自己包含的內(nèi)容前加上某些前綴,也可以在其后加上某些后綴,與之對應(yīng)的屬性是prefix和suffix;可以把包含內(nèi)容的首部某些內(nèi)容覆蓋,即忽略,也可以把尾部的某些內(nèi)容覆蓋,對應(yīng)的屬性是prefixOverrides和suffixOverrides;正因?yàn)?lt;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>《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

4.<where>元素<where>元素的作用是輸出一個where語句,優(yōu)點(diǎn)是不考慮<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>《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

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

select*fromuserwhereuidin

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

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

#{item}

</foreach></select>《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

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

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

select*fromuserwhereunamelike#{paran_uname}</select>《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

目錄7.1SpringBoot整合MyBatis7.2MyBatis基礎(chǔ)7.3MyBatis-Plus快速入門7.4MyBatis-Plus基礎(chǔ)《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

7.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)依賴,所以,不再需要引入這些依賴,避免因版本差異導(dǎo)致問題。【例7-4】在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫1.創(chuàng)建SpringBootWeb應(yīng)用創(chuàng)建基于Lombok依賴的SpringBootWeb應(yīng)用ch7_2。在該應(yīng)用中,操作的數(shù)據(jù)庫與7.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>《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫3.設(shè)置Web應(yīng)用ch7_2的上下文路徑及數(shù)據(jù)源配置信息server.servlet.context-path=/ch7_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映射文件中直接使用實(shí)體類名)mybatis-plus.type-aliases-package=com.ch.ch7_2.entity#告訴系統(tǒng)在哪里去找mapper.xml文件(映射文件)mybatis-plus.mapper-locations=classpath:mappers/*.xml#在控制臺輸出SQL語句日志.ch.ch7_2.mapper=debug#讓控制器輸出的JSON字符串格式更美觀spring.jackson.serialization.indent-output=true《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

privateStringuname;privateStringusex;}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

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

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

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

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

returnuserMapper.myFindAll();

}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫8.在應(yīng)用程序的主類中掃描Mapper接口在應(yīng)用程序的Ch72Application主類中,使用@MapperScan注解掃描MyBatis的Mapper接口。核心代碼如下:@SpringBootApplication@MapperScan(basePackages={"com.ch.ch7_2.mapper"})publicclassCh72Application{ publicstaticvoidmain(String[]args){ SpringApplication.run(Ch72Application.class,args); }}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

在SpringBoot應(yīng)用中使用MyBatis-Plus框架操作數(shù)據(jù)庫9.運(yùn)行首先,運(yùn)行Ch72Application主類。然后,訪問“http://localhost:8080/ch7_2/findAll”和“http://localhost:8080/ch7_2/myFindAll”進(jìn)行測試?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

目錄7.1SpringBoot整合MyBatis7.2MyBatis基礎(chǔ)7.3MyBatis-Plus快速入門7.4MyBatis-Plus基礎(chǔ)《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

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

@TableId(type=IdType.AUTO)privateIntegeruid;}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,2024

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

主編,清華大學(xué)出版社,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);……《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

操作,如:publicclassMyUserextendsModel<MyUser>{}。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

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

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

主編,清華大學(xué)出版社,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鏈?zhǔn)椒椒╭uery().eq("column",value).one();lambdaQuery().eq(Entity::getId,value).list();……《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

演示MapperCRUD接口和ServiceCRUD接口的使用方法【例7-5】演示MapperCRUD接口和ServiceCRUD接口的使用方法1.創(chuàng)建SpringBootWeb應(yīng)用創(chuàng)建基于Lombok依賴的SpringBootWeb應(yīng)用ch7_3。在該應(yīng)用中,操作的數(shù)據(jù)庫與7.1節(jié)一樣,都是springtest,操作的數(shù)據(jù)表是user表。2.修改pom.xml文件在pom.xml文件中添加MySQL連接器與MyBatis-Plus依賴,與【例7-4】相同,不再贅述。3.設(shè)置Web應(yīng)用ch7_3的上下文路徑及數(shù)據(jù)源配置信息在應(yīng)用ch7_3的perties文件中配置上下文路徑及數(shù)據(jù)源配置信息,配置內(nèi)容與【例7-4】基本相同,不再贅述?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

演示MapperCRUD接口和ServiceCRUD接口的使用方法4.創(chuàng)建實(shí)體類創(chuàng)建名為com.ch.ch7_3.entity的包,并在該包中創(chuàng)建MyUser實(shí)體類。@Data@TableName("user")publicclassMyUserextendsModel<MyUser>{//ActiveRecord模式@TableId(value="uid",type=IdType.AUTO)privateIntegeruid;privateStringuname;privateStringusex;}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

演示MapperCRUD接口和ServiceCRUD接口的使用方法5.創(chuàng)建數(shù)據(jù)訪問接口創(chuàng)建名為com.ch.ch7_3.mapper的包,并在該包中創(chuàng)建UserMapper接口。UserMapper接口通過繼承BaseMapper<MyUser>接口

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論