07-SpringBoot+MyBatis+Spring 技術整合實現商品模組的CRUD操作
07-SpringBoot+MyBatis+Spring 技術整合實現商品模組的CRUD操作
釋出於 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 建立專案並設定基本資訊
第二步:建立專案時指定專案核心依賴
第三步:專案建立以後分析其結構
基於IDEA建立
第一步:基於start.spring.io 建立專案並設定基本資訊
第二步:建立專案module時指定專案核心依賴
第三步:專案modul建立以後分析其結構
專案配置檔案內容初始化
#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架構設計,如圖所示:
商品查詢業務實現
業務描述
從商品庫查詢商品資訊,並將商品資訊呈現在頁面上,如圖所示:
業務時序分析
查詢所有商品資訊,其業務時序分析,如圖所示:
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);
}
}
}
測試結果問題分析
- 資料庫連不上,如圖所示:
- 連線資料庫的url 配置問題,如圖所示:
- Sql對映重複定義問題,如圖所示:
- 空指標問題,如圖所示:
- SQL語法問題,如圖所示:
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);
}
}
測試結果問題分析
- 依賴注入問題,如圖所示:
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頁面上資料呈現分析:
啟動Tomcat進行訪問測試分析
首先,啟動tomcat,然後在開啟瀏覽器,在位址列輸入訪問地址,獲取服務端資料並進行呈現,如圖所示:
專案啟動及執行過程中BUG及問題分析
- STS控制檯“?”符號,如圖所示:
- 服務啟動失敗,如圖所示:
- 模板不存在錯誤,如圖所示:
- 日期格式不正確,如圖所示:
- 頁面上${}內容錯誤,如圖所示:
- 頁面日期格式不正確,如圖所示:
- 依賴注入失敗,如圖所示:
- 空指標異常(NullPointerException),如圖所示:
商品刪除業務實現
業務描述
從商品庫查詢商品資訊後,點選頁面上刪除超連結,基於id刪除當前行記錄,如圖所示:
業務時序分析
在商品呈現頁面,使用者執行刪除操作,其刪除時序如圖所示:
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頁面中新增刪除超連結,如圖所示:
Thymeleaf 官方th:href應用說明,如圖所示:
刪除操作中,客戶端與服務端程式碼關聯說明,如圖所示:
啟動tomcat伺服器進行訪問測試分析
首先,啟動tomcat,然後在開啟瀏覽器,在位址列輸入訪問地址,獲取服務端資料並進行呈現,接下來點選頁面上的刪除按鈕,如圖所示:
刪除成功以後,的頁面如圖所示:
專案啟動及執行過程中的Bug及問題分析
- SQL對映元素定義問題,如圖所示:
- 客戶端請求引數與服務端引數不匹配,如圖所示:
商品新增業務實現
業務描述
在Goods列表頁面,新增新增按鈕,進行新增頁面,然後在新增頁面輸入商品相關資訊,然後儲存到資料庫,如圖所示:
商品新增頁面,設計如圖所示:
業務時序分析
在商品新增頁面,輸入商品資訊,然後提交到服務端進行儲存,其時序分析如圖所示:
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...,出現如下介面,如圖所示:
第三步:在新增頁面中填寫表單,然後點選save按鈕將表單資料提交到服務端,如圖所示:
第四步:新增頁面中表單資料提交過程分析,如圖所示:
專案啟動及執行過程中的Bug及問題分析
- 客戶端顯示400異常,如圖所示:
- 儲存時500異常,如圖所示:
- 資料庫完整性約束異常,如圖所示:
商品修改業務實現
業務描述
在商品列表頁面,點選update選項,基於商品id查詢當前行記錄然後將其更新到goods-update頁面,如圖所示:
在update頁面選中,修改商品資訊,然後點選 update goods 將表單資料提交到服務端進行更新
業務時序分析
基於id查詢商品資訊的時序設計
將goods-update頁面中的資料提交到服務端進行更新的時序設計
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服務,訪問商品列表頁面,如圖所示:
在列表頁面,點選update選項,進入更新頁面
在更新頁面更新表單資料,然後提交,進入列表頁面檢視更新結果,如圖所示:
專案啟動及執行過程中的BUG及問題分析
- 頁面設計分析,如圖所示:
- 頁面原始碼分析,如圖所示:
總結(Summary)
本小節重點講解了SpringBoot工程下MyBatis,SpringMVC,Thymeleaf技術的綜合應用,重點理解其業務實現過程以及問題的解決過程。
相關文章
- 使用PreparedStatement實現CRUD操作
- spring 整合 mybatis 及mybatis 的 crud 操作SpringMyBatis
- maven非web專案整合mbatis實現CRUDMavenWebBAT
- 淘寶/天貓商品詳情實時資料API技術實現API
- 紅帽Linux新系統整合虛擬技術 實現簡易操作(轉)Linux
- 封裝模組實現商品增刪改查封裝
- MyBatis-Plus:簡化 CRUD 操作的藝術MyBatis
- SpringBoot整合Redis使用Restful風格實現CRUD功能Spring BootRedisREST
- 如何基於COLA架構快速實現一個CRUD操作架構
- 七、真正的技術——CAS操作原理、實現、底層原始碼原始碼
- SpringBoot實現mongoDB的CRUDSpring BootMongoDB
- Spring Boot整合Mybatis完成級聯一對多CRUD操作Spring BootMyBatis
- MyBatis 的簡單 CRUD 操作MyBatis
- SSM整合之CRUD環境搭建整合SSM
- Elasticsearch CRUD基本操作Elasticsearch
- go操作mongo CRUDGo
- Swift 在手淘商品評價的技術重構與實踐Swift
- 談整合技術
- 使用rails實現最簡單的CRUDAI
- Vue+Element UI實現CRUDVueUI
- JPA工程的建立和CRUD操作
- mybatis 的crud及批量cud操作MyBatis
- Apache中URLRewrite技術的實現Apache
- 高效實現聚水潭·奇門售後單整合到MySQL的關鍵技術MySql
- Spring Boot 整合 Redis 實現快取操作Spring BootRedis快取
- 商品模組設計
- 商品模組介面文件
- 虛擬現實技術
- 大宗商品撮合交易平臺系統丨加強業務、技術、應用與整合的創新
- Vue+Ant Design實現CRUDVue
- Cocos 技術派:實時競技小遊戲技術實現分享遊戲
- ERP實施:企業管理與技術的整合(轉)
- 實現VR直播的關鍵技術VR
- 快速理解容器技術的實現原理
- Delphi中停靠技術的實現 (轉)
- Mybatis:CRUD操作及配置解析MyBatis
- Java Hibernate 之 CRUD 操作Java
- 使用TS+Sequelize實現更簡潔的CRUD