Java Web編程技術 課件 第14章MyBatis快速入門_第1頁
Java Web編程技術 課件 第14章MyBatis快速入門_第2頁
Java Web編程技術 課件 第14章MyBatis快速入門_第3頁
Java Web編程技術 課件 第14章MyBatis快速入門_第4頁
Java Web編程技術 課件 第14章MyBatis快速入門_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

JavaWeb編程技術本章首先介紹MyBaits框架及其工作原理、核心組件和運行機制,接下來介紹MyBaits應用的開發(fā)步驟,最后介紹MyBatis核心對象與日志管理。MyBatis概述MyBatis的開發(fā)實例MyBatis核心對象的使用MyBatis的日志管理第14章MyBatis快速入門MyBatis是一款輕量級的、開放源代碼的數(shù)據(jù)持久層框架。它支持普通SQL查詢、存儲過程和高級映射,用來實現(xiàn)應用程序的持久化功能。MyBatis概述MyBatis是一個對象-關系映射框架,它可以實現(xiàn)Java對象與SQL數(shù)據(jù)庫表的自動映射。MyBatis避免了幾乎所有的JDBC代碼和手動設置參數(shù)以及獲取結果集。MyBatis可以對配置和原生Map使用簡單的XML或注解,將接口和Java的POJO映射成數(shù)據(jù)庫中的記錄。有些持久層框架使用框架本身提供的查詢語言,比如,Hibernate提供的HQL(HibernateQueryLanguage)或者JPA提供的EJBQL(EnterpriseJavaBeanQueryLanguage)。MyBatis與其他的持久層框架(如Hibernate)最大的不同是它強調(diào)SQL的使用,即使用原生SQL操作數(shù)據(jù)庫。14.1MyBatis的使用14.1.1如果使用Maven構建工具創(chuàng)建項目,可以在pom.xml文件中添加MyBatis的有關依賴,如下所示。<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version></dependency>MyBatis的工作原理14.1.2MyBaits的執(zhí)行流程,如圖所示。(1)讀取mybatis-config.xml配置文件。(2)加載映射文件,即SQL映射文件。(3)構建會話工廠。(4)創(chuàng)建SqlSession會話對象。(5)動態(tài)地生成需要執(zhí)行的SQL語句。(6)執(zhí)行SQL語句。(7)輸出結果映射。案例學習:簡單的MyBatis應用14.2

使用MyBatis操作數(shù)據(jù)庫,用一個對Student對象保存和讀取的例子說明MyBatis的基本配置和使用。使用MyBatis進行持久化操作,通常操作步驟如下。在應用程序中,首先獲取SqlSessionFactory會話工廠對象,這需要加載MyBatis的配置文件,配置文件中配置了有關數(shù)據(jù)庫連接信息以及其他信息。使用SqlSessionFactory獲取SqlSession會話對象。調(diào)用SqlSession會話對象的getMapper()方法返回Mapper代理對象。開發(fā)POJO類和編寫映射文件,在其中定義要執(zhí)行的SQL語句。編寫Mapper接口,其中定義數(shù)據(jù)庫操作方法。執(zhí)行Mapper代理對象的方法操作數(shù)據(jù)庫。最后結束事務,關閉SqlSession。創(chuàng)建項目與環(huán)境14.2.1

(1)在IntelliJIDEA中,創(chuàng)建名為chapter14的JakartaEE項目,在pom.xml中添加下面依賴項,如清單14.1所示。

pom.xml清單14.1<dependency><groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>8.0.29</version>

</dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.5</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.5</version><scope>runtime</scope></dependency><dependency><groupId>com.weicoder</groupId><artifactId>log4j</artifactId><version>3.5.1-jdk11</version></dependency>(2)MyBatis默認使用Log4j輸出日志信息,所以要查看控制臺的輸出SQL語句,需要配置日志文件。在項目的src/main/resources目錄下創(chuàng)建perties文件,內(nèi)容如清單14.2所示。perties清單14.2log4j.rootLogger=ERROR,stdout

log4j.logger.com.boda.mapper=DEBUG

log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p[%t]-%m%n創(chuàng)建配置文件14.2.2MyBatis使用配置文件配置有關環(huán)境信息,其中關于數(shù)據(jù)庫的連接信息就應該定義在配置文件中。

假設我們使用JDBC連接MySQL數(shù)據(jù)庫elearning,MySQL數(shù)據(jù)庫驅動程序名為com.mysql.cj.jdbc.Driver,數(shù)據(jù)庫連接的URL為jdbc:mysql://localhost:3306/elearning,用戶名為root,口令為123456。配置文件存放在類路徑中(項目的src/main/resources目錄)。

配置文件mybatis-config.xml的具體內(nèi)容如下。mybatis-config.xml清單14.3@Controller<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfiguration

PUBLIC"-////DTDConfig3.0//EN"

"/dtd/mybatis-3-config.dtd"><configuration>

<!--配置日志實現(xiàn)--><settings>

<settingname="logImpl"value="LOG4J"/>

</settings><!--配置MyBatis運行環(huán)境--><environmentsdefault="development"><environmentid="development"><!--type="JDBC"代表使用JDBC的提交和回滾來管理事務--><transactionManagertype="JDBC"/><!--POOLED表示支持JDBC數(shù)據(jù)源連接池-->

<dataSourcetype="POOLED"><propertyname="driver"value="com.mysql.cj.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/elearning?useSSL=false&serverTimezone=UTC"/><propertyname="username"value="root"/><propertyname="password"value="123456"/></dataSource></environment></environments><!--mapper告訴MyBatis到哪里去找POJO類的映射文件--><mappers><mapperresource="com/boda/mapper/StudentMapper.xml"/></mappers>定義POJO類14.2.3POJO類用來存儲要與數(shù)據(jù)庫交互的數(shù)據(jù),它實際是一個JavaBean類。本案例使用Student類存儲與數(shù)據(jù)庫表students交互的數(shù)據(jù)。該類的定義與清單5.1的Student類完全相同,這里不再重復定義。Student類的定義符合JavaBean規(guī)范,為每個屬性定義了setter和getter方法,并且屬性的訪問權限都是private。所有的POJO類都需要一個默認的構造方法,因為MyBatis將使用Java的反射機制創(chuàng)建對象。如果沒有定義默認構造方法,編譯器將自動創(chuàng)建一個默認構造方法。定義映射文件14.2.4要實現(xiàn)POJO類Student與數(shù)據(jù)表students之間的對應關系,也就是實現(xiàn)POJO類的的屬性與數(shù)據(jù)表的各個列之間的對應關系。MyBatis使用映射文件實現(xiàn)這種對應關系的。映射文件是XML文件,應存放在指定包中。例如,為Student類定義的映射文件名為StudentMapper.xml,保存在com.boda.mapper包中,內(nèi)容如下。StudentMapper.xml清單14.4<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.boda.mapper.StudentMapper"><selectid="findAllStudents"resultType="com.boda.domain.Student">

SELECTstud_idASstudId,name,gender,birthday,phoneFROMstudents</select></mapper>Mapper代理接口14.2.5

要對數(shù)據(jù)庫操作,還必須為映射文件定義Mapper映射器接口,然后通過SqlSession的getMapper()方法得到一個Mapper代理對象,通過這個代理對象調(diào)用數(shù)據(jù)庫操作方法。

需要為每個映射文件定義一個接口,接口名應該與映射文件中的<mapper>元素的namespace屬性值的名稱相同。接口中的方法名和參數(shù)名必須要與映射文件中的<select>元素的id屬性和parameterType屬性一致。

例如,要為StudentMapper.xml文件定義一個Mapper接口,在Mapper接口通常為映射文件中每個SQL操作定義一個抽象方法。例如,假設在StudentMapper.xml文件中定義了一個SQL語句,這里就要在Mapper接口中定義一個抽象方法,方法名與SQL語句的id屬性值相同,它映射到SQL語句。Mapper接口必須與映射文件保存在相同的包中。清單14.5是StudentMapper接口的定義。StudentMapper.java清單14.5packagecom.boda.mapper;importjava.util.List;importcom.boda.domain.Student;publicinterfaceStudentMapper{

List<Student>findAllStudents();//查詢所有學生}

這里只需要程序員編寫接口(相當于DAO接口),然后由MyBatis框架根據(jù)接口的定義創(chuàng)建接口的動態(tài)代理對象,這個代理對象的方法體等同于DAO接口的實現(xiàn)類,從而不需要定義實現(xiàn)類。

雖然使用Mapper接口的編程方式很簡單,但使用時需遵循下面規(guī)范。Mapper接口的名稱必須與對應的映射文件名一致,如映射文件名StudentMapper.xml,則接口名應為StudentMapper。Mapper.xml文件中的namespace與Mapper接口的類路徑相同(即接口文件與映射文件放在同一個包中)。Mapper接口的方法名與Mapper.xml中定義的某個執(zhí)行語句的id相同。Mapper接口的方法的參數(shù)類型和Mapper.xml中定義的SQL語句的parameterType類型相同。Mapper接口的方法的返回值類型和Mapper.xml中定義的SQL語句的returnType類型相同。編寫測試類14.2.6使用MyBatis可以開發(fā)獨立的Java應用程序,也可以開發(fā)Web應用程序。本例只編寫一個應用程序,在main()中完成啟動MyBatis,創(chuàng)建各種對象并完成持久化操作。MyBatisTest.java清單14.6Stringresource="mybatis-config.xml";InputStreaminputStream=Resources.getResourceAsStream(resource);SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);

SqlSessionsession=sqlSessionFactory.openSession();//返回Mapper對象StudentMappermapper=session.getMapper(StudentMapper.class);//執(zhí)行查詢,返回List<Student>對象List<Student>lists=mapper.findAllStudents();for(Studentstudent:lists){System.out.println(student);}mit();//提交事務

session.close();//關閉會話對象MyBatisUtil工具類14.2.7

在上節(jié)例子中,如果要編寫多個方法測試數(shù)據(jù)庫操作,需要在每個方法中編寫相同的代碼讀取配置文件,并根據(jù)配置文件的信息構建SqlSessionFactory對象,然后創(chuàng)建SqlSession對象,這將導致大量的重復代碼。

為了簡化開發(fā),可以將重復的代碼封裝到一個工具類中,然后通過工具類來創(chuàng)建SqlSession,如清單14.7所示。MyBatisUtil.java清單14.7publicstaticSqlSessionFactorysqlSessionFactory=null;

static{try{ //使用MyBatis提供的Resources類加載MyBatis的配置文件 InputStreaminputStream= Resources.getResourceAsStream("mybatis-config.xml"); sqlSessionFactory= newSqlSessionFactoryBuilder().build(inputStream); }catch(Exceptione){e.printStackTrace(); } }publicstaticSqlSessiongetSession(){ returnsqlSessionFactory.openSession();}MyBatis核心對象14.3在使用MyBatis框架時,主要涉及兩個核心對象:SqlSessionFactory和SqlSession,它們在MyBatis框架中起著至關重要的作用。本節(jié)將對這兩個對象進行詳細講解。SqlSessionFactory14.3.1SqlSessionFactory是MyBatis框架十分重要的對象,它是單個數(shù)據(jù)庫映射關系經(jīng)過編譯后的內(nèi)存鏡像,其主要作用是創(chuàng)建SqlSession對象。每個基于MyBatis的應用都是以一個SqlSessionFactory實例為中心。

可以通過SqlSessionFactoryBuilder獲得SqlSessionFactory實例。而SqlSessionFactoryBuilder則可從XML配置文件或一個預先定制的Configuration類實例獲得。從配置文件中構建SqlSessionFactory實例非常簡單,建議使用類路徑下的配置文件。MyBatis提供一個Resources工具類,它包含一些實用方法,可從類路徑或其他位置加載配置文件。Stringresource="mybatis-config.xml";InputStreaminputStream=Resources.getResourceAsStream(resource);SqlSessionFactorysqlSessionFactory=

newSqlSessionFactoryBuilder().build(inputStream);上述代碼使用Resources類的getResourceAsStream()方法加載配置文件。MyBatis配置文件mybatis-config.xml中包含了對MyBatis系統(tǒng)的核心設置,包含獲取數(shù)據(jù)庫連接實例的數(shù)據(jù)源(DataSource)。接下來使用SqlSessionFactoryBuilder的build()方法創(chuàng)建一個

SqlSessionFactory對象。SqlSession14.3.2SqlSession稱為SQL會話,它是應用程序與持久存儲層之間執(zhí)行交互操作的一個對象。SqlSession對象提供了數(shù)據(jù)庫中所有執(zhí)行SQL操作的方法,它的底層封裝了JDBC連接。

創(chuàng)建SqlSession對象很容易,用SqlSessionFactory對象的openSession()方法即可創(chuàng)建一個SqlSession對象。關閉操作很重要,應該把這個關閉操作放到finally塊中以確保每次都能執(zhí)行關閉。下面代碼能確保SqlSession使用后被關閉。

SqlSessionsqlSession=sqlSessionFactory.openSession();try{//執(zhí)行某種操作}finally{

mit();//提交事務

session.close();//關閉會話對象}SqlSession常用方法14.3.2

通過執(zhí)行SqlSession對象的方法可以實現(xiàn)各種對象持久化操作,常用方法如下:intinsert(Stringstatement)intdelete(Stringstatement)intupdate(Stringstatement)<T>TselectOne(Stringstatement)<E>List<E>selectList(Stringstatement)<K,V>Map<K,V>selectMap(Stringstatement,Objectparameter,StringmapKey)

publicvoidcommit()publicvoidrollback()publicvoidclose()<T>TgetMapper(Class<T>type):返回Mapper接口的代理對象,參數(shù)type是Mapper的接口類型,該對象關聯(lián)了SqlSession對象,直接調(diào)用它的方法操作數(shù)據(jù)庫。

定義了Mapper接口之后,在應用程序中就可以使用SqlSession的getMapper()方法得到一個代理對象,如下所示。得到映射器代理對象后,就可以調(diào)用Mapper接口中定義的方法操作數(shù)據(jù)庫,下面代碼執(zhí)行selectAllStudent()方法查詢所有學生。SqlSessionsession=MyBatisUtil.getSession();StudentMappermapper=session.getMapper(StudentMapper.class);List<Student>lists=mapper.selectAllStudent();Studentstudent=newStudent(103,"張明宇","女",LocalDate.of(1998,5,2),"55555555");mapper.insertStudent(student);日志管理14.4Mybatis內(nèi)置的日志工

溫馨提示

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

評論

0/150

提交評論