Springboot整合mybatisplus的項(xiàng)目實(shí)戰(zhàn)
Springboot整合mybatisplus,純后端,驗(yàn)證結(jié)果是通過postman調(diào)用的,記錄一下
1、建表語句以及初始化數(shù)據(jù)腳本
CREATE TABLE `tbl_book` ( `id` int NOT NULL AUTO_INCREMENT, `type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=10014 DEFAULT CHARSET=utf8 INSERT INTO `tbl_book` VALUES (10000, '計(jì)算機(jī)理論', 'Java編程思想(第4版)', 'Java學(xué)習(xí)經(jīng)典,殿堂級著作!贏得了全球程序員的廣泛贊譽(yù)。'); INSERT INTO `tbl_book` VALUES (10001, '計(jì)算機(jī)理論', '計(jì)算機(jī)組成原理', '資深的計(jì)算機(jī)體系結(jié)構(gòu)教育家Alan Clements博士編寫,涵蓋計(jì)算機(jī)系統(tǒng)的組成和體系結(jié)構(gòu)的基本概念、指令系統(tǒng)以及處理器實(shí)現(xiàn)等涉及計(jì)算機(jī)組成原理課程的內(nèi)容。'); INSERT INTO `tbl_book` VALUES (10002, '程序設(shè)計(jì)', 'C++ Primer Plus 第6版 中文版', 'C++程序設(shè)計(jì)經(jīng)典教程,暢銷30年的C++大百科全書全新升級,經(jīng)典C++入門教程十年新版再現(xiàn)\')'); INSERT INTO `tbl_book` VALUES (10003, '程序設(shè)計(jì)', 'RocketMQ技術(shù)內(nèi)幕:RocketMQ架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)原理(第2版)', '暢銷書升級,RocketMQ創(chuàng)始人高度評價(jià),深入源碼分析技術(shù)架構(gòu)和實(shí)現(xiàn)原理,打造高性能、高可用、高吞吐量、低延遲RocketMQ'); INSERT INTO `tbl_book` VALUES (10004, '程序設(shè)計(jì)', ' 深入理解Java虛擬機(jī):JVM高級特性與實(shí)踐(第3版)', '周志明虛擬機(jī)新作,第3版新增內(nèi)容近50%,5個(gè)維度全面剖析JVM,大廠面試知識點(diǎn)全覆蓋。與 Java編程思想、Effective Java、Java核心技術(shù) 堪稱:Java四大名著'); INSERT INTO `tbl_book` VALUES (10005, '歷史', '見識城邦·人類簡史:從動(dòng)物到上帝(新版)', '以色列新銳歷史學(xué)家尤瓦爾·赫拉利代表作,第十屆文津圖書獎(jiǎng)獲獎(jiǎng)作品'); INSERT INTO `tbl_book` VALUES (10006, '歷史', '中國通史', '呂思勉先生寫給普通讀者的中國通史入門書,用白話文寫成的中國通史,把歷史從“帝王的家譜”轉(zhuǎn)變?yōu)槿祟惖倪M(jìn)化史'); INSERT INTO `tbl_book` VALUES (10007, '哲學(xué)', '理想國(柏拉圖代表作)', '奠定西方哲學(xué)史的源流之作。2021新譯本,以斯靈斯??北緸榈妆?,遵照“字對字”的原則,從古希臘原文直譯,兼顧準(zhǔn)確性和語言通順性,助你讀懂理想國。'); INSERT INTO `tbl_book` VALUES (10008, '哲學(xué)', '蘇格拉底的申辯', '《柏拉圖注疏集:蘇格拉底的申辯》記述的是公元前399年,一個(gè)叫莫勒圖斯的年輕人在雅典狀告哲學(xué)家蘇格拉底,說他不信城邦諸神,引進(jìn)新的精靈之事,敗壞青年。 于是,蘇格拉底被傳訊,在500人組成的陪審團(tuán)面前作了著名的申辯。'); INSERT INTO `tbl_book` VALUES (10009, '文學(xué)', '魯迅全集', '大師全集,完整收錄,魯迅畢生之心血盡歸于此。\r\n\r\n 魯迅是中國20世紀(jì)的文學(xué)家、思想家、革命家,中國近代文學(xué)巨匠。他早年留學(xué)于日本,后來?xiàng)夅t(yī)從文,他用筆耕不輟的文字為新一代青年們指引方向,在國內(nèi)外思想文化領(lǐng)域有著極高的聲譽(yù)。'); INSERT INTO `tbl_book` VALUES (10010, '文學(xué)', '人間清醒', '茅盾文學(xué)獎(jiǎng)獲得者梁曉聲2021全新力作'); INSERT INTO `tbl_book` VALUES (10011, '經(jīng)濟(jì)', '八次危機(jī):中國的真實(shí)經(jīng)驗(yàn)1949-2009', '著名“三農(nóng)”專家溫鐵軍,用經(jīng)濟(jì)的獨(dú)特視角,重新審視中國的1949-2009,歷史給我了我們怎樣的真實(shí)經(jīng)驗(yàn)?');
2、項(xiàng)目目錄
3、pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>springboot</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot</name> <description>Demo project for Spring Boot</description> <properties> <java.version>8</java.version> </properties> <dependencies> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--mysql-connector--> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.1</version> </dependency> <!--druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
4、application文件
spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/myproject?serverTimezone=UTC username: root password: root mybatis-plus: global-config: db-config: table-prefix: tbl_ id-type: auto configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #開啟MP運(yùn)行日志信息
5、PO類以及VO類
package com.example.po; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Book { ? ? private Integer id; ? ? private String type; ? ? private String name; ? ? private String description; } package com.example.vo; /** ?* 供頁面顯示使用的類 ?*/ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class BookVo { ? ? private String type; ? ? private String name; ? ? private String description; }
6、Dao層
package com.example.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.po.Book; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; @Mapper @Component public interface BookDao extends BaseMapper<Book> { }
7、service以及實(shí)現(xiàn)類
package com.example.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.example.po.Book; /** * 基于 mybatisplus 實(shí)現(xiàn)CRUD快速開發(fā) */ public interface IBookService extends IService<Book> { IPage<Book> getPage(Integer currentPage,Integer pageSize); IPage<Book> getPage(Integer currentPage,Integer pageSize,Book book); } package com.example.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.dao.BookDao; import com.example.po.Book; import com.example.service.IBookService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @Service public class IBookServiceImpl extends ServiceImpl<BookDao, Book> implements IBookService { @Autowired private BookDao bookDao; @Override public IPage<Book> getPage(Integer currentPage, Integer pageSize) { Page<Book> page = new Page<>(currentPage,pageSize); bookDao.selectPage(page,null); return page; } @Override public IPage<Book> getPage(Integer currentPage, Integer pageSize, Book book) { LambdaQueryWrapper<Book> queryWrapper = new LambdaQueryWrapper<Book>(); queryWrapper.like(!StringUtils.isEmpty(book.getType()),Book::getType,book.getType()); queryWrapper.like(!StringUtils.isEmpty(book.getName()),Book::getName,book.getName()); queryWrapper.like(!StringUtils.isEmpty(book.getDescription()),Book::getDescription,book.getDescription()); Page<Book> page = new Page<>(currentPage,pageSize); bookDao.selectPage(page,queryWrapper); return page; } }
8、controller層
package com.example.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.example.global.PlatErrorCodeEnum; import com.example.po.Book; import com.example.global.Response; import com.example.global.ResponseBuilder; import com.example.service.IBookService; import com.example.vo.BookVo; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.stream.Collectors; @RestController @RequestMapping("/books") public class BookController { @Autowired private IBookService bookService; //查詢所有數(shù)據(jù) @GetMapping public Response<List<BookVo>> getBooks(){ List<BookVo> bookList = bookService.list().stream().map(po -> { BookVo vo = new BookVo(); //將兩個(gè)字段相同的對象進(jìn)行屬性值的復(fù)制 BeanUtils.copyProperties(po, vo); return vo; }).collect(Collectors.toList()); return ResponseBuilder.buildNormalResponse(bookList); } //添加數(shù)據(jù) @PostMapping("/save") public Response<Boolean> saveBook(@RequestBody Book book){ Boolean flag = bookService.save(book); return flag == true ? ResponseBuilder.buildNormalResponse() : ResponseBuilder.buildErrorResponse(PlatErrorCodeEnum.ADD_DATA_FAILED); } @PutMapping("/update") public Response<Boolean> updateBook(@RequestBody Book book){ boolean flag = bookService.updateById(book); return flag == true ? ResponseBuilder.buildNormalResponse() : ResponseBuilder.buildErrorResponse(PlatErrorCodeEnum.UPDATE_DATA_FAILED); } //查詢單個(gè)數(shù)據(jù) @GetMapping("{id}") public Response<BookVo> getBookById(@PathVariable Integer id){ Book book = bookService.getById(id); BookVo vo = new BookVo(); BeanUtils.copyProperties(book,vo); return ResponseBuilder.buildNormalResponse(vo); } //刪除單個(gè)數(shù)據(jù) @DeleteMapping("{id}") public Response<Boolean> deleteBook(@PathVariable Integer id){ boolean flag = bookService.removeById(id); return flag == true ? ResponseBuilder.buildNormalResponse() : ResponseBuilder.buildErrorResponse(PlatErrorCodeEnum.DELETE_DATA_FAILED); } //分頁查詢數(shù)據(jù) @GetMapping("{currentPage}/{pageSize}") public Response<List<BookVo>> getBooksByPage(@PathVariable Integer currentPage,@PathVariable Integer pageSize){ IPage<Book> page = bookService.getPage(currentPage,pageSize); //避免查出來所有的數(shù)據(jù),增加一個(gè)vo類,只展示需要的字段 List<BookVo> bookVos = page.getRecords().stream().map(po -> { BookVo vo = new BookVo(); //將兩個(gè)字段相同的對象進(jìn)行屬性值的復(fù)制 BeanUtils.copyProperties(po, vo); return vo; }).collect(Collectors.toList()); return ResponseBuilder.buildNormalResponse(bookVos); } }
9、為了給前端返回統(tǒng)一的值,再加一些優(yōu)化
package com.example.global; public enum PlatErrorCodeEnum { ADD_DATA_FAILED("10000", "添加數(shù)據(jù)失敗"), UPDATE_DATA_FAILED("10001", "更新數(shù)據(jù)失敗"), DELETE_DATA_FAILED("10001", "刪除數(shù)據(jù)失敗") ; public static final String ERROR_CODE="000"; private String code; private String message; PlatErrorCodeEnum(String code, String message) { this.code = code; this.message = message; } public String getCode() { return code; } public String getMessage() { return message; } }
package com.example.global; import lombok.Data; import lombok.ToString; import java.io.Serializable; @Data @ToString(callSuper = true) public class Response<T> implements Serializable { private static final long serialVersionUID = -2644259941898334897L; private String returnCode; private String returnMsg; private T returnData; public Response(){ } public Response(String returnCode){ this.returnCode = returnCode; } public Response(String returnCode, String returnMsg){ this.returnCode = returnCode; this.returnMsg = returnMsg; } public Response(String returnCode, String returnMsg, T returnData){ this.returnCode = returnCode; this.returnMsg = returnMsg; this.returnData = returnData; } public T getReturnData() { return returnData; } public Response<T> setReturnData(T returnData) { this.returnData = returnData; return this; } }
package com.example.global; /** * 構(gòu)造響應(yīng)結(jié)果 */ public final class ResponseBuilder { /** * 返回成功. */ public static final String RESPONSE_OK = "0000"; public static final String RESPONSE_MESSAGE = "響應(yīng)成功"; /** * 構(gòu)造一個(gè)失敗響應(yīng) */ public static <T> Response<T> buildErrorResponse(PlatErrorCodeEnum enums) { Response<T> entity = new Response<>(); entity.setReturnCode(String.valueOf(enums.getCode())); entity.setReturnMsg(enums.getMessage()); return entity; } /** * 構(gòu)造一個(gè)失敗響應(yīng) */ public static <T> Response<T> buildErrorResponse(String error, String message) { Response<T> entity = new Response<>(); entity.setReturnCode(error); entity.setReturnMsg(message); return entity; } /** * 構(gòu)造一個(gè)正常的沒有返回?cái)?shù)據(jù)的響應(yīng) */ public static <T> Response<T> buildNormalResponse() { return new Response<T>(RESPONSE_OK, RESPONSE_MESSAGE); } /** * 構(gòu)造一個(gè)正常的有返回?cái)?shù)據(jù)的響應(yīng) * @param returnData * @param <T> * @return */ public static <T> Response<T> buildNormalResponse(T returnData) { Response<T> entity = buildNormalResponse(); entity.setReturnData(returnData); return entity; } }
10、mybatisplus分頁插件配置
package com.example.config; /** ?* 配置mybatisplus分頁插件 ?*/ import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @MapperScan("com.example.dao") public class MyBatisPlusConf { ? ? @Bean ? ? public PaginationInterceptor mybatisPlusInterceptor(){ ? ? ? ? //創(chuàng)建攔截器 SpringBoot 低版本用 PaginationInterceptor 高版本用 MybatisPlusInterceptor ? ? ? ? PaginationInterceptor interceptor = new PaginationInterceptor(); ? ? ? ? return interceptor; ? ? } }
到此這篇關(guān)于Springboot整合mybatisplus的項(xiàng)目實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Springboot整合mybatisplus 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot整合mybatisplus和druid的示例詳解
- SpringBoot整合MyBatisPlus詳解
- SpringBoot整合Mybatis與MybatisPlus方法詳細(xì)講解
- springboot整合mybatisplus的方法詳解
- 解決SpringBoot整合MybatisPlus分模塊管理遇到的bug
- SpringBoot快速整合Mybatis、MybatisPlus(代碼生成器)實(shí)現(xiàn)數(shù)據(jù)庫訪問功能
- SpringBoot整合MybatisPlus的教程詳解
- SpringBoot+MybatisPlus+代碼生成器整合示例
- Springboot整合MybatisPlus的實(shí)現(xiàn)過程解析
- SpringBoot整合MyBatisPlus配置動(dòng)態(tài)數(shù)據(jù)源的方法
- SpringBoot整合MybatisPlus的簡單教程實(shí)現(xiàn)(簡單整合)
- Springboot接入MyBatisPlus的實(shí)現(xiàn)
相關(guān)文章
SpringBoot接收數(shù)組參數(shù)和集合參數(shù)方式
這篇文章主要介紹了SpringBoot接收數(shù)組參數(shù)和集合參數(shù)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03SpringBoot整合Hutool實(shí)現(xiàn)文件上傳的使用示例
文件上傳在項(xiàng)目經(jīng)常會(huì)用到,本文主要介紹了SpringBoot整合Hutool實(shí)現(xiàn)文件上傳的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11Eclipse 項(xiàng)目出現(xiàn)錯(cuò)誤(紅色嘆號)解決方法
這篇文章主要介紹了Eclipse 項(xiàng)目出現(xiàn)錯(cuò)誤(紅色嘆號)解決方法的相關(guān)資料,需要的朋友可以參考下2017-06-06Spring組件初始化擴(kuò)展點(diǎn)BeanPostProcessor的作用詳解
本文通過實(shí)戰(zhàn)案例和常見應(yīng)用場景詳細(xì)介紹了BeanPostProcessor的使用,并強(qiáng)調(diào)了其在Spring擴(kuò)展中的重要性,感興趣的朋友一起看看吧2025-03-03MyBatis-Plus中如何使用ResultMap的方法示例
本文主要介紹了MyBatis-Plus中如何使用ResultMap,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11淺談Java繼承中的轉(zhuǎn)型及其內(nèi)存分配
這篇文章主要介紹了淺談Java繼承中的轉(zhuǎn)型及其內(nèi)存分配,首先分享了簡單的代碼及運(yùn)行結(jié)果,然后對其進(jìn)行分析,繼而引出了2017-11-11淺談web項(xiàng)目讀取classpath路徑下面的文件
這篇文章主要介紹了淺談web項(xiàng)目讀取classpath路徑下面的文件,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01