Java EE企業(yè)級應(yīng)用開發(fā)教程(Spring+Spring MVC+MyBatis)(第3版)課件 第8-14章 MyBatis快速入門-綜合實戰(zhàn)-黑馬頭條_第1頁
Java EE企業(yè)級應(yīng)用開發(fā)教程(Spring+Spring MVC+MyBatis)(第3版)課件 第8-14章 MyBatis快速入門-綜合實戰(zhàn)-黑馬頭條_第2頁
Java EE企業(yè)級應(yīng)用開發(fā)教程(Spring+Spring MVC+MyBatis)(第3版)課件 第8-14章 MyBatis快速入門-綜合實戰(zhàn)-黑馬頭條_第3頁
Java EE企業(yè)級應(yīng)用開發(fā)教程(Spring+Spring MVC+MyBatis)(第3版)課件 第8-14章 MyBatis快速入門-綜合實戰(zhàn)-黑馬頭條_第4頁
Java EE企業(yè)級應(yīng)用開發(fā)教程(Spring+Spring MVC+MyBatis)(第3版)課件 第8-14章 MyBatis快速入門-綜合實戰(zhàn)-黑馬頭條_第5頁
已閱讀5頁,還剩487頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章MyBatis快速入門《JavaEE企業(yè)級應(yīng)用開發(fā)教程(Spring+SpringMVC+MyBatis)(第3版)》學(xué)習(xí)目標(biāo)/Target熟悉MyBatis的工作流程,能夠簡述MyBatis操作數(shù)據(jù)庫時的工作流程掌握MyBatis入門案例的實現(xiàn),能夠使用MyBatis從數(shù)據(jù)庫中獲取數(shù)據(jù),并將獲取到的數(shù)據(jù)封裝到自定義的Java對象中了解MyBatis的概念,能夠簡述MyBatis實現(xiàn)數(shù)據(jù)持久化操作的核心思想熟悉MyBatis核心組件,能夠簡述SqlSessionFactoryBuilder類、SqlSessionFactory接口和SqlSession接口的作用,以及常用的方法學(xué)習(xí)目標(biāo)/Target掌握定義結(jié)果集映射規(guī)則的標(biāo)簽,能夠在MyBatis映射文件中使用<resultMap>標(biāo)簽定義結(jié)果集映射規(guī)則掌握定義增刪查改語句的標(biāo)簽,能夠在MyBatis映射文件中使用<select>標(biāo)簽、<insert>標(biāo)簽、<update>標(biāo)簽、<delete>標(biāo)簽定義增刪改查語句掌握MyBatis核心配置文件的編寫,能夠在MyBatis核心配置文件中定義各種配置項掌握定義和引用SQL片段的標(biāo)簽,能夠在MyBatis映射文件中使用<sql>和<include>標(biāo)簽定義和引用SQL片段章節(jié)概述/SummaryMyBatis是一個開源、輕量級的持久層框架,它通過封裝JDBC,簡化了與數(shù)據(jù)庫交互的繁瑣過程,開發(fā)者可以專注于SQL語句的編寫和優(yōu)化,而無需過多關(guān)注底層的數(shù)據(jù)庫連接管理等細(xì)節(jié)。這種簡化和靈活性使得MyBatis在許多Java項目中得到廣泛應(yīng)用,本章將對MyBatis快速入門進(jìn)行講解。目錄/Contents8.18.2MyBatis概述MyBatis入門程序8.3MyBatis工作流程目錄/Contents8.48.5MyBatis核心組件MyBatis核心配置文件8.6MyBatis映射文件MyBatis概述8.18.1

MyBatis概述先定一個小目標(biāo)!

先定一個小目標(biāo)!了解MyBatis的概念,能夠簡述MyBatis實現(xiàn)數(shù)據(jù)持久化操作的核心思想8.1

MyBatis概述JDBC(JavaDatabaseConnectivity,Java數(shù)據(jù)庫連接)是Java應(yīng)用程序訪問和操作數(shù)據(jù)庫的基礎(chǔ),它提供了一套用于與數(shù)據(jù)庫交互的API,允許Java應(yīng)用程序執(zhí)行連接數(shù)據(jù)庫、發(fā)送SQL語句、處理結(jié)果等操作。盡管JDBC提供了與數(shù)據(jù)庫交互的基本功能,但使用JDBC編程比較煩瑣,同時還存在如下不足。①資源管理復(fù)雜②代碼冗余③

SQL語句與Java代碼緊密耦合8.1

MyBatis概述針對JDBC的這些不足,持久層框架應(yīng)運(yùn)而生。持久層框架是指用于處理數(shù)據(jù)持久化的軟件框架,通常用于將應(yīng)用程序中的數(shù)據(jù)保存到數(shù)據(jù)庫中,并支持對這些數(shù)據(jù)進(jìn)行檢索、更新和刪除操作。持久層框架的主要目標(biāo)是簡化數(shù)據(jù)持久化的實現(xiàn)過程,提高開發(fā)效率,并且使得數(shù)據(jù)持久化的代碼更加易于維護(hù)和擴(kuò)展。其中,MyBatis是當(dāng)前主流的持久層框架之一。MyBatis基于ORM(Object-RelationalMapping,對象關(guān)系映射)技術(shù)實現(xiàn)數(shù)據(jù)的持久化操作,ORM技術(shù)是一種在面向?qū)ο蟮某绦蛟O(shè)計語言與關(guān)系型數(shù)據(jù)庫之間建立映射關(guān)系的編程技術(shù),它的核心思想是將程序中的對象自動持久化到關(guān)系型數(shù)據(jù)庫中,以及將數(shù)據(jù)庫中的數(shù)據(jù)映射回程序的對象中。在MyBatis中,這種映射關(guān)系可以通過XML配置文件或注解進(jìn)行定義。開發(fā)者只需定義好映射關(guān)系,MyBatis就會自動生成并執(zhí)行相應(yīng)的SQL語句。MyBatis入門程序8.28.2MyBatis入門程序先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握MyBatis入門程序的實現(xiàn),能夠使用MyBatis從數(shù)據(jù)庫中獲取數(shù)據(jù),并將獲取到的數(shù)據(jù)封裝到自定義的Java對象中8.2MyBatis入門程序1.創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表在MySQL中創(chuàng)建一個名稱為mybatis的數(shù)據(jù)庫,在該數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表user,并插入2條記錄作為后續(xù)的測試數(shù)據(jù),具體SQL語句如下所示。CREATEDATABASEIFNOTEXISTSmybatis;USEmybatis;DROPTABLEIFEXISTSuser;CREATETABLEuser(idint(0)NOTNULLAUTO_INCREMENT,usernamevarchar(50),PRIMARYKEY(id));insertintouser(id,username)values(1,'張三'),(2,'李四');8.2MyBatis入門程序2.創(chuàng)建工程并引入依賴在IDEA中創(chuàng)建一個名稱為chapter08的Maven項目,并在項目的pom.xml文件中引入MyBatis、MySQL連接、單元測試的相關(guān)依賴,具體如文件8-1所示。文件8-1pom.xml源代碼8.2MyBatis入門程序3.自定義實體類在項目的src/main/java目錄下創(chuàng)建包com.itheima.entity,并在該包中創(chuàng)建與數(shù)據(jù)表user對應(yīng)的實體類User,具體如文件8-2所示。文件8-2User.java源代碼8.2MyBatis入門程序4.創(chuàng)建MyBatis映射文件在src/main/resources目錄下創(chuàng)建文件夾mapper,在該文件夾下創(chuàng)建一個名稱為UserMapper.xml的文件,在該文件中存放MyBatis操作用戶的映射信息,具體如文件8-3所示。文件8-3UserMapper.xml源代碼8.2MyBatis入門程序5.創(chuàng)建MyBatis核心配置文件在src/main/resources目錄下創(chuàng)建一個名稱為mybatis-config.xml的文件作為MyBatis的核心配置文件,mybatis-config.xml中的配置信息如文件8-4所示。文件8-4mybatis-config.xml源代碼8.2MyBatis入門程序6.創(chuàng)建測試類在項目的src/test/java目錄下創(chuàng)建UserTest類,該類中定義測試方法findByIdTest(),在該方法中使用SqlSession對象根據(jù)用戶編號從數(shù)據(jù)庫中查詢用戶信息,具體如文件8-5所示。文件8-5UserTest.java源代碼8.2MyBatis入門程序7.效果測試運(yùn)行文件8-5中的findByIdTest()方法,運(yùn)行結(jié)果如下圖所示。MyBatis工作流程8.38.3MyBatis工作流程先定一個小目標(biāo)!

先定一個小目標(biāo)!熟悉MyBatis的工作流程,能夠簡述MyBatis操作數(shù)據(jù)庫時的工作流程8.3MyBatis工作流程MyBatis核心組件8.48.4

MyBatis核心組件通過MyBatis的入門程序我們可以知道,MyBatis程序的運(yùn)行需要依靠SqlSessionFactoryBuilder類、SqlSessionFactory接口和SqlSession接口,這三個類和接口是MyBatis框架的核心組件,它們共同構(gòu)成了MyBatis的基礎(chǔ)架構(gòu)。為了讓大家能更好地理解這三者的作用與關(guān)系,下面我們將對它們做進(jìn)一步的講解。8.4.1SqlSessionFactoryBuilder類先定一個小目標(biāo)!

先定一個小目標(biāo)!熟悉SqlSessionFactoryBuilder類,能夠簡述SqlSessionFactoryBuilder類的作用和重載的build()方法8.4.1SqlSessionFactoryBuilder類SqlSessionFactoryBuilder類是在MyBatis中非常重要的組件,它的主要職責(zé)是讀取MyBatis的配置信息,解析配置信息中的數(shù)據(jù)庫連接信息、事務(wù)管理配置以及Mapper映射文件路徑等關(guān)鍵信息。通過解析這些信息能夠為構(gòu)建SqlSessionFactory實例提供必要的參數(shù)和設(shè)置。為了滿足不同的需求和場景,SqlSessionFactoryBuilder類提供了多個重載的build()方法用于構(gòu)建SqlSessionFactory實例,這些重載方法根據(jù)構(gòu)建SqlSessionFactory實例時傳入不同的參數(shù)可以分為多種方式。8.4.1SqlSessionFactoryBuilder類1.使用InputStream輸入流構(gòu)建當(dāng)配置信息編寫在核心配置文件中,并且開發(fā)者可以獲取到該文件的輸入流時,可以使用輸入流讀取配置信息后作為build()方法的參數(shù)。示例代碼如下。InputStreaminputStream=Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);8.4.1SqlSessionFactoryBuilder類2.使用Reader輸入流構(gòu)建使用Reader構(gòu)建和使用InputStream輸入流構(gòu)建類似,主要的區(qū)別在于讀取核心配置文件的方式不同。使用Reader輸入流構(gòu)建基于Reader對象讀取核心配置文件,然后將該Reader對象作為build()方法發(fā)參數(shù)。示例代碼如下。Readerreader=Resources.getResourceAsReader("mybatis-config.xml");SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(reader);8.4.1SqlSessionFactoryBuilder類3.使用Configuration對象構(gòu)建當(dāng)程序以編程方式配置MyBatis的配置信息時,開發(fā)者可以構(gòu)建并傳遞一個Configuration對象作為build()方法的參數(shù)。示例代碼如下。Configuration對象作為build()方法的參數(shù)源代碼8.4.2SqlSessionFactory接口先定一個小目標(biāo)!

先定一個小目標(biāo)!熟悉SqlSessionFactory接口,能夠簡述SqlSessionFactory接口的作用和常用的openSession()方法8.4.2SqlSessionFactory接口SqlSessionFactory接口是MyBatis框架中的核心接口之一,主要負(fù)責(zé)創(chuàng)建SqlSession對象。MyBatis提供了SqlSessionFactory接口的默認(rèn)實現(xiàn)類DefaultSqlSessionFactory,通常情況下,SqlSessionFactoryBuilder的build()方法會基于這個默認(rèn)實現(xiàn)類創(chuàng)建SqlSessionFactory實例。DefaultSqlSessionFactory主要負(fù)責(zé)SqlSession實例的創(chuàng)建和管理。它采用工廠模式,并根據(jù)MyBatis的配置信息來創(chuàng)建SqlSession對象。SqlSessionFactory提供了多個重載的openSession()方法,這些方法旨在滿足不同的需求場景,靈活創(chuàng)建SqlSession對象。通過這些重載方法,開發(fā)者可以精確控制SqlSession的行為,如是否自動提交事務(wù)、選擇特定的執(zhí)行器類型以及設(shè)定事務(wù)的隔離級別等。8.4.2SqlSessionFactory接口SqlSessionFactory接口提供的openSession()方法方法說明SqlSession

openSession()使用SqlSessionFactory的默認(rèn)配置創(chuàng)建一個SqlSession對象。默認(rèn)情況下,該SqlSession對象的事務(wù)不會自動提交,需要手動進(jìn)行提交或回滾SqlSession

openSession(

Boolean

autoCommit)使用SqlSessionFactory的默認(rèn)配置創(chuàng)建一個SqlSession對象,并指定是否自動提交事務(wù)。其中autoCommit參數(shù)設(shè)置為true,那么事務(wù)將會自動提交;如果設(shè)置為false,則事務(wù)不會自動提交,需要手動調(diào)用commit()或rollback()方法來提交或回滾事務(wù)SqlSession

openSession(

Connection

connection)使用傳入的Connection對象創(chuàng)建SqlSession對象,而不是使用SqlSessionFactory的默認(rèn)配置SqlSession

openSession(

TransactionIsolationLevel

level)根據(jù)指定的事務(wù)隔離級別level創(chuàng)建SqlSession對象8.4.2SqlSessionFactory接口方法說明SqlSessionopenSession(

ExecutorType

execType)根據(jù)指定執(zhí)行器類型execType創(chuàng)建SqlSession,執(zhí)行器類型決定了MyBatis在執(zhí)行SQL語句時的行為,包括是否復(fù)用預(yù)處理語句和是否批處理等。ExecutorType是一個枚舉類型,有三個可選值:SIMPLE:默認(rèn)的執(zhí)行器,為每一個語句的執(zhí)行創(chuàng)建一個新的預(yù)處理語句。REUSE:執(zhí)行器會復(fù)用預(yù)處理語句。BATCH:執(zhí)行器會重復(fù)使用語句和批量更新,主要用于批量操作,以減少預(yù)處理語句的創(chuàng)建和銷毀的開銷SqlSessionopenSession(ExecutorTypeexecType,Boolean

autoCommit)根據(jù)指定執(zhí)行器類型execType和是否自動提交事務(wù)創(chuàng)建SqlSessionSqlSessionopenSession(ExecutorType

execType,Connection

connection)根據(jù)指定執(zhí)行器類型execType和Connection對象創(chuàng)建SqlSession對象8.4.3SqlSession接口先定一個小目標(biāo)!

先定一個小目標(biāo)!熟悉SqlSession接口,能夠簡述SqlSession接口的作用和SqlSession接口的常用方法8.4.3SqlSession接口SqlSession接口是MyBatis中用于執(zhí)行SQL命令并與數(shù)據(jù)庫進(jìn)行交互的主要接口之一,其實例用于表示應(yīng)用程序與數(shù)據(jù)庫的一次會話,它提供了一系列方法來執(zhí)行SQL查詢、更新、插入和刪除操作,以及管理事務(wù)和資源的方法。DefaultSqlSession是MyBatis提供的SqlSession接口默認(rèn)實現(xiàn)類,當(dāng)SqlSessionFactory實例調(diào)用openSession()方法時,MyBatis會根據(jù)配置和上下文信息來創(chuàng)建并返回DefaultSqlSession的一個實例,開發(fā)者可以使用這個實例來執(zhí)行數(shù)據(jù)庫操作,例如查詢、插入、更新和刪除等。通常開發(fā)者不需要關(guān)心SqlSession的具體實現(xiàn)細(xì)節(jié)。只需要通過SqlSession實例調(diào)用對應(yīng)的方法執(zhí)行SQL語句、獲取映射器等。MyBatis會負(fù)責(zé)處理底層的數(shù)據(jù)庫連接、SQL執(zhí)行、結(jié)果集映射等細(xì)節(jié)。8.4.3SqlSession接口SqlSession接口的常用方法方法名稱描述<T>TselectOne(

Stringstatement)根據(jù)參數(shù)statement執(zhí)行查詢操作,返回單個結(jié)果,statement是配置信息中SQL語句的唯一標(biāo)識符,通常由映射器(Mapper)的命名空間和該SQL語句在映射器中的id屬性組成<T>TselectOne(Stringstatement,Objectparameter)根據(jù)參數(shù)statement和parameter執(zhí)行查詢操作,返回單個結(jié)果。其中,statement是SQL語句的唯一標(biāo)識符,parameter是傳遞給SQL語句的參數(shù)<E>List<E>selectList(

Stringstatement)根據(jù)參數(shù)statement執(zhí)行查詢操作,返回結(jié)果封裝在集合中,statement是配置信息中SQL語句的唯一標(biāo)識符8.4.3SqlSession接口方法名稱描述<E>List<E>selectList(Stringstatement,Objectparameter)根據(jù)參數(shù)statement和parameter執(zhí)行查詢操作,返回結(jié)果封裝在集合中,其中,statement是SQL語句的唯一標(biāo)識符,parameter是傳遞給SQL語句的參數(shù)intinsert(Stringstatement)根據(jù)參數(shù)statemen執(zhí)行插入操作,statement是配置信息中SQL語句的唯一標(biāo)識符intinsert(Stringstatement,Objectparameter)根據(jù)參數(shù)statement和parameter執(zhí)行插入操作,其中,statement是SQL語句的唯一標(biāo)識符,parameter是傳遞給SQL語句的參數(shù)intupdate(Stringstatement)根據(jù)參數(shù)statemen執(zhí)行更新操作,statement是配置信息中SQL語句的唯一標(biāo)識符8.4.3SqlSession接口方法名稱描述intupdate(Stringstatement,Objectparameter)根據(jù)參數(shù)statement和parameter執(zhí)行更新操作,其中,statement是SQL語句的唯一標(biāo)識符,parameter是傳遞給SQL語句的參數(shù)intdelete(Stringstatement)根據(jù)參數(shù)statemen執(zhí)行刪除操作,statement是配置信息中SQL語句的唯一標(biāo)識符intdelete(Stringstatement,Objectparameter)根據(jù)參數(shù)statement和parameter執(zhí)行刪除操作,其中,statement是SQL語句的唯一標(biāo)識符,parameter是傳遞給SQL語句的參數(shù)voidcommit()提交當(dāng)前事務(wù)8.4.3SqlSession接口方法名稱描述voidrollback()回滾當(dāng)前事務(wù)voidclose()關(guān)閉SqlSession對象,釋放數(shù)據(jù)庫連接和其他資源<T>TgetMapper(Class<T>type)獲取指定類型的映射器(Mapper)實例ConnectiongetConnection()獲取當(dāng)前SqlSession使用的數(shù)據(jù)庫連接MyBatis核心配置文件8.58.5MyBatis核心配置文件先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握MyBatis核心配置文件的編寫,能夠在MyBatis核心配置文件中定義屬性、全局設(shè)置、類型別名、插件、環(huán)境配置和映射器的信息8.5MyBatis核心配置文件MyBatis的配置信息可以以多種方式定義,其中最常見的是使用XML格式的配置文件,這種方式能夠清晰地組織配置信息,并且易于閱讀和維護(hù),MyBatis核心配置文件的主要標(biāo)簽如下所示。8.5MyBatis核心配置文件<configuration>標(biāo)簽是MyBatis核心配置文件的根標(biāo)簽,MyBatis核心配置文件通過<configuration>標(biāo)簽將所有的配置信息組織起來,在這個標(biāo)簽內(nèi)部,可以定義各種配置項,包括屬性、全局設(shè)置、類型別名、插件、環(huán)境配置和映射器等。下面對MyBatis核心配置文件中其他的主要標(biāo)簽進(jìn)行說明。8.5MyBatis核心配置文件1.<properties>標(biāo)簽<properties>標(biāo)簽用于定義屬性,在該標(biāo)簽中定義的屬性可以在核心配置文件中的其他地方通過${屬性名}的方式引用這些屬性,定義屬性的方式有讀取外部屬性文件和直接定義屬性鍵值對兩種方式。8.5MyBatis核心配置文件(1)讀取外部屬性文件例如在config文件夾下有屬性文件perties,文件中的內(nèi)容如下。db.driver=com.mysql.cj.jdbc.Driverdb.url=jdbc:mysql://localhost:3306/mydatabasedb.username=rootdb.password=secret<properties>標(biāo)簽可以通過resource或url屬性讀取指定位置的外部屬性文件,MyBatis啟動時會加載該文件,并將其中的屬性作為配置的一部分。示例如下。<propertiesresource="config/perties"/>8.5MyBatis核心配置文件(2)直接在<properties>標(biāo)簽內(nèi)定義在<properties>標(biāo)簽內(nèi)使用<property>子標(biāo)簽可以定義對應(yīng)的屬性。示例如下。<properties><propertyname="db.driver"value="com.mysql.cj.jdbc.Driver"/><propertyname="db.url"value="jdbc:mysql://localhost:3306/mybatis"/><propertyname="db.username"value="root"/><propertyname="db.password"value="root"/></properties>直接在<properties>標(biāo)簽內(nèi)定義的屬性優(yōu)先級高于從外部屬性文件中讀取到的屬性。如果兩者都存在相同的屬性名,那么在核心配置文件中直接定義的屬性會覆蓋外部屬性文件中的屬性。在MyBatis的核心配置文件中引用定義的屬性示例如下。<dataSourcetype="POOLED"><propertyname="driver"value="${db.driver}"/><propertyname="url"value="${db.url}"/><propertyname="username"value="${db.username}"/><propertyname="password"value="${db.password}"/></dataSource>8.5MyBatis核心配置文件2.<settings>標(biāo)簽<settings>標(biāo)簽用于配置MyBatis的運(yùn)行時行為,通常用于設(shè)置全局性的參數(shù),例如緩存設(shè)置、日志實現(xiàn)、延遲加載等。<settings>標(biāo)簽內(nèi)可以包含多個<setting>標(biāo)簽,每個<setting>標(biāo)簽用于定義了一個具體的配置項,<setting>標(biāo)簽中常見的配置項如下。(1)cacheEnabledcacheEnabled用于設(shè)置是否啟用MyBatis的二級緩存。當(dāng)設(shè)置為true時,MyBatis會啟用二級緩存,這有助于提高查詢性能,尤其是在重復(fù)查詢相同數(shù)據(jù)時。默認(rèn)為true(2)lazyLoadingEnabledlazyLoadingEnabled用于設(shè)置是否啟用延遲加載。當(dāng)設(shè)置為true時,關(guān)聯(lián)對象的數(shù)據(jù)加載會被延遲,直到實際使用時才進(jìn)行加載。這有助于減少不必要的數(shù)據(jù)庫訪問,提高性能。8.5MyBatis核心配置文件(3)multipleResultSetsEnabledmultipleResultSetsEnabled用于設(shè)置是否允許從單一的語句返回多個結(jié)果集,其默認(rèn)值為true。當(dāng)設(shè)置為true時,MyBatis支持從單個SQL語句中返回多個結(jié)果集。(4)useColumnLabeluseColumnLabel用于設(shè)置是否使用列標(biāo)簽代替列名,其默認(rèn)值為true。(5)useGeneratedKeysuseGeneratedKeys用于設(shè)置是否要在插入操作后返回生成的主鍵,需要注意的是,useGeneratedKeys只針對insert語句生效。8.5MyBatis核心配置文件(6)autoMappingBehaviorautoMappingBehavior用于設(shè)置MyBatis如何自動映射列到字段或?qū)傩裕淇蛇x值有NONE、PARTIAL和FULL,分別表示不自動映射、僅自動映射沒有定義嵌套結(jié)果集映射的列,以及自動映射所有列。(7)mapUnderscoreToCamelCasemapUnderscoreToCamelCase用于設(shè)置是否將數(shù)據(jù)庫中的下劃線命名自動映射為Java中的駝峰命名。例如,當(dāng)值設(shè)置為true時,數(shù)據(jù)庫中的user_name列將被映射為Java對象中的userName屬性。(8)logImpllogImpl用于指定MyBatis使用的日志記錄實現(xiàn),根據(jù)項目所使用的日志框架選擇合適的值,其常見的值有SLF4J、LOG4J、JDK_LOGGING、STDOUT_LOGGING,前三者依次表示通過Log4j框架、SLF4J框架、JDK自帶的日志框架作為日志記錄實現(xiàn)。8.5MyBatis核心配置文件下面通過示例演示MyBatis核心配置文件中的配置。核心配置文件的配置示例源代碼8.5MyBatis核心配置文件3.<typeAliases>標(biāo)簽<typeAliases>標(biāo)簽用于定義類型的別名,以簡化XML映射文件中類型的引用。類型別名通常用于代替類的全限定名,以便在映射文件中使用這些別名代替類的全限定名,使得映射文件中的配置更加簡潔易讀。在MyBatis的核心配置文件中,可以在<typeAliases>標(biāo)簽通過<typeAlias>標(biāo)簽和<package>標(biāo)簽兩種方式定義類型的別名。(1)使用<typeAlias>標(biāo)簽定義別名通過<typeAlias>標(biāo)簽,開發(fā)者可以為指定的Java類型定義別名,示例如下。<typeAliases><typeAliasalias="User"type="com.itheima.domain.User"/><typeAliasalias="Order"type="com.itheima.domain.Order"/></typeAliases>8.5MyBatis核心配置文件(2)使用<package>標(biāo)簽定義別名在<typeAliases>標(biāo)簽下使用<package>標(biāo)簽可以指定一個包,MyBatis會自動掃描這個包下的所有類,并為它們創(chuàng)建別名。默認(rèn)情況下,會將這些類名首字母小寫后的名稱作為別名,示例如下。<typeAliases><packagename="com.itheima.domain"/></typeAliases>8.5MyBatis核心配置文件除了可以使用<typeAliases>標(biāo)簽為實體類定義別名外,MyBatis框架還為常見的Java類型提供了相應(yīng)的默認(rèn)別名,MyBatis默認(rèn)的常見Java類型的別名如下所示。Java類型默認(rèn)別名byte_bytelong_longshort_shortint_intdouble_doublefloat_floatboolean_booleanStringstringBytebyte8.5MyBatis核心配置文件Java類型默認(rèn)別名LonglongShortshortIntegerintegerDoubledoubleFloatfloatBooleanbooleanDatedateObjectobjectMapmapHashMaphashmapListlistArrayListarraylistCollectioncollectionIteratoriterator8.5MyBatis核心配置文件4.<plugins>標(biāo)簽在MyBatis中,<plugins>標(biāo)簽用于定義插件,定義的插件可以理解為攔截器,用于攔截MyBatis的某些方法調(diào)用,并在攔截后執(zhí)行一些自定義的處理邏輯。插件機(jī)制為MyBatis提供了強(qiáng)大的擴(kuò)展性,使得開發(fā)者可以在不修改MyBatis核心代碼的情況下,對其功能進(jìn)行增強(qiáng)或修改。在<plugins>標(biāo)簽中,可以配置一個或多個<plugin>子標(biāo)簽,每個<plugin>子標(biāo)簽代表一個插件。每個插件都需要指定其interceptor屬性,該屬性值為插件類的全限定名。此外,還可以在<plugin>標(biāo)簽內(nèi)部配置<property>子標(biāo)簽,用于為插件提供額外的配置參數(shù)。8.5MyBatis核心配置文件<plugins>標(biāo)簽的使用示例。<plugins> <!--PageHelper分頁插件--> <plugininterceptor="com.github.pagehelper.PageInterceptor"> <!--設(shè)置分頁插件的參數(shù)--> <propertyname="helperDialect"value="mysql"/> <propertyname="reasonable"value="true"/> </plugin></plugins>8.5MyBatis核心配置文件5.<environments>標(biāo)簽在MyBatis的核心配置文件中,<environments>標(biāo)簽用于配置數(shù)據(jù)庫環(huán)境,該標(biāo)簽可以包含多個<environment>子標(biāo)簽,每個<environment>子標(biāo)簽代表一個數(shù)據(jù)庫環(huán)境配置。通過配置不同的環(huán)境,MyBatis可以根據(jù)運(yùn)行時的需求切換到不同的數(shù)據(jù)庫環(huán)境,其中<environments>標(biāo)簽使用default屬性指定默認(rèn)使用的環(huán)境。當(dāng)MyBatis啟動時,它會查找default屬性指定的環(huán)境配置作為默認(rèn)配置。每個<environment>標(biāo)簽通過id屬性指定當(dāng)前環(huán)境配置的唯一標(biāo)識,而default屬性用于指定默認(rèn)的環(huán)境配置。8.5MyBatis核心配置文件(1)<transactionManager>標(biāo)簽<transactionManager>標(biāo)簽用于配置事務(wù)管理器,MyBatis支持兩種類型的事務(wù)管理器:JDBC(由JDBC連接來管理事務(wù))和MANAGED(由容器來管理事務(wù))。(2)<dataSource>標(biāo)簽<dataSource>標(biāo)簽用于配置數(shù)據(jù)源。數(shù)據(jù)源是MyBatis用于連接數(shù)據(jù)庫的對象。MyBatis支持多種數(shù)據(jù)源類型,如POOLED(使用連接池的數(shù)據(jù)源)、UNPOOLED(不使用連接池的數(shù)據(jù)源)和JNDI(從Java命名和目錄接口查找的數(shù)據(jù)源)。<environments>標(biāo)簽的使用示例源代碼8.5MyBatis核心配置文件6.<mappers>標(biāo)簽<mappers>標(biāo)簽確實用于配置需要加載的映射器(Mapper)信息,其中加載的映射器信息可以是映射文件,也可以是映射器接口。<mappers>標(biāo)簽中可以通過<mapper>子標(biāo)簽和<package>子標(biāo)簽實現(xiàn)映射器信息的指定。8.5MyBatis核心配置文件這種方式直接指定了映射文件的路徑。MyBatis會根據(jù)這個路徑加載XML映射文件通過資源路徑指定映射文件這種方式需要指定映射器接口的全限定名,MyBatis會自動在映射器接口相同的包路徑下,查找與這個接口同名的XML映射文件,并加載其中的映射信息通過映射器接口指定映射器<mapper>子標(biāo)簽配置映射器信息(1)<mapper>子標(biāo)簽<mapper>子標(biāo)簽用于指定單個映射器的位置。8.5MyBatis核心配置文件(2)<package>子標(biāo)簽<package>子標(biāo)簽用于指定包含映射器接口的包名。當(dāng)使用<package>子標(biāo)簽時,MyBatis會自動掃描指定包下的所有映射器接口,示例如下。<mappers><packagename="com.itheima.mapper"/></mappers>MyBatis映射文件8.68.6

MyBatis映射文件MyBatis的映射文件是指用于定義實體類和數(shù)據(jù)庫操作之間映射信息的XML文件,此類文件以<mapper>標(biāo)簽作為其根元素,用以標(biāo)識一個獨立的XML映射單元。其中,<mapper>標(biāo)簽的namespace屬性為映射文件賦予了唯一的名稱空間,使得MyBatis能夠依據(jù)名稱空間精準(zhǔn)地區(qū)分并管理不同的映射文件。映射文件中通常包含SQL語句、輸入?yún)?shù)和結(jié)果集映射等映射信息,這些映射信息通過MyBatis提供的特定標(biāo)簽在<mapper>標(biāo)簽內(nèi)進(jìn)行定義,這些標(biāo)簽根據(jù)其作用可以分為定義增刪查改語句的標(biāo)簽、定義結(jié)果集映射的標(biāo)簽、定義和引用SQL片段的標(biāo)簽。下對MyBatis映射文件中的常見標(biāo)簽進(jìn)行講解。8.6.1定義SQL語句的標(biāo)簽先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握定義增刪查改語句的標(biāo)簽,能夠在MyBatis映射文件中使用<select>標(biāo)簽、<insert>標(biāo)簽、<update>標(biāo)簽、<delete>標(biāo)簽定義增刪改查語句8.6.1定義SQL語句的標(biāo)簽在使用MyBatis進(jìn)行持久層開發(fā)時,核心任務(wù)之一便是定義與數(shù)據(jù)庫交互的SQL語句,以便實現(xiàn)數(shù)據(jù)的增刪查改操作。這些操作的SQL指令并非直接硬編碼在應(yīng)用程序中,而是封裝在易于管理和維護(hù)的XML映射文件中。通過這種方式,開發(fā)者可以將復(fù)雜的SQL語句與業(yè)務(wù)邏輯分離,提升代碼的整潔度與可讀性。下面對MyBatis映射文件中用于定義SQL語句的標(biāo)簽進(jìn)行講解。8.6.1定義SQL語句的標(biāo)簽resultMap屬性用于指定一個結(jié)果集映射,可以使用這個屬性來引用一個定義好的<resultMap>id屬性用于定義當(dāng)前查詢的唯一標(biāo)識,是必需的屬性parameterType屬性用于指定傳入SQL語句的參數(shù)類型resultType屬性用于指定查詢結(jié)果的映射類型,該屬性的值可以是Java類的全限定名和ava類對應(yīng)的別名在MyBatis中,<select>標(biāo)簽用于配置SQL查詢語句以及查詢結(jié)果的映射規(guī)則。使用<select>標(biāo)簽開發(fā)者可以指定一個SQL查詢,并指定如何將查詢結(jié)果集映射到Java對象。<select>標(biāo)簽的常用屬性1.<select>標(biāo)簽8.6.1定義SQL語句的標(biāo)簽(1)創(chuàng)建Mapper接口文件8-6UserMapper.java源代碼在項目的src/main/java目錄下創(chuàng)建包com.itheima.mapper,并在該包中定義操作User對象和數(shù)據(jù)庫數(shù)據(jù)映射的Mapper接口UserMapper,并在該接口中定義方法findById(),具體如文件8-6所示。下面通過一個查詢用戶信息的案例,演示<select>標(biāo)簽的使用。8.6.1定義SQL語句的標(biāo)簽(2)編寫映射信息在MyBatis的映射文件中,為了動態(tài)地插入SQL語句中的參數(shù)值,可以使用#{}和${}兩種占位符,其中#{}符號表示預(yù)編譯參數(shù)占位符,MyBatis會將#{}替換為問號(?),并在執(zhí)行SQL時使用PreparedStatement的setter()方法為每個問號綁定相應(yīng)的參數(shù)值。${}符號用于字符串替換,MyBatis會直接將${}內(nèi)的變量值作為原始字符串插入到SQL語句中。這意味著${}的內(nèi)容不會被當(dāng)作參數(shù)對待,而是直接參與SQL語句的構(gòu)建,類似于普通的字符串拼接。8.6.1定義SQL語句的標(biāo)簽(2)編寫映射信息文件8-7UserMapper.xml源代碼在src/main/resources目錄下創(chuàng)建多層級文件夾com/itheima/mapper,在該文件夾下創(chuàng)建一個名稱為UserMapper.xml的文件,在該文件定義查詢語句,在查詢語句中獲取傳入的參數(shù)作為SQL語句的查詢條件,具體如文件8-7所示。8.6.1定義SQL語句的標(biāo)簽(3)定義測試方法文件8-8MapperTest.java源代碼SqlSession接口中提供了getMapper()方法用于根據(jù)傳入Mapper接口的Class對象來獲取對應(yīng)的Mapper實例。在項目的src/test/java目錄下創(chuàng)建MapperTest類,為了減少冗余代碼,在此將創(chuàng)建SqlSession對象的代碼抽取成獨立的方法createSqlSession(),并定義測試方法selectTest(),在測試方法中通過SqlSession對象獲取UserMapper對象,并通過UserMapper對象調(diào)用其findById()方法查詢用戶信息,具體如文件8-8所示。8.6.1定義SQL語句的標(biāo)簽(4)注冊Mapper接口在文件8-4的mybatis-config.xml文件的<mappers>標(biāo)簽內(nèi)部,以指定Mapper接口所在的包的方式注冊Mapper接口,代碼如下所示。<packagename="com.itheima.mapper"/>8.6.1定義SQL語句的標(biāo)簽(5)測試效果運(yùn)行文件8-8中的selectTest()方法,運(yùn)行效果如下圖所示。8.6.1定義SQL語句的標(biāo)簽<insert>標(biāo)簽用于定義插入語句,通過<insert>標(biāo)簽,開發(fā)者可以明確定義要執(zhí)行的插入操作的SQL語句,包括插入的數(shù)據(jù)和插入后的處理方式。用于指定是否返回生成的主鍵值,并將其設(shè)置到參數(shù)對象中useGeneratedKeys屬性與useGeneratedKeys屬性配合使用,用于指定傳入?yún)?shù)對象中用于接收生成主鍵值的屬性名keyProperty屬性用于指定生成主鍵值的數(shù)據(jù)庫字段名keyColumn屬性<insert>標(biāo)簽的常用屬性2.<insert>標(biāo)簽8.6.1定義SQL語句的標(biāo)簽(1)定義插入用戶方法在文件8-6的UserMapper接口中定義方法insertUser(),用于插入用戶信息,具體如下所示。下面通過一個插入用戶信息的案例,演示使用<insert>標(biāo)簽插入用戶信息。intinsertUser(Useruser);8.6.1定義SQL語句的標(biāo)簽(2)編寫映射信息在文件8-7的UserMapper.xml文件中根據(jù)傳入的用戶信息定義插入語句,具體如下所示。<!--插入用戶信息--><insertid="insertUser"parameterType="com.itheima.entity.User" useGeneratedKeys="true"keyProperty="id"> INSERTINTOuser(username)VALUES(#{username})</insert>8.6.1定義SQL語句的標(biāo)簽(3)定義測試方法在文件8-8中的MapperTest類中定義測試方法insertTest(),在測試方法中獲取UserMapper對象,并通過UserMapper對象調(diào)用其insertUser()方法插入用戶信息,具體如下所示。@TestpublicvoidinsertTest(){ //獲取SqlSession對象 SqlSessionsession=this.createSqlSession(); //獲取UserMapper對象 UserMappermapper=session.getMapper(UserMapper.class); Useruser=newUser(); user.setUsername("王五"); //插入用戶信息 mapper.insertUser(user);mit(); System.out.println(user);}8.6.1定義SQL語句的標(biāo)簽(4)測試效果運(yùn)行文件8-8中的insertUser()方法,運(yùn)行效果如下圖所示。8.6.1定義SQL語句的標(biāo)簽(1)定義更新用戶方法在文件8-6的UserMapper接口中定義方法updateUser(),用于更新用戶信息,具體如下所示。<update>標(biāo)簽用于定義更新語句,通過<update>標(biāo)簽,開發(fā)者可以明確定義要執(zhí)行的更新操作的SQL語句。下面通過一個更新用戶信息的案例演示<update>標(biāo)簽的使用。intupdateUser(Useruser);3.<update>標(biāo)簽8.6.1定義SQL語句的標(biāo)簽(2)編寫映射信息在文件8-7的UserMapper.xml文件中根據(jù)傳入的用戶信息定義更新語句,具體如下所示。<!--更新用戶信息--><updateid="updateUser"parameterType="com.itheima.entity.User"> UPDATEuserSETusername=#{username} WHEREid=#{id}</update>8.6.1定義SQL語句的標(biāo)簽(3)定義測試方法在文件8-8中的MapperTest類中定義測試方法updateUser(),在測試方法中獲取UserMapper對象,并通過UserMapper對象調(diào)用其updateUser()方法更新用戶信息,具體如下所示。@TestpublicvoidupdateUser(){ //獲取SqlSession對象 SqlSessionsession=this.createSqlSession(); //獲取UserMapper對象 UserMappermapper=session.getMapper(UserMapper.class); Useruser=newUser(); user.setId(3); user.setUsername("王老五"); //插入用戶信息 mapper.updateUser(user); mit(); Useru=mapper.findById(3); System.out.println(u);}8.6.1定義SQL語句的標(biāo)簽(4)測試效果運(yùn)行文件8-8中的updateUser()方法,運(yùn)行效果如下圖所示。8.6.1定義SQL語句的標(biāo)簽(1)定義更新用戶方法在文件8-6的UserMapper接口中定義方法deleteUser(),用于更新用戶信息,具體如下所示。4.<delete>標(biāo)簽<delete>標(biāo)簽用于定義刪除語句,下面通過刪除用戶信息演示<delete>標(biāo)簽的使用,具體如下。intdeleteUserById(intid);8.6.1定義SQL語句的標(biāo)簽(2)編寫映射信息在文件8-7的UserMapper.xml文件中根據(jù)傳入的用戶id定義刪除語句,具體如下所示。<!--刪除用戶信息--><deleteid="deleteUserById"parameterType="int"> DELETEFROMuserWHEREid=#{id}</delete>8.6.1定義SQL語句的標(biāo)簽(3)定義測試方法在文件8-8中的MapperTest類中定義測試方法deleteTest(),在測試方法中獲取UserMapper對象,并通過UserMapper對象調(diào)用其deleteUserById()方法刪除用戶信息,具體如下所示。@TestpublicvoiddeleteTest(){ //獲取SqlSession對象 SqlSessionsession=this.createSqlSession(); //獲取UserMapper對象 UserMappermapper=session.getMapper(UserMapper.class); //刪除用戶信息 mapper.deleteUserById(3); mit();Useruser=mapper.findById(3);System.out.println(user);}8.6.1定義SQL語句的標(biāo)簽(4)測試效果運(yùn)行文件8-8中的deleteTest()方法,運(yùn)行效果如下圖所示。8.6.2

定義結(jié)果集映射的標(biāo)簽先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握定義結(jié)果集映射規(guī)則的標(biāo)簽,能夠在MyBatis映射文件中使用<resultMap>標(biāo)簽定義結(jié)果集映射規(guī)則8.6.2

定義結(jié)果集映射的標(biāo)簽在MyBatis映射文件中,定義映射規(guī)則的標(biāo)簽主要指的是用于描述查詢結(jié)果如何與Java對象屬性進(jìn)行映射的標(biāo)簽。這些標(biāo)簽用于處理復(fù)雜查詢結(jié)果的結(jié)構(gòu)化映射,確保查詢結(jié)果能夠正確地填充到目標(biāo)對象的屬性中。其中,<resultMap>標(biāo)簽為定義結(jié)果集映射的頂級標(biāo)簽,基于<resultMap>標(biāo)簽可以處理字段和屬性之間的不匹配,以及一對多、多對一的關(guān)系等復(fù)雜場景。8.6.2

定義結(jié)果集映射的標(biāo)簽<resultMap>標(biāo)簽提供了id屬性用于指定該映射的唯一標(biāo)識符,在映射文件中的其他配置可以通過id屬性的值引用此映射。<resultMap>標(biāo)簽的type屬性則用于指定要映射到的Java類的全限定名或別名。示例如下。<resultMapid="userResultMap"type="com.itheima.entity.User"></resultMap><resultMap>標(biāo)簽通常包括<id>、<result>、<association>、<collection>等子標(biāo)簽,用于定義如何將映射結(jié)果集映射到Java對象的屬性。8.6.2

定義結(jié)果集映射的標(biāo)簽javaType用于指定主鍵屬性的Java類型property用于指定Java對象中對應(yīng)的主鍵字段的屬性名jdbcType用于指定主鍵屬性在JDBC中的類型column用于指定數(shù)據(jù)庫表中對應(yīng)的主鍵字段名<id>子標(biāo)簽用于映射數(shù)據(jù)庫表的主鍵字段到Java對象的屬性。<id>子標(biāo)簽的主要屬性1.<id>子標(biāo)簽8.6.2

定義結(jié)果集映射的標(biāo)簽2.<result>子標(biāo)簽用于指定Java對象中的屬性名property用于指定數(shù)據(jù)庫表中的字段名column<result>子標(biāo)簽的主要屬性<result>子標(biāo)簽用于映射數(shù)據(jù)庫表的普通字段到Java對象的屬性8.6.2

定義結(jié)果集映射的標(biāo)簽3.<association>子標(biāo)簽<association>子標(biāo)簽用于映用于處理一對一的關(guān)系映射,將結(jié)果集中的關(guān)聯(lián)數(shù)據(jù)映射到Java對象中的另一個對象屬性。0102030405用于指定Java對象中對應(yīng)的屬性名,該屬性應(yīng)映射到一個復(fù)雜類型用于指定從主查詢結(jié)果中提取的某個字段值,該字段值將作為參數(shù)傳遞給通過select屬性定義的嵌套查詢用于指定屬性的Java類型用于指定一個預(yù)先定義的resultMap的id,當(dāng)關(guān)聯(lián)對象的映射較為復(fù)雜時,需要引用已有的詳細(xì)映射規(guī)則時使用用于指定一個單獨的查詢來加載關(guān)聯(lián)對象,其值通常是一個映射器中定義的另一個<select>標(biāo)簽的idpropertycolumnjavaTyperesultMapselect<association>子標(biāo)簽的主要屬性8.6.2

定義結(jié)果集映射的標(biāo)簽(1)數(shù)據(jù)庫數(shù)據(jù)準(zhǔn)備文件8-9association.sql源代碼在名稱為mybatis的數(shù)據(jù)庫中,創(chuàng)建人員數(shù)據(jù)表person和身份證數(shù)據(jù)表idcard,并插入若干條測試數(shù)據(jù),具體SQL語句如文件8-9所示。下面基于<association>子標(biāo)簽實現(xiàn)人和對應(yīng)身份證信息的一對一關(guān)聯(lián)查詢的案例。8.6.2

定義結(jié)果集映射的標(biāo)簽(2)定義實體類文件8-10

Person.java文件8-11

IDCard.java源代碼在com.itheima.entity包下創(chuàng)建與數(shù)據(jù)表person和idcard對應(yīng)的實體類Person和IDCard,具體如文件8-10和文件8-11所示。8.6.2

定義結(jié)果集映射的標(biāo)簽(3)定義查詢?nèi)藛T信息的方法文件8-12PersonMapper.java源代碼在com.itheima.mapper包下創(chuàng)建操作Person對象和數(shù)據(jù)庫數(shù)據(jù)映射的Mapper接口PersonMapper,并在該接口中定義方法getPersonById(),具體如下文件8-12所示。8.6.2

定義結(jié)果集映射的標(biāo)簽(4)編寫映射信息文件8-13PersonMapper.xml源代碼在src/main/resources目錄的文件夾com/itheima/mapper下創(chuàng)建一個名稱為PersonMapper.xml的文件,在該文件定義查詢語句,在查詢語句中根據(jù)傳入的人員id查詢包含人員身份證信息的人員信息,具體如文件8-13所示。8.6.2

定義結(jié)果集映射的標(biāo)簽(5)定義測試方法getPersonById()方法源代碼在文件8-8中的MapperTest類中定義測試方法associationTest(),在測試方法中獲取PersonMapper對象,并通過PersonMapper對象調(diào)用其getPersonById()方法查詢?nèi)藛T信息,具體如下所示。8.6.2

定義結(jié)果集映射的標(biāo)簽(6)測試效果運(yùn)行文件8-8中的associationTest()方法,運(yùn)行效果如下圖所示。8.6.2

定義結(jié)果集映射的標(biāo)簽4.<collection>子標(biāo)簽<collection>子標(biāo)簽用于處理一對多的關(guān)系映射,將結(jié)果集中的多個關(guān)聯(lián)數(shù)據(jù)映射到Java對象中的集合屬性。<collection>子標(biāo)簽比<association>子標(biāo)簽多了一個ofType屬性,該屬性用于指定集合中元素的類型,MyBatis會根據(jù)ofType屬性的值來創(chuàng)建集合,并將查詢結(jié)果填充到集合中。8.6.2

定義結(jié)果集映射的標(biāo)簽(1)數(shù)據(jù)庫數(shù)據(jù)準(zhǔn)備文件8-14collection.sql源代碼在名稱為mybatis的數(shù)據(jù)庫中,創(chuàng)建會員數(shù)據(jù)表member和訂單數(shù)據(jù)表order,并插入若干條測試數(shù)據(jù),具體SQL語句如文件8-14所示。下面基于<collection>子標(biāo)簽實現(xiàn)會員和對應(yīng)訂單信息的一對多關(guān)聯(lián)查詢的案例。8.6.2

定義結(jié)果集映射的標(biāo)簽(2)定義實體類文件8-15

Member.java文件8-16

Order.java源代碼在com.itheima.entity包下創(chuàng)建與數(shù)據(jù)表member和order對應(yīng)的實體類Member和Order,具體如文件8-15和文件8-16所示。8.6.2

定義結(jié)果集映射的標(biāo)簽(3)定義查詢會員信息的方法文件8-17MemberMapper.java源代碼在com.itheima.mapper包下創(chuàng)建操作Member對象和數(shù)據(jù)庫數(shù)據(jù)映射的Mapper接口MemberMapper,并在該接口中定義方法getMemberWithOrders(),具體如下文件8-17所示。8.6.2

定義結(jié)果集映射的標(biāo)簽(4)編寫映射信息文件8-18MemberMapper.xml源代碼在src/main/resources目錄的文件夾com/itheima/mapper下創(chuàng)建一個名稱為MemberMapper.xml的文件,在該文件定義查詢語句,在查詢語句中根據(jù)傳入的會員id查詢包含訂單信息的會員信息,具體如文件8-18所示。8.6.2

定義結(jié)果集映射的標(biāo)簽(5)定義測試方法collectionTest()方法源代碼在文件8-8中的MapperTest類中定義測試方法collectionTest(),在測試方法中獲取MemberMapper對象,并通過MemberMapper對象調(diào)用其getMemberWithOrders()方法查詢?nèi)藛T信息,具體如下所示。8.6.2

定義結(jié)果集映射的標(biāo)簽(6)測試效果運(yùn)行文件8-8中的collectionTest()方法,運(yùn)行效果如下圖所示。8.6.3

定義和引用SQL片段的標(biāo)簽先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握定義和引用SQL片段的標(biāo)簽,能夠在MyBatis映射文件中使用<sql>和<include>標(biāo)簽定義和引用SQL片段8.6.3

定義和引用SQL片段的標(biāo)簽在實際的軟件開發(fā)過程中,數(shù)據(jù)庫查詢語句往往存在大量重復(fù)的SQL片段。為了提高代碼的可維護(hù)性、減少冗余代碼,MyBatis提供了定義和引用SQL片段的功能。通過在映射文件中使用<sql>和<include>標(biāo)簽,開發(fā)者可以將常用的SQL片段抽取出來,作為可復(fù)用的模塊,然后在其他查詢語句中輕松引用這些片段,從而極大地簡化SQL管理與維護(hù)工作。下面將對<sql>和<include>標(biāo)簽進(jìn)行講解。8.6.3

定義和引用SQL片段的標(biāo)簽(1)<sql>標(biāo)簽<sql>標(biāo)簽用于定義可重用的SQL片段,通過其id屬性指定SQL片段的唯一標(biāo)識。<sql>標(biāo)簽通常用于定義一些公共的SQL片段,比如一些固定的查詢條件或者JOIN語句等,這些片段可以在多個地方被引用,而不需要在每個地方都重新編寫相同的代碼。(2)<include>標(biāo)簽<include>標(biāo)簽用于在SQL語句中引用前面定義的SQL片段,通過其refid屬性指定需要引用的<sql>標(biāo)簽。8.6.2

定義結(jié)果集映射的標(biāo)簽下面通過一個示例演示<sql>和<include>標(biāo)簽的使用。<mappernamespace="com.itheima.mapper.UserMapper"> <sqlid="commonFields"> id,name,age,address </sql> <selectid="selectUsers"resultType="User"> SELECT <includerefid="commonFields"/> FROMuser_table WHEREstatus='ACTIVE' </select></mapper>本章小結(jié)本章對MyBatis快速入門進(jìn)行了講解。首先MyBatis概述進(jìn)行了講解,然后對通過一個MyBatis入門程序?qū)yBatis的工作流程進(jìn)行了講解,接著講解了MyBatis的核心組件,最后講解了MyBatis的核心配置文件和映射文件。通過本章的學(xué)習(xí),讀者可以了解MyBatis框架及其作用,熟悉MyBatis的工作流程,并能夠獨立完成MyBatis框架環(huán)境的搭建以及入門程序的編寫。本章小結(jié)第9章MyBatis的動態(tài)SQL《JavaEE企業(yè)級應(yīng)用開發(fā)教程(Spring+SpringMVC+MyBatis)(第3版)》學(xué)習(xí)目標(biāo)/Target掌握

<foreach>

標(biāo)簽的使用,能夠使用

<foreach>

標(biāo)簽遍歷數(shù)組、List和Map掌握<choose>標(biāo)簽、<when>標(biāo)簽和<otherwise>標(biāo)簽的使用,能夠使用<choose>標(biāo)簽、<when>標(biāo)簽和<otherwise>標(biāo)簽動態(tài)地構(gòu)建SQL語句掌握<if>標(biāo)簽的使用,能夠使用<if>標(biāo)簽動態(tài)地構(gòu)建SQL語句掌握條件拼接和修剪標(biāo)簽的使用,能夠使用<where>標(biāo)簽和<trim>標(biāo)簽動態(tài)地拼接和修剪SQL語句的片段掌握更新操作標(biāo)簽的使用,能夠使用<set>標(biāo)簽根據(jù)條件動態(tài)地生成SET子句章節(jié)概述/Summary在程序中操作數(shù)據(jù)庫時,經(jīng)常需要根據(jù)業(yè)務(wù)需求對SQL語句進(jìn)行拼接,如果進(jìn)行手動拼接,不僅要求開發(fā)人員處理空格、標(biāo)點符號等瑣碎細(xì)節(jié),而且容易增加代碼的復(fù)雜性,并提高出錯的可能性。為解決這一問題,MyBatis提供了強(qiáng)大的動態(tài)SQL功能,動態(tài)SQL指運(yùn)行時動態(tài)組裝SQL語句的技術(shù)。MyBatis的動態(tài)SQL功能允許開發(fā)人員利用簡潔的標(biāo)簽和語法,根據(jù)實際需求動態(tài)生成SQL語句,輕松實現(xiàn)復(fù)雜的SQL操作。根據(jù)功能來劃分,實現(xiàn)動態(tài)SQL的標(biāo)簽可以分為條件判斷標(biāo)簽、循環(huán)遍歷標(biāo)簽、條件拼接和修剪標(biāo)簽、更新操作標(biāo)簽。下面將對MyBatis的動態(tài)SQL進(jìn)行講解。目錄/Contents9.19.2條件判斷標(biāo)簽循環(huán)遍歷標(biāo)簽9.3條件拼接和修剪標(biāo)簽9.4更新操作標(biāo)簽條件判斷標(biāo)簽9.19.1

條件判斷標(biāo)簽MyBatis實現(xiàn)動態(tài)SQL時,條件判斷可以進(jìn)一步細(xì)分為根據(jù)單個條件的真假進(jìn)行判斷和根據(jù)多個條件分支進(jìn)行判斷,其中前者可以通過<if>標(biāo)簽實現(xiàn),后者則可以通過<choose>標(biāo)簽、<when>標(biāo)簽和<otherwise>標(biāo)簽實現(xiàn),下面分別對這兩類條件判斷標(biāo)簽進(jìn)行講解。9.1.1

<if>標(biāo)簽先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握<if>標(biāo)簽的使用,能夠使用<if>標(biāo)簽動態(tài)地構(gòu)建SQL語句9.1.1

<if>標(biāo)簽<if>標(biāo)簽可以根據(jù)指定的條件表達(dá)式的結(jié)果動態(tài)生成SQL語句,它提供了test屬性用于指定條件表達(dá)式,該表達(dá)式的值為true或false。如果條件表達(dá)式的值為true,則包含<if>標(biāo)簽內(nèi)部的SQL語句;如果條件表達(dá)式的值為false,則不包含。test屬性指定的條件表達(dá)式可以使用OGNL(ObjectGraphNavigationLanguage,對象導(dǎo)航圖語言)表達(dá)式、比較運(yùn)算符、邏輯運(yùn)算符等進(jìn)行構(gòu)建。例如,test="name!=null"表示當(dāng)name不為null時條件成立,test="name!=nullandname!=''”表示當(dāng)name不為null并且name的值不為空字符串時條件成立。9.1.1

<if>標(biāo)簽1.數(shù)據(jù)庫數(shù)據(jù)準(zhǔn)備在名稱為mybatis的數(shù)據(jù)庫中,創(chuàng)建存儲圖書信息的數(shù)據(jù)表book,并插入幾條測試數(shù)據(jù),具體代碼如下文件9-1所示。文件9-1book.sql源代碼假設(shè)有一個需要根據(jù)圖書id和名稱查詢圖書信息的需求,圖書id和名稱都是可選的查詢條件,這個時候可以使用<if>標(biāo)簽動態(tài)地構(gòu)建SQL語句進(jìn)行查詢。下面通過案例演示這個查詢的實現(xiàn)。9.1.1

<if>標(biāo)簽2.創(chuàng)建項目在IDEA中創(chuàng)建一個名稱為chapter09的Maven項目,并在項目的pom.xml文件中引入MyBatis、MySQL連接、單元測試的相關(guān)依賴,具體如文件9-2所示。文件9-2pom.xml源代碼9.1.1

<if>標(biāo)簽3.創(chuàng)建實體類在項目的src/main/java目錄下創(chuàng)建包com.itheima.entity,并在該包中創(chuàng)建與數(shù)據(jù)表book對應(yīng)的實體類Book,用于存儲圖書信息,具體如文件9-3所示。文件9-3Book.java源代碼9.1.1

<if>標(biāo)簽4.創(chuàng)建Mapper接口在項目的src/main/java目錄下創(chuàng)建包com.itheima.mapper,并在該包中創(chuàng)建操作Book對象和數(shù)據(jù)庫數(shù)據(jù)映射的Mapper接口BookMapper,并在該接口中定義方法queryByIdAndName(),該方法接收Book類型的參數(shù),具體如文件9-4所示。文件9-4BookMapper.java源代碼9.1.1

<if>標(biāo)簽5.創(chuàng)建核心配置文件在項目的src/main/resources目錄下創(chuàng)建一個名稱為mybatis-config.xml的文件作為MyBatis的核心配置文件,在mybatis-config.xml配置文件中配置數(shù)據(jù)庫連接信息和映射器相關(guān)信息,具體如9-5所示。文件9-5mybatis-config.xml源代碼9.1.1

<if>標(biāo)簽6.創(chuàng)建映射文件在src/main/resources目錄下創(chuàng)建多級文件夾com/itheima/mapper,在該文件夾下創(chuàng)建一個名稱為BookMapper.xml的文件,在該文件中定義查詢語句,用于根據(jù)傳入Book對象的id和名稱查詢對應(yīng)的圖書信息,如果圖書id和名稱不為null時,則根據(jù)對應(yīng)的id和名稱進(jìn)行查詢,具體如文件9-6所示。文件9-6BookMapper.xml源代碼9.1.1

<if>標(biāo)簽7.定義測試方法在項目的src/test/java目錄下創(chuàng)建BookTest類,為了減少冗余代碼,在此將創(chuàng)建SqlSession對象的代碼抽取成獨立的方法createSqlSession(),并定義測試方法ifTest(),在測試方法中通過SqlSession對象獲取BookMapper對象,并通過BookMapper對象調(diào)用其queryByIdAndName()方法查詢圖書信息,具體如文件9-7所示。文件9-7BookTest.java源代碼9.1.1

<if>標(biāo)簽8.測試效果運(yùn)行文件9-7中的ifTest()方法,運(yùn)行效果如下圖所示。9.1.1

<if>標(biāo)簽8.測試效果將文件9-7中第35行代碼修改為b.setName("西游記");后運(yùn)行文件9-7中的ifTest()方法,運(yùn)行效果如下圖所示。9.1.2<choose>標(biāo)簽、<when>標(biāo)簽和<otherwise>標(biāo)簽先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握<if>標(biāo)簽的使用,能夠使用<if>標(biāo)簽動態(tài)地構(gòu)建SQL語句在MyBatis中

溫馨提示

  • 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

提交評論