SpringBoot整合MybatisPlus實現(xiàn)增刪改查功能
1.概述
MybatisPlus是國產(chǎn)的第三方插件, 它封裝了許多常用的CURDapi,免去了我們寫mapper.xml的重復(fù)勞動,這里介紹了基本的整合SpringBoot和基礎(chǔ)用法。
2.引入依賴
在項目中pom
文件引入mybatisplus
和mysql
驅(qū)動依賴,如下
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency>
3.配置連接信息
在項目中application.yaml文件中配置數(shù)據(jù)庫的連接信息
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/didiadmin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true username: root password: 123456
4.新建兩個表
本案例通過一個完整的業(yè)務(wù)流程來介紹如何使用mybatispuls
,首先在數(shù)據(jù)庫中新建兩個表,一個是字典類型表sys_dict_type
和一個字典數(shù)據(jù)表sys_dict_data
CREATE TABLE `sys_dict_type` ( `id` CHAR (19) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '標(biāo)識', `type_name` VARCHAR (255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典類型名稱', `type_code` VARCHAR (255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典類型標(biāo)識', `description` VARCHAR (255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典類型描述', `enable` CHAR (1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否啟用', `create_by` CHAR (19) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '創(chuàng)建人ID', `create_name` CHAR (19) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '創(chuàng)建人名稱', `create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建時間', `update_by` CHAR (19) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人ID', `update_name` CHAR (19) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人名稱', `update_time` datetime DEFAULT NULL COMMENT '修改時間', `remark` VARCHAR (255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '備注', PRIMARY KEY (`id`) USING BTREE ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC CREATE TABLE `sys_dict_data` ( `data_id` CHAR (19) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '標(biāo)識', `data_label` CHAR (19) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典標(biāo)簽', `data_value` CHAR (20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典值', `type_code` CHAR (20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '所屬類型', `is_default` CHAR (1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否默認(rèn)', `update_by` CHAR (19) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人ID', `update_name` CHAR (19) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人名稱', `update_time` datetime DEFAULT NULL COMMENT '修改時間', `create_by` VARCHAR (255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '創(chuàng)建人ID', `create_name` CHAR (19) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '創(chuàng)建人名稱', `create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建時間', `remark` VARCHAR (255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '備注', `enable` CHAR (1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否啟用', PRIMARY KEY (`data_id`) USING BTREE ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC
5.在項目中創(chuàng)建相應(yīng)的實體類
通過觀察SQL語句發(fā)現(xiàn)兩個表中有很多相同的字段,所有我們把相同的字段抽離出來,放到一個基礎(chǔ)的實體類中,其他實體類通過集成方式獲取公共的字段。
5.1 創(chuàng)建基礎(chǔ)實體類
package com.didiplus.common.base; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import java.io.Serializable; import java.time.LocalDateTime; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: 基 礎(chǔ) 實 體 類 */ @Data public class BaseDomain implements Serializable { /** * 創(chuàng)建時間 */ @TableField(value = "create_time", fill = FieldFill.INSERT) private LocalDateTime createTime; /** * 創(chuàng)建人 */ @TableField(value = "create_by", fill = FieldFill.INSERT) private String createBy; /** * 創(chuàng)建人名稱 */ @TableField(value = "create_name", fill = FieldFill.INSERT) private String createName; /** * 修改時間 */ @TableField(value = "update_time", fill = FieldFill.UPDATE) private LocalDateTime updateTime; /** * 修改人 */ @TableField(value = "update_by", fill = FieldFill.UPDATE) private String updateBy; /** * 修改人名稱 */ @TableField(value = "update_name", fill = FieldFill.UPDATE) private String updateName; /** * 備注 */ private String remark; }
@TableField 是mybatisplus中的一個注解,后面會講解到的。
基礎(chǔ)實體類創(chuàng)建好了,接著我們把剩下的兩個實體類也一同創(chuàng)建吧。
5.2 SysDictType實體類
package com.didiplus.modules.sys.domain; import com.didiplus.common.base.BaseDomain; import com.didiplus.common.base.ValidGroup; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.*; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/25 * Desc: 字典類型領(lǐng)域模型 */ @Data @ApiModel(value = "字典類型") public class SysDictType extends BaseDomain { /** * 標(biāo)識 */ @Null(groups = ValidGroup.Crud.Create.class) @NotNull(groups = ValidGroup.Crud.Update.class,message = "字典ID不能為空") @ApiModelProperty("ID") private String id; /** * 字典名稱 */ @NotBlank(message = "字典名稱必填項") @ApiModelProperty(value = "字典名稱",example = "用戶ID") private String typeName; /** * 字典類型 */ @NotBlank(message = "字典編碼不能為空") @ApiModelProperty(value = "字典編碼") private String typeCode; /** * 字典描述 */ @ApiModelProperty(value = "字典描述") private String description; /** * 字典可用狀態(tài) */ @NotBlank(message = "字典狀態(tài)不能為空") @ApiModelProperty(value = "字典狀態(tài)") private Boolean enable; }
5.3 SysDictData實體類
package com.didiplus.modules.sys.domain; import com.baomidou.mybatisplus.annotation.TableField; import com.didiplus.common.base.BaseDomain; import com.didiplus.common.base.ValidGroup; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Null; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: 字典值領(lǐng)域模型 */ @Data public class SysDictData extends BaseDomain { /** * id 編號 */ @Null(groups = ValidGroup.Crud.Create.class) @NotNull(groups = ValidGroup.Crud.Update.class,message = "字典數(shù)據(jù)ID不能為空") @ApiModelProperty("ID") @TableField(value = "data_id") private String dataId; /** * 字典顯示 */ @NotBlank(message = "字典數(shù)據(jù)名稱必填項") @ApiModelProperty(value = "字典數(shù)據(jù)名稱") private String dataLabel; /** * 字典值 */ @NotBlank(message = "字典數(shù)據(jù)值不能為空") @ApiModelProperty(value = "字典數(shù)據(jù)值") private String dataValue; /** * 字典類型 */ @ApiModelProperty(value = "字典編碼") @NotBlank(message = "字典數(shù)據(jù)值不能為空") private String typeCode; /** * 是否為默認(rèn) */ @ApiModelProperty(value = "字典編碼") @NotBlank(message = "字典數(shù)據(jù)值不能為空") private String isDefault; /** * 是否啟用 */ @NotBlank(message = "字典狀態(tài)不能為空") @ApiModelProperty(value = "字典數(shù)據(jù)狀態(tài)") private Boolean enable; }
6.創(chuàng)建DAO繼承MybatisPlus增強接口
為兩個實體類中分別添加DAO繼承MybatisPlus增強接口,這樣就可以集成了增刪改查的功能了。
6.1 SysDictTypeMapper
package com.didiplus.modules.sys.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.didiplus.modules.sys.domain.SysDictType; import org.apache.ibatis.annotations.Mapper; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: 字典類型接口 */ @Mapper public interface SysDictTypeMapper extends BaseMapper<SysDictType> { }
6.2 SysDictDataMapper
package com.didiplus.modules.sys.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.didiplus.modules.sys.domain.SysDictData; import org.apache.ibatis.annotations.Mapper; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: 字典數(shù)據(jù)接口 */ @Mapper public interface SysDictDataMapper extends BaseMapper<SysDictData> { }
7.進一步封裝到Service層
7.1 定義Service接口中的抽象方法
1.SysDictDataService
package com.didiplus.modules.sys.service; import com.baomidou.mybatisplus.extension.service.IService; import com.didiplus.modules.sys.domain.SysDictData; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: */ public interface SysDictDataService extends IService<SysDictData> { }
2.SysDictTypeService
package com.didiplus.modules.sys.service; import com.baomidou.mybatisplus.extension.service.IService; import com.didiplus.modules.sys.domain.SysDictType; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: */ public interface SysDictTypeService extends IService<SysDictType> { }
7.2 實現(xiàn)Service接口中的方法
1.SysDictTypeServiceImpl
package com.didiplus.modules.sys.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.didiplus.modules.sys.domain.SysDictType; import com.didiplus.modules.sys.mapper.SysDictTypeMapper; import com.didiplus.modules.sys.service.SysDictTypeService; import org.springframework.stereotype.Service; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: */ @Service public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements SysDictTypeService { }
2.SysDictDataServiceImpl
package com.didiplus.modules.sys.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.didiplus.modules.sys.domain.SysDictType; import com.didiplus.modules.sys.mapper.SysDictTypeMapper; import com.didiplus.modules.sys.service.SysDictTypeService; import org.springframework.stereotype.Service; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: */ @Service public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements SysDictTypeService { }
8.在控制層上進行增刪改查操作
8.1 SysDictTypeController
package com.didiplus.modules.sys.controller; import com.didiplus.common.base.ValidGroup; import com.didiplus.modules.sys.domain.SysDictType; import com.didiplus.modules.sys.service.SysDictTypeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.parameters.RequestBody; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/25 * Desc: 數(shù)據(jù)字典控制器 */ @RestController @Api(tags = "數(shù)據(jù)字典") @RequestMapping("/api/sys/dictType") public class SysDictTypeController { @Autowired SysDictTypeService sysDictTypeService; @ApiOperation("字典添加") @PostMapping("/add") public String add(@Validated(value = ValidGroup.Crud.Create.class) @RequestBody SysDictType sysDictType) { return sysDictTypeService.save(sysDictType)? "添加成功":"添加失敗"; } @ApiOperation("字典修改") @PutMapping("/edit") public String edit(@Validated(value = ValidGroup.Crud.Update.class) @RequestBody SysDictType sysDictType) { return sysDictTypeService.updateById(sysDictType)? "修改成功":"修改失敗"; } @ApiOperation("字典刪除") @DeleteMapping("/del/{id}") public String del( @PathVariable String id) { return sysDictTypeService.removeById(id)? "刪除成功":"刪除失敗"; } }
體驗效果
新增數(shù)據(jù)
修改數(shù)據(jù)
刪除數(shù)據(jù)
9.自動填充功能
原理:
- 實現(xiàn)元對象處理器接口:
com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
- 注解填充字段
@TableField(.. fill = FieldFill.INSERT)
生成器策略部分也可以配置!
9.1 自定義實現(xiàn)類 DomainInterceptor
package com.didiplus.common.web.interceptor; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.time.LocalDateTime; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/5/4 * Desc: 字 段 填 充 攔 截 器 */ @Component public class DomainInterceptor implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { createField(metaObject); } @Override public void updateFill(MetaObject metaObject) { updateField(metaObject); } /** * @Field 創(chuàng)建時間 * */ public void createField(MetaObject metaObject){ this.strictInsertFill(metaObject,"createTime", LocalDateTime.class,LocalDateTime.now()); } /** * @Field 修改時間 * */ public void updateField(MetaObject metaObject) { this.strictUpdateFill(metaObject,"updateTime",LocalDateTime.class,LocalDateTime.now()); } }
10.分頁查詢
10.1 添加分頁插件
package com.didiplus.common.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/5/4 * Desc: mybatis-plus分頁插件 */ @Configuration public class MyBatisPlusConfig { /** * mybatis-plus分頁插件 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
10.2 定義分頁接口
package com.didiplus.modules.sys.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.didiplus.common.web.domain.PageDomain; import com.didiplus.modules.sys.domain.SysDictType; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: 數(shù)據(jù)字典類型服務(wù)類 */ public interface SysDictTypeService extends IService<SysDictType> { IPage<SysDictType> page(PageDomain pageDomain); }
10.3 實現(xiàn)分頁接口
package com.didiplus.modules.sys.service.impl; 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.didiplus.common.web.domain.PageDomain; import com.didiplus.modules.sys.domain.SysDictType; import com.didiplus.modules.sys.mapper.SysDictTypeMapper; import com.didiplus.modules.sys.service.SysDictTypeService; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/29 * Desc: */ @Service public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements SysDictTypeService { @Resource SysDictTypeMapper sysDictTypeMapper; @Override public IPage<SysDictType> page(PageDomain pageDomain) { IPage<SysDictType> page = new Page<>(pageDomain.getPage(),pageDomain.getLimit()); return sysDictTypeMapper.selectPage(page,null); } }
10.4 控制層調(diào)用
@RestController @Api(tags = "數(shù)據(jù)字典") @RequestMapping("/api/sys/dictType") public class SysDictTypeController { @Autowired SysDictTypeService sysDictTypeService; @ApiOperation("字典分頁查詢") @GetMapping public IPage list(@RequestBody PageDomain pageDomain){ return sysDictTypeService.page(pageDomain); } }
PageDomain定義了分頁接收的兩個參數(shù)
PageDomain類
package com.didiplus.common.web.domain; import lombok.Data; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/5/4 * Desc: 分 頁 參 數(shù) 封 裝 */ @Data public class PageDomain { /** * 當(dāng)前頁 */ private Integer page; /** * 每頁數(shù)量 */ private Integer limit; }
10.5 體驗效果
以上就是SpringBoot整合MybatisPlus實現(xiàn)增刪改查功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot MybatisPlus增刪改查的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring事務(wù)框架之TransactionStatus源碼解析
這篇文章主要為大家介紹了Spring事務(wù)框架之TransactionStatus源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08java String、StringBuilder和StringBuffer的區(qū)別詳解
這篇文章主要介紹了java String、StringBuilder和StringBuffer的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01關(guān)于Java創(chuàng)建線程的2種方式以及對比
這篇文章主要給大家介紹了關(guān)于Java創(chuàng)建線程的2種方式以及對比的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-01-01idea指定maven的settings文件不生效的問題解決
本文主要介紹了idea指定maven的settings文件不生效的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06修改Springboot默認(rèn)序列化工具Jackson配置的實例代碼
這篇文章主要介紹了如何修改Springboot默認(rèn)序列化工具Jackson的配置,當(dāng)Spring容器中存在多個同類型的Bean時,默認(rèn)情況下最后一個創(chuàng)建的Bean將作為首選Bean,文中通過代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02完美解決idea創(chuàng)建文件時,文件不分級展示的情況
這篇文章主要介紹了完美解決idea創(chuàng)建文件時,文件不分級展示的情況,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02SpringCloud中的Stream服務(wù)間消息傳遞詳解
這篇文章主要介紹了SpringCloud中的Stream服務(wù)間消息傳遞詳解,Stream 就是在消息隊列的基礎(chǔ)上,對其進行封裝,可以是我們更方便的去使用,Stream應(yīng)用由第三方的中間件組成,應(yīng)用間的通信通過輸入通道和輸出通道完成,需要的朋友可以參考下2024-01-01