07-SpringBoot+MyBatis+Spring 技術整合實現商品模組的CRUD操作

weixin_45686373發表於2020-11-04

07-SpringBoot+MyBatis+Spring 技術整合實現商品模組的CRUD操作

springboot

釋出於 8月31日

業務描述

基於Spring,MyBatis,SpringBoot,Thymeleaf技術實現商品模組的增刪改查操作。

專案環境初始化

準備工作

1. MySQL(5.7)
2. JDK (1.8)
3. Maven (3.6.3)
4. STS(4.7.1)

資料庫初始化

開啟mysql控制檯,然後按如下步驟執行goods.sql檔案。
第一步:登入mysql。

mysql –uroot –proot

第二步:設定控制檯編碼方式。

set names utf8;

第三步:執行goods.sql檔案(切記不要開啟檔案複製到mysql客戶端執行)。

source d:/goods.sql

其中goods.sql檔案內容如下:

drop database if exists dbgoods;
create database dbgoods default character set utf8;
use dbgoods;
create table tb_goods(
     id bigint primary key auto_increment,
     name varchar(100) not null,
     remark text,
     createdTime datetime not null
)engine=InnoDB;
insert into tb_goods values (null,'java','very good',now());
insert into tb_goods values (null,'mysql','RDBMS',now());
insert into tb_goods values (null,'Oracle','RDBMS',now());
insert into tb_goods values (null,'java','very good',now());
insert into tb_goods values (null,'mysql','RDBMS',now());
insert into tb_goods values (null,'Oracle','RDBMS',now());
insert into tb_goods values (null,'java','very good',now());

建立專案並新增依賴

基於STS建立

第一步:基於start.spring.io 建立專案並設定基本資訊

image.png

第二步:建立專案時指定專案核心依賴

image.png

第三步:專案建立以後分析其結構

image.png

基於IDEA建立

第一步:基於start.spring.io 建立專案並設定基本資訊

image.png

image.png
第二步:建立專案module時指定專案核心依賴

image.png

第三步:專案modul建立以後分析其結構

image.png

image.png

專案配置檔案內容初始化

#server
server.port=80
#server.servlet.context-path=/
#spring datasource
spring.datasource.url=jdbc:mysql:///dbgoods?serverTimezone=GMT%2B8&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

#spring mybatis
mybatis.mapper-locations=classpath:/mapper/*/*.xml

#spring logging
logging.level.com.cy=debug

#spring thymeleaf
spring.thymeleaf.prefix=classpath:/templates/pages/
spring.thymeleaf.suffix=.html
spring.thymeleaf.cache=false

專案API架構設計

其API架構設計,如圖所示:

image.png

商品查詢業務實現

業務描述

從商品庫查詢商品資訊,並將商品資訊呈現在頁面上,如圖所示:

image.png

業務時序分析

查詢所有商品資訊,其業務時序分析,如圖所示:
image.png

Pojo類定義

定義Goods物件,用於封裝從資料庫查詢到的商品資訊。

package com.cy.pj.goods.pojo;
import java.util.Date;
public class Goods {
    private Long id;//id bigint primary key auto_increment
    private String name;//name varchar(100) not null
    private String remark;//remark text
    private Date createdTime;//createdTime datetime
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
    public Date getCreatedTime() {
        return createdTime;
    }
    public void setCreatedTime(Date createdTime) {
        this.createdTime = createdTime;
    }
    @Override
    public String toString() {
        return "Goods [id=" + id + ", name=" + name + ",   
        remark=" + remark + ", createdTime=" + createdTime + "]";
    }
}

Dao介面方法及對映定義

在GoodsDao介面中定義商品查詢方法以及SQL對映,基於此方法及SQL對映獲取所有商品資訊。程式碼如下:

package com.cy.pj.goods.dao;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.cy.pj.goods.pojo.Goods;

@Mapper
public interface GoodsDao {
      @Select("select * from tb_goods")
      List<Goods> findGoods();
}

編寫單元測試類進行測試分析:

package com.cy.pj.goods.dao;
import com.cy.pj.goods.pojo.Goods;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class GoodsDaoTests {
    @Autowired
 private GoodsDao goodsDao;
    @Test
 void testFindGoods(){
        List<Goods> goodsList=goodsDao.findGoods();
        for(Goods g:goodsList){
            System.out.println(g);
        }
    }
}

測試結果問題分析

  • 資料庫連不上,如圖所示:

image.png

  • 連線資料庫的url 配置問題,如圖所示:

image.png

  • Sql對映重複定義問題,如圖所示:

image.png

  • 空指標問題,如圖所示:

image.png

  • SQL語法問題,如圖所示:

image.png

Service介面方法定義及實現

GoodsService介面及商品查詢方法定義

package com.cy.pj.goods.service;
import java.util.List;
import com.cy.pj.goods.pojo.Goods;
public interface GoodsService {
      List<Goods> findGoods();
}

GoodsService介面實現類GoodsServiceImpl定義及方法實現

package com.cy.pj.goods.service;
import java.util.List;
import com.cy.pj.goods.pojo.Goods;
@Service
public class GoodsServiceImpl implements GoodsService {
     @Autowired
     private GoodsDao goodsDao;
     @Override
     public List<Goods> findGoods(){
         return goodsDao.findGoods();
     }
}

編寫單元測試類進行測試分析

package com.cy.pj.goods.service;
import com.cy.pj.goods.pojo.Goods;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class GoodsServiceTests {
    @Autowired
 private GoodsService goodsService;
    @Test
 void testFindGoods(){
        List<Goods> goodsList=goodsService.findGoods();
        //斷言測試法(單元測試中常用的一種方式)
 Assertions.assertEquals(true, goodsList.size()>0);
    }
}

測試結果問題分析

  • 依賴注入問題,如圖所示:

image.png

Controller物件方法定義及實現

定義GoodsController類,並新增doGoodsUI方法,新增查詢商品資訊程式碼,並將查詢到的商品資訊儲存到model,並返回goods頁面。

package com.cy.pj.goods.controller;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import com.cy.pj.goods.pojo.Goods;
import com.cy.pj.goods.service.GoodsService;
@Controller //@Service,@Component
@RequestMapping("/goods/")
public class GoodsController {
    //has a+di
    @Autowired
    private GoodsService goodsService;
    @RequestMapping("doGoodsUI")
    public String doGoodsUI(Model model) {
         //呼叫業務層方法獲取商品資訊
         List<Goods> list= goodsService.findGoods();
         //將資料儲存到請求作用域
         model.addAttribute("list", list);
         return "goods";//viewname
    }
    
}

Goods商品列表頁面設計及實現

在templates/pages目錄中新增goods.html頁面,並在body中新增html元素,在執行內部使用thymeleaf標籤屬性獲取資料,程式碼如下:

<table width="50%">
        <thead>
           <th>id</th>
           <th>name</th>
           <th>remark</th>
           <th>createdTime</th>
           <th>operation</th>
        </thead>
        <tbody>
           <tr th:each="g:${list}">
             <td th:text="${g.id}">1</td>
             <td th:text="${g.name}">MySQL</td>
             <td th:text="${g.remark}">DBMS</td>
             <td th:text="${#dates.format(g.createdTime, 'yyyy/MM/dd HH:mm')}">2020/07/03</td>
             <td><a>delete</a></td>
           </tr>
        </tbody>
  </table>
thymeleaf 是一種模板引擎,此引擎以html為模板,可以新增自定義標籤屬性,可以將服務端model中資料填充在頁面上,然後實現與用於互動。其官網為thymeleaf.org

Goods頁面上資料呈現分析:

image.png

啟動Tomcat進行訪問測試分析

首先,啟動tomcat,然後在開啟瀏覽器,在位址列輸入訪問地址,獲取服務端資料並進行呈現,如圖所示:
image.png

專案啟動及執行過程中BUG及問題分析

  • STS控制檯“?”符號,如圖所示:

image.png

  • 服務啟動失敗,如圖所示:

image.png

  • 模板不存在錯誤,如圖所示:

image.png

  • 日期格式不正確,如圖所示:

image.png

  • 頁面上${}內容錯誤,如圖所示:

image.png

  • 頁面日期格式不正確,如圖所示:

image.png

  • 依賴注入失敗,如圖所示:

image.png

  • 空指標異常(NullPointerException),如圖所示:

image.png

商品刪除業務實現

業務描述

從商品庫查詢商品資訊後,點選頁面上刪除超連結,基於id刪除當前行記錄,如圖所示:

image.png

業務時序分析

在商品呈現頁面,使用者執行刪除操作,其刪除時序如圖所示:

image.png

Dao介面方法及對映定義

在GoodsDao介面中定義商品刪除方法以及SQL對映,程式碼如下:

 @Delete("delete from tb_goods where id=#{id}")

 int deleteById(Integer id);

Service介面方法定義及實現

在GoodsService介面中新增刪除方法,程式碼如下:

int deleteById(Integer id);

在GoodsService的實現類GoodsServiceImpl中新增deleteById方法實現。程式碼如下。

@Override
    public int deleteById(Integer id) {
        long t1=System.currentTimeMillis();
        int rows=goodsDao.deleteById(id);
        long t2=System.currentTimeMillis();
        System.out.println("execute time:"+(t2-t1));
        return rows;
    }

Controller物件方法定義及實現

在GoodsController中的新增doDeleteById方法,程式碼如下:

    @RequestMapping("doDeleteById/{id}")
    public String doDeleteById(@PathVariable Integer id){
        goodsService.deleteById(id);
        return "redirect:/goods/doGoodsUI";
    }

說明:Restful 風格為一種軟體架構編碼風格,定義了一種url的格式,其url語法為/a/b/{c}/{d},在這樣的語法結構中{}為一個變數表示式。假如我們希望在方法引數中獲取rest url中變數表示式的值,可以使用@PathVariable註解對引數進行描述。

Goods頁面上刪除超連結定義

在goods.html頁面中新增刪除超連結,如圖所示:

image.png

Thymeleaf 官方th:href應用說明,如圖所示:

image.png

刪除操作中,客戶端與服務端程式碼關聯說明,如圖所示:

image.png

啟動tomcat伺服器進行訪問測試分析

首先,啟動tomcat,然後在開啟瀏覽器,在位址列輸入訪問地址,獲取服務端資料並進行呈現,接下來點選頁面上的刪除按鈕,如圖所示:

image.png

刪除成功以後,的頁面如圖所示:

image.png

專案啟動及執行過程中的Bug及問題分析

  • SQL對映元素定義問題,如圖所示:

image.png

  • 客戶端請求引數與服務端引數不匹配,如圖所示:

image.png

商品新增業務實現

業務描述

在Goods列表頁面,新增新增按鈕,進行新增頁面,然後在新增頁面輸入商品相關資訊,然後儲存到資料庫,如圖所示:

image.png

商品新增頁面,設計如圖所示:

image.png

業務時序分析

在商品新增頁面,輸入商品資訊,然後提交到服務端進行儲存,其時序分析如圖所示:
image.png

Dao介面方法及對映定義

在GoodsDao中新增用於儲存商品資訊的介面方法以及SQL對映,程式碼如下:

@Insert("insert into tb_goods(name,remark,createdTime) 
values (#{name},#{remark},now())")
int insertObject(Goods entity);

說明:當SQL語句比較複雜時,也可以將SQL定義到對映檔案(xml檔案)中。

Service介面方法定義及實現

在GoodsService介面中新增業務方法,用於實現商品資訊新增,程式碼如下:

int saveGoods(Goods entity);

在GoodsSerivceImpl類中新增介面方法實現,程式碼如下:

    @Override
    public int saveGoods(Goods entity) {
        int rows=goodsDao.insertObject(entity);
        return rows;
    }

Controller物件方法定義及實現

在GoodsController類中新增用於處理商品新增請求的方法,程式碼如下:

@RequestMapping("doSaveGoods")
public String doSaveGoods(Goods entity) {
        goodsService.saveGoods(entity);
        return "redirect:/goods/doGoodsUI";
}

在GoodsController類中新增用於返回商品新增頁面的方法,程式碼如下:

   @RequestMapping("doGoodsAddUI")
    public String doGoodsAddUI() {
        return "goods-add";
    }

Goods新增頁面設計及實現

在templates的pages目錄中新增goods-add.html頁面,程式碼如下

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style type="text/css">
   ul li {list-style-type: none;}
</style>
</head>
<body>
<h1>The Goods Add Page</h1>
<form th:action="@{/goods/doSaveGoods}" method="post">
   <ul>
      <li>name:
      <li><input type="text" name="name">
      <li>remark:
      <li><textarea rows="5" cols="50" name="remark"></textarea>
      <li><input type="submit" value="Save">
   </ul>
</form>
</body>
</html>

在goods.html頁面中新增,超連結可以跳轉到新增頁面,關鍵程式碼如下:

<a th:href="@{/goods/doGoodsAddUI}">新增商品</a>

啟動Tomcat伺服器進行訪問測試分析

第一步:啟動web伺服器,檢測啟動過程是否OK,假如沒有問題進入下一步。
第二步:開啟瀏覽器在地址裡輸入http://localhost/goods/doGood...,出現如下介面,如圖所示:
image.png

第三步:在新增頁面中填寫表單,然後點選save按鈕將表單資料提交到服務端,如圖所示:
image.png
第四步:新增頁面中表單資料提交過程分析,如圖所示:
image.png

專案啟動及執行過程中的Bug及問題分析

  • 客戶端顯示400異常,如圖所示:

image.png

  • 儲存時500異常,如圖所示:

image.png

  • 資料庫完整性約束異常,如圖所示:

image.png

商品修改業務實現

業務描述

在商品列表頁面,點選update選項,基於商品id查詢當前行記錄然後將其更新到goods-update頁面,如圖所示:
image.png
在update頁面選中,修改商品資訊,然後點選 update goods 將表單資料提交到服務端進行更新

業務時序分析

基於id查詢商品資訊的時序設計
image.png
將goods-update頁面中的資料提交到服務端進行更新的時序設計
image.png

Dao介面方法及對映定義

在GoodsDao中新增基於id查詢商品資訊的方法及SQL對映,程式碼如下:

@Select("select * from tb_goods where id=#{id}")
Goods findById(Integer id);

在GoodsDao中新增基於id執行Goods商品更新的方法及SQL對映,程式碼如下:

 @Update("update tb_goods set name=#{name},remark=#{remark} where id=#{id}")
 int updateGoods(Goods goods);

Service介面方法定義及實現

在GoodsService 中新增基於id查詢商品資訊和更新商品資訊的方法,程式碼如下:

Goods findById(Integer id);
int updateGoods(Goods goods);

在GoodsServiceImpl中基於id查詢商品資訊和更新商品資訊的方法,程式碼如下:

    @Override
    public Goods findById(Integer id) {
        //.....
        return goodsDao.findById(id);
    }
    @Override
    public int updateGoods(Goods goods) {
        return goodsDao.updateGoods(goods);
    }

Controller物件方法定義及實現

在GoodsController中新增基於id查詢商品資訊的方法,程式碼如下:

    @RequestMapping("doFindById/{id}")
    public String doFindById(@PathVariable Integer id,Model model) {
        Goods goods=goodsService.findById(id);
        model.addAttribute("goods",goods);
        return "goods-update";
    }

在GoodsController中新增更新商品資訊的方法,程式碼如下:

    @RequestMapping("doUpdateGoods")
    public String doUpdateGoods(Goods goods) {
        goodsService.updateGoods(goods);
        return "redirect:/goods/doGoodsUI";
    }

Goods修改頁面設計及實現

在templates目錄中新增goods-update.html頁面,程式碼設計如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
  ul li {list-style-type: none}
</style>
</head>
<body>
   <h1>The Goods Update Page</h1>
   <form th:action="@{/goods/doUpdateGoods}" method="post">
      <input type="hidden" name="id" th:value="${goods.id}">
      <ul>
        <li>name:
        <li><input type="text" name="name" th:value="${goods.name}">
        <li>remark:
        <li><textarea rows="3" cols="30" name="remark" th:text="${goods.remark}"></textarea>
        <li><input type="submit" value="Update Goods">
       </ul>
   </form>
</body>
</html>

啟動Tomcat服務進行訪問測試分析

啟動tomcat服務,訪問商品列表頁面,如圖所示:

image.png

在列表頁面,點選update選項,進入更新頁面

image.png

在更新頁面更新表單資料,然後提交,進入列表頁面檢視更新結果,如圖所示:

image.png

專案啟動及執行過程中的BUG及問題分析

  • 頁面設計分析,如圖所示:

image.png

  • 頁面原始碼分析,如圖所示:

image.png

總結(Summary)

本小節重點講解了SpringBoot工程下MyBatis,SpringMVC,Thymeleaf技術的綜合應用,重點理解其業務實現過程以及問題的解決過程。

相關文章