第5章 Spring Boot訪問(wèn)SQL數(shù)據(jù)庫(kù)_第1頁(yè)
第5章 Spring Boot訪問(wèn)SQL數(shù)據(jù)庫(kù)_第2頁(yè)
第5章 Spring Boot訪問(wèn)SQL數(shù)據(jù)庫(kù)_第3頁(yè)
第5章 Spring Boot訪問(wèn)SQL數(shù)據(jù)庫(kù)_第4頁(yè)
第5章 Spring Boot訪問(wèn)SQL數(shù)據(jù)庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章SpringBoot訪問(wèn)

SQL數(shù)據(jù)庫(kù)第5章SpringBoot訪問(wèn)SQL數(shù)據(jù)庫(kù)5.1

配置數(shù)據(jù)源5.2

使用JdbcTemplate5.3

使用SpringDataJPA5.4

整合MyBatis25.1配置數(shù)據(jù)源數(shù)據(jù)庫(kù)分為兩種,即關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)。關(guān)系型數(shù)據(jù)庫(kù)是指通過(guò)關(guān)系模型組織數(shù)據(jù)的數(shù)據(jù)庫(kù),并且可以利用外鍵等保持一致性,如MySQL、Oracle、SQLServer等;而非關(guān)系型數(shù)據(jù)庫(kù)其實(shí)不像是數(shù)據(jù)庫(kù),更像是一種以key-value模式存儲(chǔ)對(duì)象的結(jié)構(gòu),如Redis、MangoDB等。

SpringFramework為訪問(wèn)SQL數(shù)據(jù)庫(kù)提供了廣泛的支持。從直接使用JdbcTemplate進(jìn)行JDBC訪問(wèn)到完全的對(duì)象關(guān)系映射(objectrelationalmapping)技術(shù),比如Hibernate、Mybatis。SpringData提供了更多級(jí)別的功能,直接從接口創(chuàng)建的Repository實(shí)現(xiàn),并使用了約定從方法名生成查詢(xún)。本節(jié)講解SpringBoot如何使用MySQL、SQLServer、Oracle等不同的關(guān)系型數(shù)據(jù)庫(kù)。

35.1配置數(shù)據(jù)源1.使用MySQL數(shù)據(jù)庫(kù)在SpringBoot中使用MySQL數(shù)據(jù)庫(kù),以MySQL8.0為例,在pom.xml文件中添加依賴(lài),并在perties文件中配置數(shù)據(jù)源信息。(1)在pom.xml文件中添加MySQL依賴(lài),代碼如下所示。

(2)在perties配置文件中配置數(shù)據(jù)源信息,代碼如下所示。4<dependency>

<groupId>mysql</groupId>

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

<scope>runtime</scope></dependency>

#數(shù)據(jù)庫(kù)驅(qū)動(dòng)spring.datasource.driver-class-name=

com.mysql.cj.jdbc.Driver#數(shù)據(jù)庫(kù)地址spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC#數(shù)據(jù)庫(kù)用戶(hù)名spring.datasource.username=root#數(shù)據(jù)庫(kù)密碼spring.datasource.password=1234565.1配置數(shù)據(jù)源2.使用SQLServer數(shù)據(jù)庫(kù)

在SpringBoot中使用SQLServer數(shù)據(jù)庫(kù)。(1)在pom.xml文件中添加SQLServer依賴(lài),代碼如下所示。

(2)在perties配置文件中配置數(shù)據(jù)源信息,代碼如下所示。5<dependency>

<groupId>com.microsoft.sqlserver</groupId>

<artifactId>mssql-jdbc</artifactId>

<scope>runtime</scope></dependency>

spring.datasource.driver-class-name=

com.microsoft.sqlserver.jdbc.SQLServerDriverspring.datasource.url=jdbc:sqlserver://localhost:1433;DatabaseName=testspring.datasource.username=saspring.datasource.password=1234565.1配置數(shù)據(jù)源3.使用Oracle數(shù)據(jù)庫(kù)在SpringBoot中使用Oracle數(shù)據(jù)庫(kù)。(1)在pom.xml文件中添加Oracle依賴(lài),代碼如下所示。

(2)在perties配置文件中配置數(shù)據(jù)源信息,代碼如下所示。6<dependency>

<groupId>com.oracle.database.jdbc</groupId>

<artifactId>ojdbc8</artifactId>

<scope>runtime</scope></dependency>

spring.datasource.driver-class-name=

oracle.jdbc.driver.OracleDriverspring.datasource.url=jdbc:oracle:thin:@localhost:1521:testspring.datasource.username=adminspring.datasource.password=1234565.2使用JdbcTemplate

JDBC(JavaDataBaseConnectivity)是用于連接數(shù)據(jù)庫(kù)的規(guī)范,也就是用于執(zhí)行數(shù)據(jù)庫(kù)SQL語(yǔ)句的JavaAPI。JdbcTemplate是Spring對(duì)JDBC的封裝,目的是讓JDBC更加易于使用,替我們完成所有的JDBC底層工作。因此,對(duì)于數(shù)據(jù)庫(kù)的操作,不再需要每次都進(jìn)行連接、打開(kāi)、關(guān)閉了。通過(guò)JdbcTemplate不需要進(jìn)行全局修改,就可以輕松地應(yīng)對(duì)開(kāi)發(fā)人員常常要面對(duì)的增刪改查的操作。更為關(guān)鍵的是,JdbcTemplate對(duì)象也是通過(guò)自動(dòng)配置機(jī)制注冊(cè)到Ioc容器中,自動(dòng)化配置類(lèi)是JdbcTemplateAutoConfiguration。在JdbcTemplate中,提供了大量的查詢(xún)和更新數(shù)據(jù)庫(kù)的方法,SpringJDBC就是使用這些方法來(lái)操作數(shù)據(jù)庫(kù)的,使用JdbcTemplate類(lèi)可實(shí)現(xiàn)對(duì)數(shù)據(jù)表的數(shù)據(jù)進(jìn)行增刪改查操作。75.2.1JdbcTemplate增刪改的操作

update()方法可以完成增加、修改和刪除操作,其常用方法具體介紹如下。intupdate(Stringsql):該方法是最簡(jiǎn)單的update方法重載形式,可以直接傳入SQL語(yǔ)句并返回受影響的行數(shù)。intupdate(PreparedStatementCreatorpsc):該方法執(zhí)行從PreparedStatementCreator返回的語(yǔ)句,然后返回受影響的行數(shù)。intupdate(Stringsql,PreparedStatementSetterpss):該方法通過(guò)PreparedStatementSetter設(shè)置SQL語(yǔ)句中的參數(shù),并返回受影響的行數(shù)。intupdate(Stringsql,Object...args):該方法使用Object...args設(shè)置SQL語(yǔ)句中的參數(shù),要求參數(shù)不能為空,并返回受影響的行數(shù)。85.2.1JdbcTemplate增刪改的操作下面通過(guò)示例講解使用JdbcTemplate的update()方法實(shí)現(xiàn)對(duì)MySQL數(shù)據(jù)庫(kù)中的數(shù)據(jù)表進(jìn)行增刪改的操作,步驟如下。

(1)在MySQL數(shù)據(jù)庫(kù)中,新建一個(gè)chapter05的數(shù)據(jù)庫(kù),并在新建user數(shù)據(jù)表,輸入幾條記錄,其表結(jié)構(gòu)如圖5-1所示。(2)新建一個(gè)SpringBoot工程chapter05jdbctemplate,Group和Packagename為com.yzpc,在Dependencies依賴(lài)中選擇Web節(jié)點(diǎn)下的SpringWeb依賴(lài)和SQL節(jié)點(diǎn)下的JDBCAPI、MySQLDriver依賴(lài),單擊Finish按鈕,如圖5-2所示。pom.xml文件中添加的依賴(lài)代碼,代碼如下所示。9<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>5.2.1JdbcTemplate增刪改的操作

在項(xiàng)目的perties配置文件中配置數(shù)據(jù)庫(kù)基本連接信息,這樣JdbcTemplate才能正常連接到數(shù)據(jù)庫(kù),如下所示。(3)在項(xiàng)目src/main/java/路徑下的com.yzpc包中,新建一個(gè)pojo包,并在該包中新建User實(shí)體類(lèi),代碼如下所示。(4)在項(xiàng)目src/main/java/路徑下的com.yzpc包中,新建一個(gè)dao包,并在該包中新建UserDao接口,并在接口中定義添加、修改、刪除用戶(hù)的方法,代碼如下所示。在com.yzpc.dao包中,新建一個(gè)impl包,在該包中創(chuàng)建UserDao接口的實(shí)現(xiàn)類(lèi)UserDaoImpl,并在類(lèi)中實(shí)現(xiàn)添加、修改和刪除的方法,這里已添加為例,代碼如下所示。10spring.datasource.driver-class-name=

com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/chapter05?&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=123456packagecom.yzpc.pojo;publicclassUser{

privateintid;

privateStringusername;

privateStringpassword;

//此處省略構(gòu)造方法

//此處省略相應(yīng)屬性的setter/getter方法

//重寫(xiě)toString方法

@Override

publicStringtoString(){

return"User{"+"id="+id+",username='"+username+'\''+",password='"+password+'\''+'}';}}packagecom.yzpc.dao;importcom.yzpc.pojo.User;publicinterfaceUserDao{

publicintaddUser(Useruser);

publicintupdateUser(Useruser);

publicintdeleteUser(intid);}@RepositorypublicclassUserDaoImplimplementsUserDao{

@Autowired

privateJdbcTemplatejdbcTemplate;

@Override

publicintaddUser(Useruser){

returnjdbcTemplate.update("insertintouser(username,password)values(?,?)",user.getUsername(),user.getPassword());}

//省略u(píng)pdateUser()、deleteUser()方法}5.2.1JdbcTemplate增刪改的操作(5)在src/main/java/路徑下的com.yzpc包中,新建一個(gè)controller包,在該包中新建UserController類(lèi),并在該類(lèi)中添加增加、刪除、修改的方法,這里以添加用戶(hù)功能為例,代碼如下所示。

(6)啟動(dòng)項(xiàng)目,在瀏覽器中訪問(wèn)http://localhost:8080/addUser,插入數(shù)據(jù)成功的話,可以看到控制臺(tái)輸出了相應(yīng)的提示信息,如圖5-3所示。在瀏覽器的頁(yè)面上也輸出了同樣的提示信息,如圖5-4所示。11@RestControllerpublicclassUserController{//使用@Autowired注解實(shí)現(xiàn)UserController對(duì)UserDao的依賴(lài)注入

@Autowired

privateUserDaouserDao;

@GetMapping("/addUser")

publicStringaddUser(){

intresult=userDao.addUser(newUser("yzpc1","yzpc1"));

Stringmessage;

if(result>0){

message=“成功往數(shù)據(jù)表中插入了

"+result+"條數(shù)據(jù)!";}else{

message="插入數(shù)據(jù)失??!";}

System.out.println(message);

returnmessage;}

//省略u(píng)pdateUser()、deleteUser()方法}5.2.2JdbcTemplate查詢(xún)的操作JdbcTemplate對(duì)JDBC的流程做了封裝,提供了大量的query()方法來(lái)處理各種對(duì)數(shù)據(jù)庫(kù)表的查詢(xún)操作,常用的query()方法如下:Listquery(Stringsql,PreparedStatementSetterpss,RowMapperrowMapper)

Listquery(Stringsql,Object[]args,RowMapperrowMapper)

queryForObject(Stringsql,Object[]args,RowMapperrowMapper)

queryForList(Stringsql,Object[]args,class<T>elementType)125.2.2JdbcTemplate查詢(xún)的操作下面我們嘗試一下從user表中查詢(xún)數(shù)據(jù),在UserDao接口中增加按照id查詢(xún)用戶(hù)的方法和查詢(xún)所有用戶(hù)的方法,在UserDaoImpl中具體實(shí)現(xiàn)兩個(gè)方法,其實(shí)現(xiàn)步驟如下:(1)在UserDao接口中,分別創(chuàng)建一個(gè)通過(guò)id查詢(xún)單個(gè)用戶(hù)信息和查詢(xún)所有用戶(hù)信息的方法,代碼如下所示。(2)在UserDao接口實(shí)現(xiàn)類(lèi)UserDaoImpl中,實(shí)現(xiàn)接口中的方法,并使用query()方法分別進(jìn)行查詢(xún),代碼如下所示。(3)在UserController類(lèi)中,添加查詢(xún)方法getUserById()、getAllUser()來(lái)進(jìn)行查詢(xún),代碼如下所示。13publicUsergetUserById(intid);publicList<User>getAllUser();//實(shí)例化BeanPropertyRowMapper對(duì)象,將結(jié)果集通過(guò)Java的反射機(jī)制映射到Java對(duì)象中RowMapper<User>rowMapper=newBeanPropertyRowMapper<User>(User.class);@OverridepublicUsergetUserById(intid){

Stringsql="select*fromuserwhereid=?";

returnjdbcTemplate.queryForObject(sql,rowMapper,id);}@OverridepublicList<User>getAllUser(){

Stringsql="select*fromUser";

returnjdbcTemplate.query(sql,rowMapper);}@GetMapping("/getUserById")publicUsergetUserById(intid){

Useruser;

user=userDao.getUserById(id);

if(user!=null){

System.out.println("查詢(xún)id為"+id+"的User對(duì)象為:"

+user);}

returnuser;}@GetMapping("/getAllUser")publicList<User>getAllUser(){

List<User>users=userDao.getAllUser();

if(users!=null){

System.out.println("所有User對(duì)象列表為:");

for(Useruser:users){//循環(huán)輸出結(jié)集合中對(duì)象

System.out.println(user);}}

returnusers;}5.2.2JdbcTemplate查詢(xún)的操作

(4)重新運(yùn)行項(xiàng)目,在瀏覽器中訪問(wèn)http://localhost:8080/getUserById?id=10001,根據(jù)id查詢(xún)用戶(hù)控制臺(tái)輸出結(jié)果,如圖5-9所示。

訪問(wèn)http://localhost:8080/getAllUser,查詢(xún)所有用戶(hù)控制臺(tái)輸出結(jié)果,如圖5-10所示。

如果查詢(xún)一個(gè)不存在的數(shù)據(jù),例如http://localhost:8080/getUserById?id=10006,控制臺(tái)拋出了錯(cuò)誤異常,如圖5-11所示。145.2.2JdbcTemplate查詢(xún)的操作

查看DataAccessUtils源代碼,看到nullableSingleResult在查到空集合的時(shí)候,默認(rèn)拋出了EmptyResultDataAccessException異常,代碼如下所示。修改getUserById()方法代碼,在方法體內(nèi)捕獲EmptyResultDataAccessException異常,代碼修改如下所示。重新啟動(dòng)項(xiàng)目,測(cè)試方法和前面一致。同樣,對(duì)于getAllUser()方法,去執(zhí)行查詢(xún)查詢(xún)操作時(shí),假設(shè)數(shù)據(jù)表中沒(méi)有數(shù)據(jù),也會(huì)拋出EmptyResultDataAccessException,在getAllUser()方法體內(nèi)補(bǔ)獲異常的方法和在getUserById()方法體中基本一致。15@Nullablepublicstatic<T>TnullableSingleResult(@NullableCollection<T>results)throwsIncorrectResultSizeDataAccessException

{

if(CollectionUtils.isEmpty(results)){

thrownewEmptyResultDataAccessException(1);}elseif(results.size()>1){

thrownewIncorrectResultSizeDataAccessException(1,results.size());}else{

returnresults.iterator().next();}}@GetMapping("/getUserById")publicUsergetUserById(intid){

Useruser=null;

try{user=userDao.getUserById(id);

if(user!=null){

System.out.println("查詢(xún)id為"+id+"的User對(duì)象為:"+user);}}catch(EmptyResultDataAccessExceptione){

System.err.println("未查詢(xún)到id為

"+id+"的記錄!");

returnnull;}

returnuser;}5.3使用SpringDataJPA

5.3.1SpringDataJPA介紹

SpringData是Spring的一個(gè)子項(xiàng)目,旨在統(tǒng)一和簡(jiǎn)化各類(lèi)型數(shù)據(jù)的持久化存儲(chǔ)方式,而不局限于是關(guān)系型數(shù)據(jù)還是非關(guān)系型數(shù)據(jù)庫(kù)。JPA(JavaPersistenceAPI)即Java的持久層的API,用于對(duì)象的持久化,它是一個(gè)非常強(qiáng)大的ORM持久化的解決方案。JPA是一個(gè)規(guī)范化接口,封裝了Hibernate的操作作為默認(rèn)實(shí)現(xiàn),讓用戶(hù)不通過(guò)任何配置即可完成數(shù)據(jù)庫(kù)的操作。SpringData在JPA規(guī)范的基礎(chǔ)上,充分利用其優(yōu)點(diǎn),提出了SpringDataJPA模塊對(duì)具有ORM關(guān)系數(shù)據(jù)進(jìn)行持久化操作。JPA、SpringData和Hibernate關(guān)系,如圖5-12所示。165.3.1SpringDataJPA介紹

SpringDataJPA是Spring在ORM框架、JPA規(guī)范的基礎(chǔ)上封裝的一套新的JPA應(yīng)用規(guī)范,也是靠Hibernate等ORM框架實(shí)現(xiàn)的一種解決方案。它提供了增刪改查等功能,可以使用較少的代碼實(shí)現(xiàn)數(shù)據(jù)操作,同時(shí)還易于擴(kuò)展。SpringDataJPA是Spring提供的一套對(duì)JPA操作更加高級(jí)的封裝,是在JPA規(guī)范下的專(zhuān)門(mén)用來(lái)進(jìn)行數(shù)據(jù)持久化的解決方案。SpringDataJPA通過(guò)基于JPA的Repository極大地簡(jiǎn)化了JPA的寫(xiě)法,在幾乎不寫(xiě)實(shí)現(xiàn)的情況下,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的訪問(wèn)和操作。使用SpringDataJPA建立數(shù)據(jù)訪問(wèn)層十分方便,只需要定義一個(gè)繼承JpaRepository接口的接口即可。繼承了JpaRepository接口的自定義訪問(wèn)接口,具有JpaRepository接口的所有數(shù)據(jù)訪問(wèn)操作方法,JpaRepository接口的源代碼如下所示。17@NoRepositoryBeanpublicinterfaceJpaRepository<T,ID>extendsPagingAndSortingRepository<T,ID>,QueryByExampleExecutor<T>{List<T>findAll(); //查找所有實(shí)體List<T>findAll(Sortvar1); //排序、查找所有實(shí)體List<T>findAllById(Iterable<ID>var1);//返回指定一組ID實(shí)體<SextendsT>List<S>saveAll(Iterable<S>var1);//保存集合

voidflush(); //執(zhí)行緩存與數(shù)據(jù)庫(kù)同步<SextendsT>SsaveAndFlush(Svar1);//強(qiáng)制執(zhí)行持久化

voiddeleteInBatch(Iterable<T>var1);

//刪除一個(gè)實(shí)體集合

voiddeleteAllInBatch(); //刪除所有實(shí)體TgetOne(IDvar1);//返回ID對(duì)應(yīng)的實(shí)體。若不存在,則返回空值

//查詢(xún)滿(mǎn)足Example的所有對(duì)象<SextendsT>List<S>findAll(Example<S>var1);

//查詢(xún)滿(mǎn)足Example的所有對(duì)象,并且進(jìn)行排序返回<SextendsT>List<S>findAll(Example<S>var1,Sortvar2);}5.3.1SpringDataJPA介紹

JpaRepository接口繼承了PagingAndSortingRepository接口、QueryByExampleExecutor接口,JpaRepository接口的繼承關(guān)系,如圖5-13所示。JpaRepository接口繼承關(guān)系中涉及的接口進(jìn)行說(shuō)明:Repository接口是SpringDataJPA提供的用于自定義Repository接口的頂級(jí)父接口,該接口中沒(méi)有聲明任何方法。CrudRepository接口是Repository的繼承接口之一,包含了一些基本的CRUD方法。PagingAndSortingRepository接口繼承CrudRepository接口的同時(shí),提供了分頁(yè)和排序兩個(gè)方法。QueryByExampleExecutor接口是進(jìn)行條件封裝查詢(xún)的頂級(jí)父接口,允許通過(guò)Example實(shí)例執(zhí)行復(fù)雜條件查詢(xún)。185.3.2整合SpringDataJPA下面通過(guò)示例來(lái)講解SpringBoot整合SpringDataJPA,步驟如下:(1)新建一個(gè)SpringBoot工程chapter05jpa,Group和Packagename為com.yzpc,在Dependencies依賴(lài)中選擇Web節(jié)點(diǎn)下的SpringWeb依賴(lài)和SQL節(jié)點(diǎn)下的SpringDataJPA、MySQLDriver依賴(lài),單擊Finish按鈕,如圖5-14所示。pom.xml中自動(dòng)添加的依賴(lài)代碼,如下所示。

(2)在perties配置文件中加入數(shù)據(jù)庫(kù)配置,與5.2.1小節(jié)第(2)步中介紹的一致。新建一個(gè)chapter05jpa的數(shù)據(jù)庫(kù),接下來(lái)設(shè)置JPA的基本配置,如下所示。19<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!--省略Web中SpringWeb依賴(lài)和SQL中的MySQlDriver依賴(lài)代碼-->#省略數(shù)據(jù)庫(kù)配置的設(shè)置,參看5.2.1小節(jié)第(2)步,數(shù)據(jù)庫(kù)使用chapter05jpa#JPA對(duì)應(yīng)的數(shù)據(jù)庫(kù)類(lèi)型spring.jpa.database=mysql#在控制臺(tái)打印SQLspring.jpa.show-sql=true#update:項(xiàng)目啟動(dòng),加載Hibernate時(shí),根據(jù)實(shí)體類(lèi)類(lèi)更新數(shù)據(jù)庫(kù)中的表#validate:在加載Hibernate時(shí),驗(yàn)證創(chuàng)建數(shù)據(jù)表的結(jié)構(gòu)#create:每次加載Hibernate時(shí),重新創(chuàng)建數(shù)據(jù)表結(jié)構(gòu),造成數(shù)據(jù)丟失#create-drop:加載Hibernate時(shí)創(chuàng)建,退出時(shí)刪除表結(jié)構(gòu)#none:?jiǎn)?dòng)時(shí)不做任何操作spring.jpa.hibernate.ddl-auto=create5.3.2整合SpringDataJPA

(3)在項(xiàng)目的src/mian/java/路徑下的com.yzpc包中,新建一個(gè)pojo包,并在該包中新建一個(gè)User實(shí)體類(lèi),添加JPA對(duì)應(yīng)的注解進(jìn)行映射配置,代碼如下所示。(4)在項(xiàng)目的src/mian/java/路徑下的com.yzpc包中,新建一個(gè)repository包,并在該包中新建一個(gè)用于對(duì)數(shù)據(jù)庫(kù)表user進(jìn)行操作的接口UserRepository,代碼如下所示。(5)在項(xiàng)目的src/mian/java/路徑下的com.yzpc包中,新建一個(gè)controller包,并在該包中新建一個(gè)用于測(cè)試的類(lèi)UserController,這里以存儲(chǔ)用戶(hù)和添加用戶(hù)為例,代碼如下所示。205.3.2整合SpringDataJPA(6)啟動(dòng)項(xiàng)目,在控制臺(tái)輸出Hibernate的相關(guān)語(yǔ)句,如圖5-15所示。這是因?yàn)?,在perties配置文件中spring.jpa.hibernate.ddl-auto的值設(shè)置為create,即通過(guò)Hibernate實(shí)現(xiàn)數(shù)據(jù)表單的創(chuàng)建。通過(guò)SQLyog工具,查看數(shù)據(jù)庫(kù),發(fā)現(xiàn)user數(shù)據(jù)表已經(jīng)創(chuàng)建,但并沒(méi)有記錄,下面分別來(lái)測(cè)試相應(yīng)的方法實(shí)現(xiàn)。訪問(wèn)http://localhost:8080/saveUser,查看控制臺(tái),如圖5-16所示;查看數(shù)據(jù)表,如圖5-17所示。

訪問(wèn)http://localhost:8080/addUser?username=sj&password=sj,查看控制臺(tái)輸出。就可以看到一條insert的插入語(yǔ)句,查看數(shù)據(jù)表,發(fā)現(xiàn)增加了一條記錄,查看數(shù)據(jù)表,如圖所示。215.3.2整合SpringDataJPA

訪問(wèn)http://localhost:8080/updateUser?id=4&username=sss&password=sss,查看數(shù)據(jù)表發(fā)現(xiàn)id為4的記錄的username和password字段都已經(jīng)修改為sss,如圖所示。

訪問(wèn)http://localhost:8080/deleteUser?id=4,查看數(shù)據(jù)表,id為4記錄已經(jīng)被刪除,如圖所示。

訪問(wèn)http://localhost:8080/getUserById?id=3,網(wǎng)頁(yè)頁(yè)面輸出id為3的記錄,如圖所示;查看控制臺(tái),輸出相關(guān)信息,如圖所示。

訪問(wèn)http://localhost:8080/getAllUser,查詢(xún)所有用戶(hù)信息,網(wǎng)頁(yè)頁(yè)面顯示查詢(xún)的所有用戶(hù),如圖所示;控制臺(tái)輸出查詢(xún)的所有用戶(hù),如圖所示。225.3.2整合SpringDataJPA

訪問(wèn)http://localhost:8080/findUserById?id=2,這里調(diào)用的是UserRepository接口中的自定義的方法,查詢(xún)id為2的用戶(hù)信息,控制臺(tái)輸出該用戶(hù),如圖所示。

訪問(wèn)http://localhost:8080/findUserByName?username=admin,查詢(xún)username為admin的用戶(hù)信息,控制臺(tái)輸出,如圖所示。

訪問(wèn)http://localhost:8080/findMaxIdUser,查詢(xún)最大id號(hào)的用戶(hù)信息,控制臺(tái)輸出,如圖所示。

如果數(shù)據(jù)表中沒(méi)有記錄,或者要操作的條件不存在,可能會(huì)出現(xiàn)異常,大家可以參考5.2小節(jié)中對(duì)于相關(guān)異常的處理。235.4整合MyBatisMyBatis和JPA一樣,也是一款優(yōu)秀的持久層框架,它支持定制化SQL、存儲(chǔ)過(guò)程以及高級(jí)映射,避免了幾乎所有的JDBC代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。5.4.1基于XML配置的方式整合MyBatis下面通過(guò)具體的示例來(lái)講解SpringBoot整合MyBatis,具體步驟如下。(1)新建一個(gè)SpringBoot工程chapter05mybatis,Group和Packagename為com.yzpc,在Dependencies依賴(lài)中選擇Web節(jié)點(diǎn)下的SpringWeb依賴(lài)和SQL節(jié)點(diǎn)下的MyBatisFramework、MySQLDriver依賴(lài)。pom.xml中自動(dòng)添加的依賴(lài)代碼,如下所示。

在perties配置文件中加入數(shù)據(jù)庫(kù)連接配置,與5.2.1小節(jié)第(2)步中介紹的一致。24<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!--省略Web中SpringWeb依賴(lài)和SQL中的MySQlDriver依賴(lài)代碼-->5.4.1基于XML配置的方式整合MyBatis(2)在MySQL中,創(chuàng)建一個(gè)名為chapter05mybatis的數(shù)據(jù)庫(kù),在該數(shù)據(jù)庫(kù)中創(chuàng)建user數(shù)據(jù)表,并預(yù)先插入幾條測(cè)試數(shù)據(jù),相應(yīng)的SQL語(yǔ)句如下所示。(3)在項(xiàng)目的src/mian/java/路徑下的com.yzpc包中,新建一個(gè)pojo的包,并在該包中新建與數(shù)據(jù)表user對(duì)應(yīng)的實(shí)體類(lèi)User,代碼如下所示。(4)在項(xiàng)目的src/mian/java/路徑下的com.yzpc包中,新建一個(gè)mapper的包,在并在該包中新建UserMapper的接口,代碼如下所示。25#創(chuàng)建數(shù)據(jù)庫(kù)CREATEDATABASEchapter05mybatis;#選擇使用數(shù)據(jù)庫(kù)USEchapter05mybatis;#創(chuàng)建user數(shù)據(jù)表并插入相關(guān)數(shù)據(jù)DROPTABLEIFEXISTSUSER;CREATETABLEUSER(idINT(10)NOTNULLAUTO_INCREMENT,usernameVARCHAR(20)DEFAULTNULL,passwordVARCHAR(20)DEFAULTNULL,PRIMARYKEY(id))ENGINE=INNODBDEFAULTCHARSET=utf8;INSERTINTOUSERVALUES(1,'admin','admin');INSERTINTOUSERVALUES(2,'yzpc','yzpc');INSERTINTOUSERVALUES(3,'my','my');packagecom.yzpc.pojo;publicclassUser{

privateintid;

privateStringusername;

privateStringpassword;

//此處省略相應(yīng)屬性的setter/getter方法

//此處省略構(gòu)造方法

//重寫(xiě)toString方法}packagecom.yzpc.mapper;importcom.yzpc.pojo.User;importorg.apache.ibatis.annotations.Mapper;importjava.util.List;@Mapper //表明該接口是一個(gè)MyBatis中的MapperpublicinterfaceUserMapper{

publicintaddUser(Useruser);

publicintupdateUser(Useruser);

publicintdeleteUser(intid);

publicUsergetUserById(intid);

publicList<User>getAllUser();}5.4.1基于XML配置的方式整合MyBatis(5)在src/main/resources/路徑下新建mapper目錄,并在該目錄下,新建UserMapper.xml文件,對(duì)應(yīng)前面UserMapper接口的方法,#{}用來(lái)代替接口中的參數(shù),實(shí)體類(lèi)中的屬性可以直接通過(guò)#{實(shí)體類(lèi)屬性名}獲取,內(nèi)容如下所示。UserMapper.xml放在resources目錄下,這樣就不用擔(dān)心打包時(shí)被忽略了,但是放在resources目錄下,又不能自動(dòng)被掃描到,此時(shí)在perties中添加mybatis掃描mapper的路徑,需要在perties配置文件中指定位置,代碼如下所示。UserMapper.xml除了放在resources目錄下,還可以是直接放在UserMapper所在的com.yzpc.mapper包下,該包下的UserMapper.xml會(huì)被自動(dòng)掃描到,需要在pom.xml文件中再添加如下配置。26<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC“-////DTDMapper3.0//EN”

“/dtd/mybatis-3-mapper.dtd”>

<!--此處與接口類(lèi)地址對(duì)應(yīng)-->

<mappernamespace=“com.yzpc.mapper.UserMapper”>

<!--此處與接口方法名對(duì)應(yīng),指定參數(shù)類(lèi)型與返回結(jié)果類(lèi)型-->

<insertid=“addUser”parameterType=“com.yzpc.pojo.User”>

insertintouser(username,password)values(#{username},#{password})

</insert>

<!--省略u(píng)pdateUser、deleteUser、getUserById--

>

<selectid="getAllUser"resultType="com.yzpc.pojo.User">

select*fromuser

</select>

</mapper>#指定映射xml文件位置#classpath對(duì)應(yīng)resources,*.xml表示配置mapper下所有xml文件mybatis.mapper-locations=classpath:mapper/*.xml<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory></resource></resources></build>5.4.1基于XML配置的方式整合MyBatis(6)在項(xiàng)目的src/mian/java/路徑下的com.yzpc包中,新建controller包,在該包中新建UserController類(lèi),并在該類(lèi)中添加增刪改查的方法,這里增加用戶(hù)為例,代碼如下所示。(7)啟動(dòng)項(xiàng)目,在瀏覽器地址欄中,依次訪問(wèn)增刪改查的請(qǐng)求,相應(yīng)請(qǐng)求如下。增加用戶(hù):http://localhost:8080/addUser修改用戶(hù):http://localhost:8080/updateUser刪除用戶(hù):http://localhost:8080/deleteUser/4查詢(xún)用戶(hù):http://localhost:8080/getUserById?id=3查詢(xún)所有用戶(hù):http://localhost:8080/getAllUser

瀏覽器和控制臺(tái)上輸出了相應(yīng)信息,控制臺(tái)的運(yùn)行結(jié)果,如圖所示。27@RestControllerpublicclassUserController{

@Autowired

User

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論