最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解Springboot集成mybatis-plus

 更新時(shí)間:2023年04月23日 09:03:16   作者:鈥_holmium  
這篇文章主要介紹了Mybatis-Plus與SpringBoot整合,并在項(xiàng)目中實(shí)戰(zhàn)運(yùn)用,列舉其增刪改查的使用方式,對(duì)學(xué)習(xí)或工作有一定的幫助,需要的小伙伴可以參考閱讀

一、Mybatis-Plus介紹

Mybatis-plus是Mybatis的增強(qiáng)工具包,其官網(wǎng)的介紹如下:

  • 潤(rùn)物細(xì)無(wú)聲:只做增強(qiáng)不做改變,引入它不會(huì)對(duì)現(xiàn)有工程產(chǎn)生影響,如絲般順滑。
  • 效率至上:只需簡(jiǎn)單配置,即可快速進(jìn)行單表CRUD操作,從而節(jié)省大量時(shí)間。
  • 豐富功能:代碼生成、自動(dòng)分頁(yè)、邏輯刪除、自動(dòng)填充等功能一應(yīng)俱全。

其優(yōu)點(diǎn)如下:

  • 無(wú)侵入:Mybatis-Plus 在 Mybatis 的基礎(chǔ)上進(jìn)行擴(kuò)展,只做增強(qiáng)不做改變,引入 Mybatis-Plus 不會(huì)對(duì)您現(xiàn)有的 Mybatis 構(gòu)架產(chǎn)生任何影響,而且 MP 支持所有 Mybatis 原生的特性
  • 依賴少:僅僅依賴 Mybatis 以及 Mybatis-Spring
  • 損耗小:?jiǎn)?dòng)即會(huì)自動(dòng)注入基本CURD,性能基本無(wú)損耗,直接面向?qū)ο蟛僮?/li>
  • 通用CRUD操作:內(nèi)置通用 Mapper、通用 Service,僅僅通過(guò)少量配置即可實(shí)現(xiàn)單表大部分 CRUD 操作,更有強(qiáng)大的條件構(gòu)造器,滿足各類(lèi)使用需求
  • 多種主鍵策略:支持多達(dá)4種主鍵策略(內(nèi)含分布式唯一ID生成器),可自由配置,完美解決主鍵問(wèn)題
  • 支持ActiveRecord:支持 ActiveRecord 形式調(diào)用,實(shí)體類(lèi)只需繼承 Model 類(lèi)即可實(shí)現(xiàn)基本 CRUD 操作
  • 支持代碼生成:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來(lái)使用(P.S. 比 Mybatis 官方的 Generator 更加強(qiáng)大?。?/li>
  • 支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 內(nèi)置分頁(yè)插件:基于Mybatis物理分頁(yè),開(kāi)發(fā)者無(wú)需關(guān)心具體操作,配置好插件之后,寫(xiě)分頁(yè)等同于寫(xiě)基本List查詢
  • 內(nèi)置性能分析插件:可輸出Sql語(yǔ)句以及其執(zhí)行時(shí)間,建議開(kāi)發(fā)測(cè)試時(shí)啟用該功能,能有效解決慢查詢
  • 內(nèi)置全局?jǐn)r截插件:提供全表 delete 、 update 操作智能分析阻斷,預(yù)防誤操作

二、Spring boot 整合Mybatis-plus

2.1 pom中引入Mybatis-plus依賴

<!--?https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter?-->
<dependency>
????<groupId>com.baomidou</groupId>
????<artifactId>mybatis-plus-boot-starter</artifactId>
????<version>3.5.3.1</version>
</dependency>

注:如果是gradle,引入的方式如下:

implementation group: 'com.baomidou', name: 'mybatis-plus-boot-starter', version: '3.5.3.1'

2.2 創(chuàng)建一張User表

創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)表 Schema 的表結(jié)構(gòu)和表數(shù)據(jù):

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `user_base_info`
-- ----------------------------
DROP TABLE IF EXISTS `user_base_info`;
CREATE TABLE `user_base_info` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
  `u_id` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用戶ID',
  `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用戶名',
  `cn_name` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '中文名',
  `sex` char(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '性別',
  `alias` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '別名',
  `web_chat` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '微信號(hào)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

表中插入數(shù)據(jù)

-- ----------------------------
-- Records of user_base_info
-- ----------------------------
INSERT INTO `user_base_info` VALUES ('1', '001', 'holmium', '鈥', '1', '虎嘯山村', 'holmium');
INSERT INTO `user_base_info` VALUES ('2', '001', 'test', '測(cè)試', '0', '美女', '虎嘯山村');

2.3 Mybatis-plus配置

#mybatis-plus
mybatis-plus:
??##?這個(gè)可以不用配置,因其默認(rèn)就是這個(gè)路徑
??mapper-locations:?classpath:/mapper/*Mapper.xml
??#實(shí)體掃描,多個(gè)package用逗號(hào)或者分號(hào)分隔
??typeAliasesPackage:?com.holmium.springboot.repository.*.entity
??global-config:
????#?數(shù)據(jù)庫(kù)相關(guān)配置
????db-config:
??????#主鍵類(lèi)型??AUTO:"數(shù)據(jù)庫(kù)ID自增",?INPUT:"用戶輸入ID",ID_WORKER:"全局唯一ID?(數(shù)字類(lèi)型唯一ID)",?UUID:"全局唯一ID?UUID";
??????id-type:?AUTO
??????#字段策略?IGNORED:"忽略判斷",NOT_NULL:"非?NULL?判斷"),NOT_EMPTY:"非空判斷"
??????field-strategy:?not_empty
??????#駝峰下劃線轉(zhuǎn)換
??????column-underline:?true
??????#數(shù)據(jù)庫(kù)大寫(xiě)下劃線轉(zhuǎn)換
??????#capital-mode:?true
??????#邏輯刪除配置
??????logic-delete-value:?0
??????logic-not-delete-value:?1
??????db-type:?h2
????#刷新mapper?調(diào)試神器
????refresh:?true
??#?原生配置
??configuration:
????map-underscore-to-camel-case:?true
????cache-enabled:?false

2.4 創(chuàng)建一個(gè)實(shí)體

//BasePo,后續(xù)可以繼續(xù)擴(kuò)展
@Data
public?class?BasePo?{
????@TableId(value?=?"id",?type?=?IdType.AUTO)
????private?Integer?id;
}

package?com.holmium.springboot.infra.user.entity;

import?com.baomidou.mybatisplus.annotation.TableField;
import?com.baomidou.mybatisplus.annotation.TableName;
import?lombok.Getter;
import?lombok.Setter;

/**
?*?@author?holmium
?*?@description:
?*?@date?2023年04月20日16:19
?*/
@TableName(value?=?"user_base_info",?autoResultMap?=?true)
@Getter
@Setter
public?class?UserPo?extends?BasePo?{
????/**
?????*?用戶ID
?????*/
????@TableField(value?=?"u_id")
????String?uId;
????/**
?????*?用戶名
?????*/
????@TableField(value?=?"name")
????String?name;
????/**
?????*?中文名稱
?????*/
????@TableField(value?=?"cn_name")
????String?cnName;
????/**
?????*?性別:1-男?0-女
?????*/
????@TableField(value?=?"sex")
????String?sex;
????/**
?????*?別名
?????*/
????@TableField(value?=?"alias")
????String?alias;
????/**
?????*?微信號(hào)
?????*/
????@TableField(value?=?"web_chat")
????String?webChat;
}

2.5 創(chuàng)建一個(gè)Mapper接口

package?com.holmium.springboot.infra.user.mapper;

import?com.baomidou.mybatisplus.core.mapper.BaseMapper;
import?com.holmium.springboot.infra.user.entity.UserPo;
import?org.apache.ibatis.annotations.Mapper;

@Mapper
public?interface?UserMapper?extends?BaseMapper<UserPo>?{
}

2.6 修改服務(wù)接口

//如果不理解,可以看之前的文章
@RestController
@RequestMapping("/user/center")
public?class?UserApi?{
????@Resource
????UserAppImpl?userApp;
??
????@GetMapping(value?=?"/userinfo")
????public?UserVo?gerUserInfo(@RequestParam("id")?String?id)?throws?Exception?{
????????return?userApp.getUserInfoByUserId(id);
????}
}

2.7 在啟動(dòng)類(lèi)中添加 @MapperScan 注解,掃描 Mapper 文件夾

@SpringBootApplication
@MapperScan("com.holmium.springboot.infra.*.mapper")?//添加mapper掃描
public?class?HolmiumApplication?{

????public?static?void?main(String[]?args)?{
????????SpringApplication.run(HolmiumApplication.class,?args);
????}

}

2.8 測(cè)試

2.9 小結(jié)

通過(guò)以上的步驟,我們實(shí)現(xiàn)了對(duì)User表的查詢功能,可以看到對(duì)于簡(jiǎn)單的CRUD操作,Mybatis-Plus只需要定義一個(gè)Mapper接口即可實(shí)現(xiàn),真正做到如他所說(shuō)的那樣,簡(jiǎn)單配置、效率至上。

三、Mybatis-plus 部分字段注解和查詢

3.1 主鍵

3.1.1 主鍵生成策略

主鍵生成策略一共提供的五種:

AUTO(0),遞增策略,如果使用該策略必須要求數(shù)據(jù)表的列也是遞增。
NONE(1),沒(méi)有策略,必須人為的輸入id值
INPUT(2),沒(méi)有策略,必須人為的輸入id值
ASSIGN_ID(3), 隨機(jī)生成一個(gè)Long類(lèi)型的值。該值一定是唯一。而且每次生成都不會(huì)相同。算法:雪花算法。 適合分布式主鍵。
ASSIGN_UUID(4); 隨機(jī)產(chǎn)生一個(gè)String類(lèi)型的值。該值也是唯一的。

3.1.2 使用方式

通過(guò)配置文件中,配置id-type屬性:

mybatis-plus:
??global-config:
???#?數(shù)據(jù)庫(kù)相關(guān)配置
????db-config:
??????#主鍵類(lèi)型??AUTO:"數(shù)據(jù)庫(kù)ID自增",?INPUT:"用戶輸入ID",ID_WORKER:"全局唯一ID?(數(shù)字類(lèi)型唯一ID)",?UUID:"全局唯一ID?UUID";
??????id-type:?AUTO

也可在對(duì)象屬性上進(jìn)行注解設(shè)置:

@Data
public?class?BasePo?{
????//配置為數(shù)據(jù)庫(kù)ID自增
????@TableId(value?=?"id",?type?=?IdType.AUTO)
????private?Integer?id;
}

3.2 刪除

實(shí)際開(kāi)發(fā)過(guò)程中,對(duì)數(shù)據(jù)都不會(huì)直接刪除,都會(huì)采用邏輯刪除的方式。所謂的邏輯刪除,只是將數(shù)據(jù)置為一個(gè)狀態(tài),這個(gè)狀態(tài)代表數(shù)據(jù)為刪除狀態(tài),一般自己程序中寫(xiě)的話,就設(shè)置一個(gè)狀態(tài)字段,給字段賦值為0D代表刪除。而Mybatis-plus提供了@TableLogic注解,實(shí)現(xiàn)邏輯刪除。 只對(duì)自動(dòng)注入的 sql 起效:

  • 插入: 不作限制
  • 查找: 追加 where 條件過(guò)濾掉已刪除數(shù)據(jù),且使用 wrapper.entity 生成的 where 條件會(huì)忽略該字段
  • 更新: 追加 where 條件防止更新到已刪除數(shù)據(jù),且使用 wrapper.entity 生成的 where 條件會(huì)忽略該字段
  • 刪除: 轉(zhuǎn)變?yōu)?更新
@Data
public?class?BasePo?{
????/**
?????*?主鍵
?????*/
????@TableId(value?=?"id",?type?=?IdType.AUTO)
????private?Integer?id;

????/**
?????*?是否刪除:0表示未刪除?1表示刪除.
?????*/
????@TableLogic
????private?Boolean?deleted;
}

3.3 自動(dòng)填充

實(shí)際開(kāi)發(fā)中,我們會(huì)在表中記錄數(shù)據(jù)創(chuàng)建時(shí)間、創(chuàng)建人、修改時(shí)間、修改人幾個(gè)字段,但是幾個(gè)字段如果我們每次都要進(jìn)行賦值,代碼比較冗余,Mybatis-plus提供的自動(dòng)填充功能。

3.3.1 增加公共屬性對(duì)象:

@Data
public?class?BasePo?{
????/**
?????*?主鍵
?????*/
????@TableId(value?=?"id",?type?=?IdType.AUTO)
????private?Integer?id;

????/**
?????*?創(chuàng)建時(shí)間
?????*/
????@TableField(fill?=?FieldFill.INSERT)
????@JsonFormat(pattern?=?"yyyy-MM-dd?HH:mm:ss")
????private?Date?createTime;
????/**
?????*?最后更新時(shí)間
?????*/
????@TableField(fill?=?FieldFill.INSERT_UPDATE)
????@JsonFormat(pattern?=?"yyyy-MM-dd?HH:mm:ss")
????private?Date?updateTime;
????/**
?????*?創(chuàng)建者,默認(rèn)系統(tǒng)User?的?id?編號(hào)
?????*?<p>
?????*?使用?String?類(lèi)型的原因是,未來(lái)可能會(huì)存在非數(shù)值的情況,留好拓展性。
?????*/
????@TableField(fill?=?FieldFill.INSERT,?jdbcType?=?JdbcType.VARCHAR)
????private?String?creator;
????/**
?????*?更新者,默認(rèn)系統(tǒng)User?的?id?編號(hào)
?????*?<p>
?????*?使用?String?類(lèi)型的原因是,未來(lái)可能會(huì)存在非數(shù)值的情況,留好拓展性。
?????*/
????@TableField(fill?=?FieldFill.INSERT_UPDATE,?jdbcType?=?JdbcType.VARCHAR)
????private?String?updater;

????/**
?????*?是否刪除
?????*/
????@TableLogic
????private?Boolean?deleted;
}

3.3.2 自定義實(shí)現(xiàn)類(lèi) MyMetaObjectHandler

public?class?DefaultDbFieldHandler?implements?MetaObjectHandler?{

????@Override
????public?void?insertFill(MetaObject?metaObject)?{
????????if?(Objects.nonNull(metaObject)?&&?metaObject.getOriginalObject()?instanceof?BaseEntity)?{
????????????BaseEntity?baseDO?=?(BaseEntity)?metaObject.getOriginalObject();
????
????????????Date?current?=?new?Date();
????????????//?創(chuàng)建時(shí)間為空,則以當(dāng)前時(shí)間為插入時(shí)間
????????????if?(Objects.isNull(baseDO.getCreateTime()))?{
????????????????baseDO.setCreateTime(current);
????????????}
????????????//?更新時(shí)間為空,則以當(dāng)前時(shí)間為更新時(shí)間
????????????if?(Objects.isNull(baseDO.getUpdateTime()))?{
????????????????baseDO.setUpdateTime(current);
????????????}
????
????????????Long?userId?=?WebUtils.getLoginUserId();
????????????//?當(dāng)前登錄用戶不為空,創(chuàng)建人為空,則當(dāng)前登錄用戶為創(chuàng)建人
????????????if?(Objects.nonNull(userId)?&&?Objects.isNull(baseDO.getCreator()))?{
????????????????baseDO.setCreator(userId.toString());
????????????}
????????????//?當(dāng)前登錄用戶不為空,更新人為空,則當(dāng)前登錄用戶為更新人
????????????if?(Objects.nonNull(userId)?&&?Objects.isNull(baseDO.getUpdater()))?{
????????????????baseDO.setUpdater(userId.toString());
????????????}
????????}
????}
????
????@Override
????public?void?updateFill(MetaObject?metaObject)?{
????????//?更新時(shí)間為空,則以當(dāng)前時(shí)間為更新時(shí)間
????????Object?modifyTime?=?getFieldValByName("updateTime",?metaObject);
????????if?(Objects.isNull(modifyTime))?{
????????????setFieldValByName("updateTime",?new?Date(),?metaObject);
????????}
????
????????//?當(dāng)前登錄用戶不為空,更新人為空,則當(dāng)前登錄用戶為更新人
????????Object?modifier?=?getFieldValByName("updater",?metaObject);
????????Long?userId?=?WebUtils.getLoginUserId();
????????if?(Objects.nonNull(userId)?&&?Objects.isNull(modifier))?{
????????????setFieldValByName("updater",?userId.toString(),?metaObject);
????????}
????}
}

3.4 條件查詢

3.4.1 根據(jù)各種條件查詢

Wrapper:封裝了關(guān)于查詢的各種條件方法。

有三個(gè)子類(lèi)最常用: LambdaQueryWrapper查詢條件 LambdaUpdateWrapper修改條件 LambdaQueryWrapper查詢使用lambda表達(dá)式條件

  • LambdaQueryWrapper
selectPage(userDo,?new?LambdaQueryWrapperX<UserPo>()
????????????????.likeIfPresent(UserPo::getName,?userDo.getName())
????????????????.likeIfPresent(UserPo::getSex,?userDo.getSex())
????????????????.betweenIfPresent(UserPo::getCreateTime,?userDo.getCreateTime())
????????????????.orderByDesc(UserPo::getId))
  • LambdaUpdateWrapper
update(update,?new?LambdaUpdateWrapper<UserPo>()
???????????????.eq(UserPo::getId,?id).eq(UserPo::getName,?name))
  • LambdaQueryWrapper
new?LambdaQueryWrapper<UserDo>()
????????????????.eq(UserPo::getId,?id)
????????????????.eq(UserPo::getName,?name);

3.5 分頁(yè)查詢

  • 添加分頁(yè)攔截器
???@Bean
???public?MybatisPlusInterceptor?mybatisPlusInterceptor()?{
???????MybatisPlusInterceptor?mybatisPlusInterceptor?=?new?MybatisPlusInterceptor();
???????//?分頁(yè)插件
???????mybatisPlusInterceptor.addInnerInterceptor(new?PaginationInnerInterceptor(DbType.MYSQL));
???????return?mybatisPlusInterceptor;
???}
  • 分頁(yè)查詢
Page<UserPo>?page?=?userMapper.selectPage(page,?wrapper);//把查詢的結(jié)果自動(dòng)封裝到Page對(duì)象中

3.6 小結(jié)

到此簡(jiǎn)單的查詢基本已介紹完畢,可滿足他80%的日常開(kāi)發(fā)需求。

四、引入對(duì)象轉(zhuǎn)換組件mapstruct

從上述代碼中可以看到,我們從數(shù)據(jù)庫(kù)查詢出來(lái)的結(jié)果是轉(zhuǎn)換為一個(gè)想XXXPo的對(duì)象,而接口返回的是XXXVo對(duì)象。在實(shí)際項(xiàng)目中,一般一個(gè)project都會(huì)分很多層,每層都會(huì)定義自己的對(duì)象,如:PO、VO、DAO、BO、DTO、POJO等等。

  • DO(Data Object):此對(duì)象與數(shù)據(jù)庫(kù)表結(jié)構(gòu)一一對(duì)應(yīng),通過(guò) DAO 層向上傳輸數(shù)據(jù)源對(duì)象。
  • DTO(Data Transfer Object):數(shù)據(jù)傳輸對(duì)象,Service 或 Manager 向外傳輸?shù)膶?duì)象。
  • BO(Business Object):業(yè)務(wù)對(duì)象,由 Service 層輸出的封裝業(yè)務(wù)邏輯的對(duì)象。
  • AO(ApplicationObject):應(yīng)用對(duì)象,在Web層與Service層之間抽象的復(fù)用對(duì)象模型, 極為貼近展示層,復(fù)用度不高。
  • VO(View Object):顯示層對(duì)象,通常是 Web 向模板渲染引擎層傳輸?shù)膶?duì)象。
  • POJO是DO/DTO/BO/VO的統(tǒng)稱,禁止命名成xxxPOJO。

這些對(duì)象在傳遞過(guò)程中,需要相互轉(zhuǎn)換,如果手工書(shū)寫(xiě),往往會(huì)通過(guò)getxxx,再setxxx,操作起來(lái)非常繁瑣,那有沒(méi)有一種方式比較簡(jiǎn)單實(shí)現(xiàn)能?下面我們介紹一個(gè)對(duì)象轉(zhuǎn)換的組件mapstruct

4.1 pom中引入依賴包

<!--?https://mvnrepository.com/artifact/org.mapstruct/mapstruct?-->
<dependency>
????<groupId>org.mapstruct</groupId>
????<artifactId>mapstruct</artifactId>
????<version>1.5.4.Final</version>
</dependency>

4.2 創(chuàng)建一個(gè)Convert接口

package?com.holmium.springboot.app.user.convert;

import?com.holmium.springboot.api.user.vo.UserVo;
import?com.holmium.springboot.common.user.app.dto.UserDto;
import?org.mapstruct.Mapper;?
import?org.mapstruct.factory.Mappers;

/**
?*?@author?holmium
?*?@date?2023年04月16日?20:24
?*/
@Mapper
public?interface?UserAppConvert?{
????UserAppConvert?INSTANCES?=?Mappers.getMapper(UserAppConvert.class);
????UserVo?voToDto(UserDto?userDto);
}

避坑

這里的@Mapper注解和上述Mybatis-plus中的@Mapper注解相同,很容易引入錯(cuò)誤,導(dǎo)致會(huì)報(bào)錯(cuò)。

這里的Mapperimport org.mapstruct.Mapper;

mybatis-plus中的@Mapper, import org.apache.ibatis.annotations.Mapper;

一定要注意看清楚引入的類(lèi)

4.3 在類(lèi)中引用

@Service
public?class?UserAppImpl?implements?UserApp?{
????@Resource
????public?UserDomain?userDomain;
????@Override
????public?UserVo?getUserInfoByUserId(String?userId)?throws?Exception?{
????????//這樣就實(shí)現(xiàn)了對(duì)象轉(zhuǎn)換
????????return?UserAppConvert.INSTANCES.voToDto(userDomain.getUserInfoByUid(userId));
????}
}

4.4 對(duì)象屬性不同怎么轉(zhuǎn)換

上述是兩個(gè)對(duì)象中屬性相同話,可以不用做其他任何操作,就可以事項(xiàng)對(duì)象互轉(zhuǎn),但實(shí)際在開(kāi)發(fā)中,兩個(gè)對(duì)象屬性不可能完全一樣。而上述操作只能將相同屬性做轉(zhuǎn)換,不同的屬性沒(méi)法互相轉(zhuǎn)換,導(dǎo)致對(duì)象有部分?jǐn)?shù)據(jù)丟失?那怎么解決,可在轉(zhuǎn)換方法上加入@Mappings注解,如下:

@Mapper
public?interface?UserAppConvert?{

????UserAppConvert?INSTANCES?=?Mappers.getMapper(UserAppConvert.class);
????@Mappings({
????????????//屬性不一致轉(zhuǎn)換
????????????@Mapping(source?=?"name",?target?=?"userName"),
????????????//類(lèi)型不一致轉(zhuǎn)換
????????????@Mapping(target?=?"createTime",?expression?=?"java(com.java.mmzsblog.util.DateTransform.strToDate(source.getCreateTime()))"),
????})
????UserVo?voToDto(UserDto?userDto);
}

這樣就解決了不同對(duì)象屬性和屬性類(lèi)型不一致轉(zhuǎn)換問(wèn)題。

五、寫(xiě)在最后

截止本篇文章,我們已經(jīng)將如何創(chuàng)建一個(gè)Spring boot 工程,如何開(kāi)發(fā)一個(gè)服務(wù),以及從數(shù)據(jù)庫(kù)總獲取數(shù)據(jù)基本已完成。根據(jù)這一系列文章,大家做日常的開(kāi)發(fā)聯(lián)系基本夠。

后續(xù)章節(jié)將把druid和mybatis-plus的整合轉(zhuǎn)換成starter的方式,對(duì)其做一定的封裝。

同時(shí)我們會(huì)將系統(tǒng)的應(yīng)用架構(gòu)轉(zhuǎn)換成DDD模式架構(gòu),后續(xù)我將用多個(gè)篇幅介紹DDD架構(gòu)。請(qǐng)持續(xù)關(guān)注跟蹤。

以上就是一文詳解Springboot集成mybatis-plus的詳細(xì)內(nèi)容,更多關(guān)于Springboot集成mybatis-plus的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring實(shí)戰(zhàn)之SpEl語(yǔ)法實(shí)例詳解

    Spring實(shí)戰(zhàn)之SpEl語(yǔ)法實(shí)例詳解

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之SpEl語(yǔ)法,結(jié)合實(shí)例形式分析了SpEl創(chuàng)建數(shù)組、集合及解析變量等相關(guān)操作原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-12-12
  • Springboot基于BCrypt非對(duì)稱加密字符串的實(shí)現(xiàn)

    Springboot基于BCrypt非對(duì)稱加密字符串的實(shí)現(xiàn)

    本文主要介紹了Springboot基于BCrypt非對(duì)稱加密字符串的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • spring定時(shí)任務(wù)執(zhí)行兩次及tomcat部署緩慢問(wèn)題的解決方法

    spring定時(shí)任務(wù)執(zhí)行兩次及tomcat部署緩慢問(wèn)題的解決方法

    這篇文章主要給大家介紹了關(guān)于spring定時(shí)任務(wù)執(zhí)行兩次及tomcat部署緩慢問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • 在IDEA中創(chuàng)建跑得起來(lái)的Springboot項(xiàng)目

    在IDEA中創(chuàng)建跑得起來(lái)的Springboot項(xiàng)目

    這篇文章主要介紹了在IDEA中創(chuàng)建跑得起來(lái)的Springboot項(xiàng)目的圖文教程,需要的朋友可以參考下
    2018-04-04
  • 深入學(xué)習(xí)java內(nèi)存化和函數(shù)式協(xié)同

    深入學(xué)習(xí)java內(nèi)存化和函數(shù)式協(xié)同

    這篇文章主要介紹了深入學(xué)習(xí)java內(nèi)存化和函數(shù)式協(xié)同,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • Java中static變量作用和用法詳解

    Java中static變量作用和用法詳解

    Java 中被 static 修飾的成員稱為靜態(tài)成員或類(lèi)成員。它屬于整個(gè)類(lèi)所有,而不是某個(gè)對(duì)象所有,即被類(lèi)的所有對(duì)象所共享。靜態(tài)成員可以使用類(lèi)名直接訪問(wèn),也可以使用對(duì)象名進(jìn)行訪問(wèn).下面我們來(lái)詳細(xì)了解一下吧
    2019-06-06
  • Java中的跨域和@CrossOrigin注解的作用詳解

    Java中的跨域和@CrossOrigin注解的作用詳解

    這篇文章主要介紹了Java中的跨域和@CrossOrigin注解的作用詳解,跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript施加的安全限制,需要的朋友可以參考下
    2023-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)之鏈表實(shí)現(xiàn)(單向、雙向鏈表及鏈表反轉(zhuǎn))

    Java數(shù)據(jù)結(jié)構(gòu)之鏈表實(shí)現(xiàn)(單向、雙向鏈表及鏈表反轉(zhuǎn))

    這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之鏈表實(shí)現(xiàn)的相關(guān)資料,其中包括單向鏈表、雙向鏈表及鏈表反轉(zhuǎn)的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2021-06-06
  • Java泛型中<?>和<T>的區(qū)別淺析

    Java泛型中<?>和<T>的區(qū)別淺析

    <T>和<?>的區(qū)別 <T>是參數(shù)類(lèi)型,常常用于泛型類(lèi)或泛型方法的定義,下面這篇文章主要給大家介紹了關(guān)于Java泛型中<?>和<T>區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 解決MyBatis中Enum字段參數(shù)解析問(wèn)題

    解決MyBatis中Enum字段參數(shù)解析問(wèn)題

    本文主要介紹了解決MyBatis中Enum字段參數(shù)解析問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論

浮山县| 墨玉县| 昌邑市| 廊坊市| 万荣县| 武清区| 维西| 康乐县| 安平县| 化德县| 贵德县| 精河县| 会宁县| 北票市| 桓仁| 台南县| 延庆县| 平果县| 诸暨市| 玉龙| 全州县| 鄂托克旗| 荆门市| 晋中市| 鹿邑县| 来安县| 贡觉县| 胶州市| 武功县| 汤阴县| 岗巴县| 临沭县| 桐梓县| 开鲁县| 常宁市| 阿合奇县| 徐闻县| 民和| 辽宁省| 云梦县| 梓潼县|