国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

springboot基礎(chǔ)篇(快速入門 + 完整項(xiàng)目案例)

這篇具有很好參考價(jià)值的文章主要介紹了springboot基礎(chǔ)篇(快速入門 + 完整項(xiàng)目案例)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.springboot簡(jiǎn)介

SpringBoot程序優(yōu)點(diǎn):

  • 起步依賴(簡(jiǎn)化依賴配置)

    • parent
      所有SpringBoot項(xiàng)目要繼承的項(xiàng)目,定義了若干個(gè)坐標(biāo)版本號(hào)(依賴管理,而非依賴),以達(dá)到減少依賴沖突的目的
      springboot項(xiàng)目,Spring Boot,spring boot,restful,javaspringboot項(xiàng)目,Spring Boot,spring boot,restful,javaspringboot項(xiàng)目,Spring Boot,spring boot,restful,java
  • 自動(dòng)配置(簡(jiǎn)化常用工程相關(guān)配置)

    • stater
      SpringBoot中常見(jiàn)項(xiàng)目名稱,定義了當(dāng)前項(xiàng)目使用的所有依賴坐標(biāo),以達(dá)到減少依賴配置的目的
      springboot項(xiàng)目,Spring Boot,spring boot,restful,javaspringboot項(xiàng)目,Spring Boot,spring boot,restful,java
  • 引導(dǎo)類
    springboot的啟動(dòng)方式:

    • SpringBoot的引導(dǎo)類是Boot工程的執(zhí)行入口,運(yùn)行main方法就可以啟動(dòng)項(xiàng)目
    • SpringBoot工程運(yùn)行后初始化Spring容器,掃描引導(dǎo)類所在包加載bean
      springboot項(xiàng)目,Spring Boot,spring boot,restful,java
  • 輔助功能(內(nèi)置服務(wù)器,……)

    • 內(nèi)嵌Tomcat
      springboot項(xiàng)目,Spring Boot,spring boot,restful,javaspringboot項(xiàng)目,Spring Boot,spring boot,restful,javaspringboot項(xiàng)目,Spring Boot,spring boot,restful,java

2.REST風(fēng)格

1.簡(jiǎn)介

REST(Representational State Transfer): 表現(xiàn)形式狀態(tài)轉(zhuǎn)換。

  • 傳統(tǒng)風(fēng)格資源描述形式:
    http://localhost/user/getById?id=1
    http://localhost/user/saveUser
  • REST風(fēng)格描述形式:
    http://localhost/user/id=1
    http://localhost/user
  • 優(yōu)點(diǎn):
    • 隱藏資源的訪問(wèn)行為,無(wú)法通過(guò)地址得知對(duì)資源是何種操作
    • 書寫簡(jiǎn)化

REST風(fēng)格訪問(wèn)資源時(shí)使用 行為動(dòng)作 區(qū)分對(duì)資源進(jìn)行了何種操作

  • 查詢 GET
  • 新增/修改 POST
  • 修改/更新 PUT
  • 刪除 DELETE

2.RESTful

RESTful:按照REST風(fēng)格對(duì)資源進(jìn)行訪問(wèn)。

  • 通過(guò) @RequestMapping 注解的路徑設(shè)置,通過(guò) @PathVariable 注解綁定參數(shù)
    springboot項(xiàng)目,Spring Boot,spring boot,restful,java
    • @PostMapping
    • @GetMapping
    • @DeleteMapping
    • @PutMapping
  • @RestController 類注解
    基于SpringMVC的RESTful開(kāi)發(fā)控制器類定義上方
    設(shè)置當(dāng)前控制器類為RESTful風(fēng)格,等同于@Controller@RresponseBody組合

@RequestBody、 @RequestParam 、 @PathVariable 和 @Vaild 注解的使用及區(qū)別

3.復(fù)制工程

原則:

  • 保留工程基礎(chǔ)結(jié)構(gòu)
  • 抹掉原始工程痕跡

步驟:

  • 在工作空間中復(fù)制對(duì)應(yīng)工程,并修改工程名稱
  • 刪除與Idea相關(guān)配置文件,僅保留src目錄與pom.xml文件
  • 修改pom.xml文件中的artifactId與新工程/模塊名相同
  • 刪除name標(biāo)簽(可選)
  • 保留備份工程供后期使用

4.屬性配置

1.application.properties

springboot項(xiàng)目,Spring Boot,spring boot,restful,java

SpringBoot內(nèi)置屬性查詢: https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties

2.application.yml、.yaml

springboot項(xiàng)目,Spring Boot,spring boot,restful,java

SpringBoot配置文件加載順序: application.properties > application.yml > application.yaml

3.關(guān)于寫配置文件的時(shí)候沒(méi)有提示的解決方案

springboot項(xiàng)目,Spring Boot,spring boot,restful,java

如果點(diǎn)擊不了OK的解決方案:

  • 在輸入框里面填入配置文件的名

4.yaml

1.語(yǔ)法格式

YAML(YAML Ain’t Markup Language): 一種數(shù)據(jù)序列化格式。

優(yōu)點(diǎn):

  • 容易閱讀
  • 容易與腳本語(yǔ)言交互
  • 以數(shù)據(jù)為核心,重?cái)?shù)據(jù)輕格式

YAML文件擴(kuò)展名:

  • .yml(主流)
  • .yaml

yaml語(yǔ)法規(guī)則:

  • 大小寫敏感
  • 屬性層級(jí)關(guān)系使用多行描述,每行結(jié)尾使用:結(jié)束
  • 使用縮進(jìn)表示層級(jí)關(guān)系,同層級(jí)左側(cè)對(duì)齊,只允許使用空格(不允許使用Tab鍵)
  • 屬性值前面添加空格(屬性名與屬性值之間使用冒號(hào)+空格作為分隔)
  • # 表示注釋
  • 核心規(guī)則:數(shù)據(jù)前面要加空格與冒號(hào)隔開(kāi)

字面值表示方式:

boolean: TRUE #TRUE,true,True,FALSE,false,F(xiàn)alse均可
float: 3.14 #6.8523015e+5 #支持科學(xué)計(jì)數(shù)法
int: 123 #0b1010_0111_0100_1010_1110 #支持二進(jìn)制、八進(jìn)制、十六進(jìn)制
null: ~ #使用~表示null
string: HelloWorld #字符串可以直接書寫
string2: "Hello World" #可以使用雙引號(hào)包裹特殊字符
date: 2022-06-10 #日期必須使用yyyy-MM-dd格式
datetime: 2022-06-10T15:02:31+08:00 #時(shí)間和日期之間使用T連接,最后使用+代表時(shí)區(qū)

數(shù)組表示方式:

subject: 
 - Java
 - 前端
 - 大數(shù)據(jù)
enterprise:
 name: itcast
 age: 16
 subject: 
  - Java
  - 前端
  - 大數(shù)據(jù)
likes: [王者榮耀,刺激戰(zhàn)場(chǎng)] #數(shù)組書寫縮略格式

users: #對(duì)象數(shù)組格式
 - name: Tom
   age: 4
 - name: Jerry
   age: 5
users: #對(duì)象數(shù)組格式二
 -
  name: Tom
  age: 4
 -
  name: Jerry
  age: 5 #對(duì)象數(shù)組縮略格式
users2: [ { name:Tom , age:4 } , { name:Jerry , age:5 } ]

2.讀取數(shù)據(jù)

使用@Value讀取單個(gè)數(shù)據(jù),屬性名引用方式:${一級(jí)屬性名.二級(jí)屬性名……}

lesson: SpringBoot

server:
 port: 82

enterprise:
 name: itcast
 age: 16
 tel: 4006184000
 subject: 
  - Java
  - 前端
  - 大數(shù)據(jù)
@RestController
@RequestMapping("/books")
public class BookController {
	@Value("${lesson}")
	private String lessonName;
	@Value("${server.port}")
	private int port;
	@Value("${enterprise.subject[1]}")
	private String[] subject_01; 
}

在配置文件中可以使用屬性名引用方式引用屬性

baseDir: /usr/local/fire
center:
 dataDir: ${baseDir}/data
 tmpDir: ${baseDir}/tmp
 logDir: ${baseDir}/log
 msgDir: ${baseDir}/msgDir

屬性值中如果出現(xiàn)轉(zhuǎn)移字符,需要使用雙引號(hào)包裹

lesson: "Spring\tboot\nlesson"

3.封裝對(duì)象

封裝全部數(shù)據(jù)到Environment對(duì)象

lesson: SpringBoot

server:
 port: 82

enterprise:
 name: itcast
 age: 16
 tel: 4006184000
 subject: 
  - Java
  - 前端
  - 大數(shù)據(jù)
@RestController
@RequestMapping("/books")
public class BookController {
	@Value("${lesson}")
	private String lessonName;
	@Value("${server.port}")
	private int port;	
	@Value("${enterprise.subject[1]}")
	private String[] subject_01; 
}

自定義對(duì)象封裝指定數(shù)據(jù) @ConfigurationProperties(prefix = "")

lesson: SpringBoot

server:
 port: 82

enterprise:
 name: itcast
 age: 16
 tel: 4006184000
 subject:
  - Java
  - 前端
  - 大數(shù)據(jù)
@Component
@ConfigurationProperties(prefix = "enterprise")
public class Enterprise {
	private String name;
	private Integer age;
	private String[] subject; 
}
@RestController
@RequestMapping("/books")
public class BookController {
	@Autowired
	private Enterprise enterprise; 
}

5.整合第三方技術(shù)

1.整合Junit

1.實(shí)現(xiàn)

導(dǎo)入測(cè)試對(duì)應(yīng)的starter:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

測(cè)試類使用@SpringBootTest修飾:

@SpringBootTest
class SpringbootDemo1ApplicationTests {

    @Test
    void contextLoads() {
    }

}

使用自動(dòng)裝配的形式添加要測(cè)試的對(duì)象(impl實(shí)現(xiàn)類)

2.注意事項(xiàng)

正確的測(cè)試類路徑應(yīng)該與引導(dǎo)類路徑一致,如下:
springboot項(xiàng)目,Spring Boot,spring boot,restful,java

當(dāng)路徑不一致的時(shí)候,如下:
springboot項(xiàng)目,Spring Boot,spring boot,restful,java
此時(shí)測(cè)試類就無(wú)法依賴注入,需要做以下配置(任選其一):

  • @SpringBootTest(classes = SpringbootDemo1Application.class)
  • @ContextConfiguration(classes = SpringbootDemo1Application.class)

2.整合mybatis

導(dǎo)入依賴:

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

設(shè)置數(shù)據(jù)源參數(shù):

spring:
	datasource:
		driver-class-name: com.mysql.cj.jdbc.Driver
		url: jdbc:mysql://localhost:3306/book
		username: root
		password: root

注意: SpringBoot版本低于2.4.3(不含),Mysql驅(qū)動(dòng)版本大于8.0時(shí),需要在url連接串中配置時(shí)區(qū)
jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
或在MySQL數(shù)據(jù)庫(kù)端配置時(shí)區(qū)解決此問(wèn)題

定義實(shí)體類:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
	private String name;
	private Integer id;
	private String type;
	private BigDecimal price; 
}

定義數(shù)據(jù)層接口與映射配置:

@Mapper
public interface BookDao {
	@Select("select * from book")
	public List<User> getAll();
}

測(cè)試類中注入dao接口,測(cè)試功能:

@SpringBootTest
class Springboot08MybatisApplicationTests {
	@Autowired
	private BookDao bookDao;
	@Test
	public void testGetById() {
		Book book = bookDao.getById(1);
		System.out.println(book);
	} 
}

3.整合mybatis-plus

https://blog.csdn.net/qq_41402200/article/details/88891511

4.整合Druid

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.22</version>
        </dependency>
spring:
  main:
    banner-mode: off
 datasource:
 druid:
  driver-class-name: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
  username: root
  password: root

6.完結(jié)案例

項(xiàng)目完整目錄結(jié)構(gòu):

springboot項(xiàng)目,Spring Boot,spring boot,restful,javaspringboot項(xiàng)目,Spring Boot,spring boot,restful,java

1.項(xiàng)目初始化

項(xiàng)目初始化:

springboot項(xiàng)目,Spring Boot,spring boot,restful,java
springboot項(xiàng)目,Spring Boot,spring boot,restful,java
springboot項(xiàng)目,Spring Boot,spring boot,restful,java
springboot項(xiàng)目,Spring Boot,spring boot,restful,java

2.數(shù)據(jù)庫(kù)搭建&數(shù)據(jù)源配置

SQL語(yǔ)句:

create database `spbt`;
use `spbt`;

create table `sp_book` (
	`id` int primary key auto_increment comment '主鍵id',
	`type` varchar(20) not null comment '書籍類型',
	`name` varchar(30) not null comment '書籍名稱',
	`description` varchar(100) not null comment '書籍描述'
)default charset=utf8 comment '書籍表';

insert into `sp_book`(`type`,`name`,`description`)
values
	('科幻','地球往事','《三體》三部曲第一部,作品講述了地球人類文明和三體文明的信息交流、生死搏殺及兩個(gè)文明在宇宙中的興衰歷程。'),
	('科幻','黑暗森林','《三體》三部曲第二部,作品講述了地球人類文明和三體文明的信息交流、生死搏殺及兩個(gè)文明在宇宙中的興衰歷程。'),
	('科幻','死神永生','《三體》三部曲第三部,作品講述了地球人類文明和三體文明的信息交流、生死搏殺及兩個(gè)文明在宇宙中的興衰歷程。'),
	('仙俠','將夜','這本小說(shuō)講述的是一段可歌可泣可笑可愛(ài)的草根崛起史,一個(gè)物質(zhì)要求寧濫勿缺的開(kāi)朗少年行。小說(shuō)基于修真世界,卻又勝于修真,講述了人定勝天,花開(kāi)彼岸天的歷史,引人深思。'),
	('仙俠','雪中悍刀行','該小說(shuō)講述一個(gè)關(guān)于廟堂權(quán)爭(zhēng)與刀劍交錯(cuò)的時(shí)代,一個(gè)暗潮涌動(dòng)粉墨登場(chǎng)的江湖。'),
	('都市','大國(guó)重工','國(guó)家重大裝備辦處長(zhǎng)馮嘯辰穿越到了1980年,看他如何與同代人一道,用汗水和智慧,鑄就大國(guó)重工。'),
	('架空','贅婿','本書主要講述了主角從現(xiàn)代金融界巨頭的身份回到了古代,進(jìn)入一個(gè)商賈之家最沒(méi)地位的贅婿身體后,涉及到一系列家國(guó)天下事的故事。'),
	('科幻','北京折疊','該小說(shuō)講述北京在未來(lái)按照社會(huì)階層被分成三個(gè)空間,生活在第三空間的垃圾工老刀穿越三層空間送信的故事。'),
	('鬼怪','地煞七十二變','地煞七十二般變化,每一般變化,就是一項(xiàng)神通。一本神奇的黃殼書將李長(zhǎng)安送回古代世界,每斬殺一個(gè)妖魔,就獲得一項(xiàng)神通。'),
	('魔幻','詭秘之主','作品融匯了克蘇魯風(fēng)格、西方魔幻元素、第一次工業(yè)革命時(shí)代風(fēng)情和蒸汽朋克情懷。這是一個(gè)蒸汽與機(jī)械的世界,這是一段“愚者”的傳說(shuō)。'),
	('幻想','第一序列','作品講述了主角任小粟通過(guò)吸收正能量一步步崛起,同時(shí)逐漸改變了世界的故事。'),
	('人文','明朝那些事兒','作品主要講述的是從1344年到1644年這三百年間關(guān)于明朝的一些故事 。'),
	('人文','三國(guó)那些事兒','本書分為上下兩篇,上篇為讀者介紹了三國(guó)里的著名人物,下篇講述了發(fā)生在這些人物身上的經(jīng)典故事。'),
	('都市','余罪','警校學(xué)生余罪從一場(chǎng)特殊的選拔開(kāi)始,進(jìn)入了生活和社會(huì)矛盾之中,成為一個(gè)臥底,是一種挑戰(zhàn),也是一種難以想象的痛苦生活的開(kāi)始。'),
	('科幻','安德的游戲','第三次蟲族入侵已迫在眉睫,而地球艦隊(duì)尚未找到任何抵抗的可能。世界即將毀滅。人類最后的救世主 ,是一個(gè)六歲的兒童——安德。'),
	('科幻','死者代言人','安德遭遇了一起殘忍而離奇的虐殺事件。安德隱匿身份,再次踏入一個(gè)異生物星球。隨著調(diào)查的深入,他一步步走向異種生物的圈套,而真相,居然與他童年的那段回憶有千絲萬(wàn)縷的聯(lián)系……'),
	('科幻','安德的影子','當(dāng)安德和隊(duì)員們?nèi)σ愿疤魬?zhàn)最后的難關(guān)時(shí),只有一人早已知曉這背后殘酷的真相。他是影子,在英雄如陽(yáng)光照射大地之時(shí),只有影子能承接必然尾隨而至的黑暗。'),
	('驚悚','我有一座冒險(xiǎn)屋','作該作品講述主人公陳歌在翻舊物時(shí)尋得黑色手機(jī),在手機(jī)的指引下探尋世界的另一面。'),
	('科幻','星門','傳說(shuō),在那古老的星空深處,佇立著一道血與火侵染的紅色之門。'),
	('仙俠','凡人修仙傳','小說(shuō)講述了一個(gè)普通的山村窮小子,偶然之下,跨入到一個(gè)江湖小門派,雖然資質(zhì)平庸,但依靠自身努力和合理算計(jì)最后修煉成仙的故事。'),
	('驚悚','地獄公寓','在這公寓內(nèi),如果住戶房間的墻壁上出現(xiàn)了血字,住戶就必須完成血字任務(wù),一旦違背就會(huì)死亡。'),
	('仙俠','求魔','該書主要講述了主角蘇銘不甘命運(yùn)被掌控,與命運(yùn)斗爭(zhēng)的故事。修仙覓長(zhǎng)生,熱血任逍遙,踏蓮曳波滌劍骨,憑虛御風(fēng)塑圣魂。'),
	('仙俠','仙逆','作該小說(shuō)講述的是一個(gè)平庸的少年,踏入仙途,如何一步一步走向巔峰,憑一己之力揚(yáng)名修真界的故事。'),
	('詩(shī)集','炸裂志','陳年喜以其平實(shí)婉轉(zhuǎn)的文字,在詩(shī)句中建構(gòu)了一個(gè)中年男人的世界,以白雪抗衡黑洞,以愛(ài)感悟生死,以詩(shī)超越世間。'),
	('仙俠','大奉打更人','作者巧妙地將俗世朝堂背景,百家文化與仙俠修煉結(jié)合起來(lái),并設(shè)計(jì)了一個(gè)個(gè)精妙的案件作為引線,一步步展現(xiàn)出了一個(gè)波瀾壯闊的全新世界');

創(chuàng)建實(shí)體類:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;
}

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

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/spbt?serverTimezone=UTC
      username: root
      password: admin

mybatis-plus:
  global-config:
    db-config:
      # 表前綴
      table-prefix: sp_
      # 設(shè)置數(shù)據(jù)庫(kù)的自增策略
      id-type: auto
  # 開(kāi)啟mybatis-plus的運(yùn)行日志
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.測(cè)試Mybatis-plus

注意: mybatis-plus不用提交事務(wù)。

1.增刪改查

mapper接口:

@Mapper
public interface QueryBookMapper extends BaseMapper<Book> {

}

測(cè)試類:

@SpringBootTest
public class BookMapperTests {

    @Autowired
    private BookMapper mapper;

    @Test
    void testGetById() {
        System.out.println(mapper.selectById(1));
    }

    @Test
    void testGetAll() {
        System.out.println(mapper.selectList(null));
    }

    @Test
    void testSave() {
        Book book = new Book();
        book.setName("一念永恒");
        book.setType("仙俠");
        book.setDescription("一念成滄海,一念化桑田。一念斬千魔,一念誅萬(wàn)仙。");
        mapper.insert(book);
    }

    @Test
    void testUpdate() {
        Book book = new Book();
        book.setId(20);
        book.setDescription("韓老魔的殺人奪寶一路升級(jí)的傳奇故事");
        mapper.updateById(book);
    }

    @Test
    void testDelet() {
        mapper.deleteById(26);
    }
}

2.分頁(yè)查詢

  • 設(shè)定分頁(yè)對(duì)象 IPage
  • IPage 對(duì)象中封裝了分頁(yè)操作中的所有數(shù)據(jù)
    當(dāng)前頁(yè)碼值、每頁(yè)數(shù)據(jù)總量、最大頁(yè)碼值、數(shù)據(jù)總量、數(shù)據(jù)
  • 分頁(yè)操作是在MyBatisPlus的常規(guī)操作基礎(chǔ)上增強(qiáng)得到,內(nèi)部是動(dòng)態(tài)的拼寫SQL語(yǔ)句,因此需要增強(qiáng)對(duì)應(yīng)的功能,
    使用 MyBatisPlus攔截器 實(shí)現(xiàn)
    /*分頁(yè)查詢*/
    @Test
    void testGetPage() {
        IPage page = new Page(2,5);
        mapper.selectPage(page,null);
        System.out.println(page.getCurrent());
        System.out.println(page.getSize());
        System.out.println(page.getTotal());
        System.out.println(page.getPages());
        System.out.println(page.getRecords());
    }

分頁(yè)查詢工具類

@Configuration
public class MPConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

3.條件查詢

  • 使用QueryWrapper對(duì)象封裝查詢條件,推薦使用LambdaQueryWrapper對(duì)象,所有查詢操作封裝成方法調(diào)用
    /*條件*/
    @Test
    void testGetBy() {

        /*  一般寫法
        QueryWrapper<Book> qw = new QueryWrapper<>();
        qw.like("type","仙");
        mapper.selectList(qw);*/

        /*Lambda寫法*/
        String type = "仙";
        LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
        lqw.like(type!=null, Book::getType, type);
        mapper.selectList(lqw);
    }

4.業(yè)務(wù)層開(kāi)發(fā)

1.業(yè)務(wù)接口與實(shí)體類

業(yè)務(wù)接口:

public interface BookService {
    Boolean save(Book book);
    Boolean update(Book book);
    Boolean delete(Integer id);
    Book getById(Integer id);
    List<Book> getAll();
    IPage<Book> getPage(int currentPage, int pageSize);

}

實(shí)現(xiàn)類:

@Service
public class BookServiceImpl implements BookService {

    @Resource
    BookMapper mapper;

    @Override
    public Boolean save(Book book) {
        return mapper.insert(book) > 0;
    }

    @Override
    public Boolean update(Book book) {
        return mapper.updateById(book) > 0;
    }

    @Override
    public Boolean delete(Integer id) {
        return mapper.deleteById(id) > 0;
    }

    @Override
    public Book getById(Integer id) {
        return mapper.selectById(id);
    }

    @Override
    public List<Book> getAll() {
        return mapper.selectList(null);
    }

    @Override
    public IPage<Book> getPage(int currentPage, int pageSize) {
        IPage page = new Page(currentPage, pageSize);
        mapper.selectPage(page, null);
        return page;
    }
}

2.測(cè)試類

選中實(shí)體類名,Ctrl shift t 快速創(chuàng)建測(cè)試類

springboot項(xiàng)目,Spring Boot,spring boot,restful,java
springboot項(xiàng)目,Spring Boot,spring boot,restful,java
@SpringBootTest
public class BookServiceImplTest {

    @Resource
    BookServiceImpl bookService;

    @Test
    void save() {
        Book book = new Book();
        book.setName("誅仙");
        book.setType("仙俠");
        book.setDescription("天地不仁,以萬(wàn)物為芻狗");
        bookService.save(book);
    }

    @Test
    void update() {
        Book book = new Book();
        book.setId(5);
        book.setDescription("高人雅士、王者之癡、匹夫之怒、美人之勇、凡人瑣事");
        bookService.update(book);
    }

    @Test
    void delete() {
        bookService.delete(27);
    }

    @Test
    void getById() {
        bookService.getById(5);
    }

    @Test
    void getAll() {
        bookService.getAll();
    }

    @Test
    void getPage() {
        IPage<Book> page = bookService.getPage(2,5);
        System.out.println(page.getCurrent());
        System.out.println(page.getSize());
        System.out.println(page.getTotal());
        System.out.println(page.getPages());
        System.out.println(page.getRecords());
    }
}

3.MP業(yè)務(wù)層快速開(kāi)發(fā)

接口:

public interface IBookService extends IService<Book> {
}

實(shí)現(xiàn)類:

@Service
public class IBookServiceImpl extends ServiceImpl<BookMapper, Book> implements IBookService {
}

測(cè)試類:

@SpringBootTest
class IBookServiceImplTest {
    @Resource
    private IBookServiceImpl iBookService;

    @Test
    void testGetById() {
        System.out.println(iBookService.getById(1));
    }

    @Test
    void testGetAll() {
        System.out.println(iBookService.list(null));
    }

    @Test
    void testSave() {
        Book book = new Book();
        book.setName("重生之超級(jí)戰(zhàn)艦");
        book.setType("科幻");
        book.setDescription("探索宇宙之中的奧秘,和系外行星,各種恒星,白矮星,中子星,黑洞,類星體等進(jìn)行親密接觸,和各種宇宙文明進(jìn)行血腥廝殺,探尋被隱藏在重重迷霧之后的宇宙真理……");
        iBookService.save(book);
    }

    @Test
    void testUpdate() {
        Book book = new Book();
        book.setId(20);
        book.setDescription("韓老魔的殺人奪寶一路升級(jí)的傳奇故事");
        iBookService.updateById(book);
    }

    @Test
    void testDelet() {
        iBookService.removeById(26);
    }

    /*分頁(yè)*/
    @Test
    void testGetPage() {
        IPage<Book> page = new Page<>(2,5);
        iBookService.page(page,null);
        System.out.println(page.getCurrent());
        System.out.println(page.getSize());
        System.out.println(page.getTotal());
        System.out.println(page.getPages());
        System.out.println(page.getRecords());
    }
}

注意: 如果有特殊的業(yè)務(wù)需求,可以在 IBookService 中重寫方法。

5.表現(xiàn)層開(kāi)發(fā)

1.表現(xiàn)層代碼

使用REST風(fēng)格寫接口:

@RestController
@RequestMapping("/books")
public class BookController {

    @Resource
    private IBookService iBookService;

    @GetMapping
    public List<Book> getAll() {
        return iBookService.list(null);
    }

    @PostMapping
    public Boolean save(@RequestBody Book book){
        return iBookService.save(book);
    }

    @PutMapping
    public Boolean update(@RequestBody Book book){
        return iBookService.updateById(book);
    }

    @DeleteMapping("{id}")
    public Boolean delete(@PathVariable Integer id){
        return iBookService.removeById(id);
    }

    @GetMapping("{id}")
    public Book getById(@PathVariable Integer id){
        return iBookService.getById(id);
    }

    @GetMapping("{currentPage}/{pageSize}")
    public IPage<Book> getPage(@PathVariable int currentPage, @PathVariable int pageSize){
        IPage<Book> page = new Page<>(currentPage,pageSize);
        iBookService.page(page,null);
        return page;
    }
}

2.接口測(cè)試

本文采用的測(cè)試工具是: ApiPost

springboot項(xiàng)目,Spring Boot,spring boot,restful,java
springboot項(xiàng)目,Spring Boot,spring boot,restful,java

接口測(cè)試目錄文檔: https://console-docs.apipost.cn/preview/7f61bffaaafd5a1c/44eae2dee5dca510

3.表現(xiàn)層消息一致性處理

設(shè)計(jì)表現(xiàn)層返回結(jié)果的模型類,用于后端與前端進(jìn)行數(shù)據(jù)格式統(tǒng)一,也稱為前后端數(shù)據(jù)協(xié)議。

工具類:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class R {
    // 標(biāo)志接口是否成功執(zhí)行
    private Boolean flag;
    // 調(diào)用接口返回?cái)?shù)據(jù)格式
    private Object data;

    public R(Boolean flag) {
        this.flag = flag;
    }
}

升級(jí)版的表現(xiàn)層:

@RestController
@RequestMapping("/books")
public class BookControllerPro {
    @Resource
    private IBookService iBookService;

    @GetMapping
    public R getAll() {
        return new R(true, iBookService.list());
    }

    @PostMapping
    public R save(@RequestBody Book book){
        return new R(iBookService.save(book));
    }

    @PutMapping
    public R update(@RequestBody Book book){
        return new R(iBookService.updateById(book));
    }

    @DeleteMapping("{id}")
    public R delete(@PathVariable Integer id){
        return new R(iBookService.removeById(id));
    }

    @GetMapping("{id}")
    public R getById(@PathVariable Integer id){
        return new R(true, iBookService.getById(id));
    }

    @GetMapping("{currentPage}/{pageSize}")
    public R getPage(@PathVariable int currentPage, @PathVariable int pageSize){
        IPage<Book> page = new Page<>(currentPage,pageSize);
        return new R(true, iBookService.page(page,null));
    }
}

4.異常消息處理

工具類:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class R {
    // 標(biāo)志接口是否成功執(zhí)行
    private Boolean flag;
    // 調(diào)用接口返回?cái)?shù)據(jù)格式
    private Object data;
    // 返回狀態(tài)信息
    private String msg;

    public R(Boolean flag) {
        this.flag = flag;
    }

    public R(Boolean flag, Object data) {
        this.flag = flag;
        this.data = data;
    }

    public R(Boolean flag, String msg) {
        this.flag = flag;
        this.msg = msg;
    }
}
@RestControllerAdvice
public class ProjectExceptionAdvice {
    @ExceptionHandler
    public R doException(Exception e) {
        return new R(false, "服務(wù)器故障,稍后再試");
    }
}

新增接口修改:

    @PostMapping
    public R save(@RequestBody Book book){
        boolean flag = iBookService.save(book);
        return new R(flag, flag ? "新增成功" : "新增失敗");
    }

前端save接口調(diào)用:

            //添加
            handleAdd () {
                axios.post("/books", this.formData).then((res) => {
                    // 判斷是否添加成功
                    if (res.data.flag) {
                        // 關(guān)閉彈窗
                        this.dialogFormVisible = false;
                        this.$message({
                            message: '新增成功',
                            type: 'success'
                        });
                    } else {
                        // this.$message.error('新增失敗');
                        this.$message.error(res.data.msg);
                    }
                }).finally(() => {
                    // 重新加載一下數(shù)據(jù)
                    this.getAll();
                })
            },

6.前后端協(xié)議聯(lián)調(diào)

項(xiàng)目代碼地址:git@github.com:Crashinging/ssmp.git

本部分到此為止了…文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-673120.html

springboot項(xiàng)目,Spring Boot,spring boot,restful,java

到了這里,關(guān)于springboot基礎(chǔ)篇(快速入門 + 完整項(xiàng)目案例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包