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

MybatisPlus中靜態(tài)工具DB的實(shí)現(xiàn)

 更新時(shí)間:2025年12月25日 09:24:21   作者:她說..  
本文主要介紹了使用MybatisPlus的Db靜態(tài)工具類來避免Service之間的循環(huán)依賴問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

靜態(tài)工具DB

有的時(shí)候Service之間也會(huì)相互調(diào)用,為了避免出現(xiàn)循環(huán)依賴問題,MybatisPlus提供一個(gè)靜態(tài)工具類:Db,其中的一些靜態(tài)方法與IService中方法簽名基本一致,也可以幫助我們實(shí)現(xiàn)CRUD功能:

循環(huán)依賴的定義:

循環(huán)依賴(Circular Dependency) 是指 兩個(gè)或多個(gè)組件(類、模塊、包、服務(wù)等)之間存在直接或間接的相互依賴關(guān)系,形成一個(gè)閉環(huán),導(dǎo)致系統(tǒng)無法正確初始化、編譯或維護(hù)。

靜態(tài)根據(jù)DB示例:

@Test
void testDbGet() {
    User user = Db.getById(1L, User.class);
    System.out.println(user);
}

@Test
void testDbList() {
    // 利用Db實(shí)現(xiàn)復(fù)雜條件查詢
    List<User> list = Db.lambdaQuery(User.class)
            .like(User::getUsername, "o")
            .ge(User::getBalance, 1000)
            .list();
    list.forEach(System.out::println);
}

@Test
void testDbUpdate() {
    Db.lambdaUpdate(User.class)
            .set(User::getBalance, 2000)
            .eq(User::getUsername, "Rose");
}

Db.lambdaQuery(Address.class)中參數(shù)位置需要放實(shí)體類對(duì)象的字節(jié)碼文件,通過傳入實(shí)體類的class字節(jié)碼,拿到字節(jié)碼就能通過反射拿到實(shí)體類的相關(guān)信息,從而拿到注解上的信息諸如類名、表名等,以此實(shí)現(xiàn)CURD。

示例:

需求一

改造根據(jù)id用戶查詢的接口,查詢用戶的同時(shí)返回用戶收貨地址列表

(在userService中要注入addressService,需要查詢收貨地址列表)

首先,我們要添加一個(gè)收貨地址的VO對(duì)象,用于視圖返回給前端:

package com.itheima.mp.domain.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel(description = "收貨地址VO")
public class AddressVO{

    @ApiModelProperty("id")
    private Long id;

    @ApiModelProperty("用戶ID")
    private Long userId;

    @ApiModelProperty("省")
    private String province;

    @ApiModelProperty("市")
    private String city;

    @ApiModelProperty("縣/區(qū)")
    private String town;

    @ApiModelProperty("手機(jī)")
    private String mobile;

    @ApiModelProperty("詳細(xì)地址")
    private String street;

    @ApiModelProperty("聯(lián)系人")
    private String contact;

    @ApiModelProperty("是否是默認(rèn) 1默認(rèn) 0否")
    private Boolean isDefault;

    @ApiModelProperty("備注")
    private String notes;
}

然后,改造原來的UserVO,添加一個(gè)地址屬性,用來存儲(chǔ)當(dāng)前用戶的地址列表屬性:

@Data
@ApiModel(description = "用戶VO實(shí)體")
public class UserVO {

    @ApiModelProperty("用戶id")
    private Long id;

    @ApiModelProperty("用戶名")
    private String username;

    @ApiModelProperty("詳細(xì)信息")
    private UserInfo info;

    @ApiModelProperty("使用狀態(tài)(1正常 2凍結(jié))")
    private UserStatus status;

    @ApiModelProperty("賬戶余額")
    private Integer balance;

    @ApiModelProperty("用戶的收貨地址")
    private List<AddressVO> addresses;
}

接下來,修改UserController中根據(jù)id查詢用戶的業(yè)務(wù)接口:

@GetMapping("/{id}")
@ApiOperation("根據(jù)id查詢用戶")
public UserVO queryUserById(@PathVariable("id") Long userId){
    // 基于自定義service方法查詢
    return userService.queryUserAndAddressById(userId);
}

由于查詢業(yè)務(wù)復(fù)雜,所以要在service層來實(shí)現(xiàn)。首先在IUserService中定義方法:

import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.vo.UserVO;

public interface IUserService extends IService<User> {
    void deduct(Long id, Integer money);

    UserVO queryUserAndAddressById(Long userId);
}

然后,在UserServiceImpl中實(shí)現(xiàn)該方法:

	@Override
	public UserVO queryUserAndAddressById(Long Id) {
		// 1.查詢用戶
		User user = this.getById(Id);
		if (user == null || user.getStatus()==UserStatus.FROZEN) {
			throw new RuntimeException("用戶狀態(tài)異常!");
		}
		// 2.查詢收貨地址
		List<Address> addresses = Db.lambdaQuery(Address.class)
				.eq(Address::getUserId, Id)
				.list();
		// 3.處理vo
		UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);
		//轉(zhuǎn)地址VO
		if (CollUtil.isNotEmpty(addresses)){
			userVO.setAddresses(BeanUtil.copyToList(addresses,AddressVO.class));
		}
		return userVO;
	}

BeanUtil.copyProperties :

將一個(gè)對(duì)象的屬性值拷貝到另一個(gè)已存在的對(duì)象中(淺拷貝)。

 BeanUtil.copyToList:

將一個(gè) List<源對(duì)象> 拷貝成一個(gè)新的 List<目標(biāo)對(duì)象>,每個(gè)元素通過  copyProperties  創(chuàng)建新對(duì)象,因?yàn)槭莿?chuàng)建新對(duì)象,所以是一種深拷貝。

上面兩個(gè)方法的第二個(gè)參數(shù)都可以是實(shí)體類的字節(jié)碼,就比如user.class形式的格式,表示在項(xiàng)目運(yùn)行的時(shí)候,會(huì)創(chuàng)建一個(gè)user的對(duì)象去接收源對(duì)象的數(shù)據(jù),可以避免自己通過NEW關(guān)鍵字去創(chuàng)建對(duì)象接收數(shù)據(jù)。

在上面的代碼中,在查詢地址時(shí),我們采用了Db的靜態(tài)方法,因此避免了注入AddressService,減少了循環(huán)依賴的風(fēng)險(xiǎn)。即通過DB的lambdaQuery()方法,在參數(shù)中放我們要操作的實(shí)體類對(duì)象,我們可以避免循環(huán)依賴的問題,該方法會(huì)通過反射獲取實(shí)體類的相關(guān)信息,然后根據(jù)我們的條件對(duì)當(dāng)前實(shí)體類的表格進(jìn)行CRUD操作,這種方式避免了注入依賴,也相當(dāng)于避免了循環(huán)依賴。

需求二

根據(jù)id批量查詢用戶,并查詢出用戶對(duì)應(yīng)的所有地址

controller層

	@GetMapping
	@ApiOperation("根據(jù)id批量查詢用戶接口")
	public List<UserVO> queryUserByIds(@ApiParam("用戶id集合") @RequestParam("ids") List<Long> ids){
		return userService.queryUserAndAddressByIds(ids);
	}

 service層

	@Override
	public List<UserVO> queryUserAndAddressByIds(List<Long> ids) {
		// 1.查詢用戶
		List<User> users = listByIds(ids);
		if (CollUtil.isEmpty(users)) {
			return Collections.emptyList();
		}
		// 2.查詢地址
		// 2.1.獲取用戶id集合
		List<Long> userIds = users.stream().map(User::getId).collect(Collectors.toList());
		// 2.2.根據(jù)用戶id查詢地址
		List<Address> addresses = Db.lambdaQuery(Address.class).in(Address::getUserId, userIds).list();
		// 2.3.轉(zhuǎn)換地址VO
		List<AddressVO> addressVOList = BeanUtil.copyToList(addresses, AddressVO.class);
		// 2.4.用戶地址集合分組處理,相同用戶的放入一個(gè)集合(組)中
		Map<Long, List<AddressVO>> addressMap = new HashMap<>(0);
		if(CollUtil.isNotEmpty(addressVOList)) {
			addressMap = addressVOList.stream().collect(Collectors.groupingBy(AddressVO::getUserId));
		}
		// 3.轉(zhuǎn)換VO返回
		List<UserVO> list = new ArrayList<>(users.size());
		for (User user : users) {
			// 3.1.轉(zhuǎn)換User的PO為VO
			UserVO vo = BeanUtil.copyProperties(user, UserVO.class);
			list.add(vo);
			// 3.2.轉(zhuǎn)換地址VO
			vo.setAddresses(addressMap.get(user.getId()));
		}
		return list;
	}

 和查詢單個(gè)用戶的區(qū)別在于:根據(jù)id對(duì)查詢出來的地址通過map來分組的實(shí)現(xiàn)邏輯。

到此這篇關(guān)于MybatisPlus中靜態(tài)工具DB的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MybatisPlus 靜態(tài)工具DB內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java 算法 6種排序小結(jié)

    java 算法 6種排序小結(jié)

    這篇文章主要介紹了java 算法 6種排序,排序原理及實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • JAVA基礎(chǔ)之?dāng)?shù)組和集合區(qū)別對(duì)比分析

    JAVA基礎(chǔ)之?dāng)?shù)組和集合區(qū)別對(duì)比分析

    文章主要介紹了Java中數(shù)組和集合的基本概念、使用方法以及它們之間的區(qū)別,文章還探討了不可變集合的創(chuàng)建方式及其線程安全和不可篡改的優(yōu)勢(shì),感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Java中public關(guān)鍵字用法詳細(xì)講解

    Java中public關(guān)鍵字用法詳細(xì)講解

    這篇文章主要給大家介紹了關(guān)于Java中public關(guān)鍵字用法的相關(guān)資料,public關(guān)鍵字是和訪問權(quán)限相關(guān)的,它所修飾的方法對(duì)所有類都是可以訪問的,需要的朋友可以參考下
    2023-09-09
  • Java基礎(chǔ)之代理原理與用法詳解

    Java基礎(chǔ)之代理原理與用法詳解

    這篇文章主要介紹了Java基礎(chǔ)之代理原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了java代理的概念、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • SpringMVC如何獲取多種類型數(shù)據(jù)響應(yīng)

    SpringMVC如何獲取多種類型數(shù)據(jù)響應(yīng)

    這篇文章主要介紹了SpringMVC如何獲取多種類型數(shù)據(jù)響應(yīng),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-11-11
  • SpringCloud2020.0.x版UnderTow AccessLog相關(guān)配置簡(jiǎn)介

    SpringCloud2020.0.x版UnderTow AccessLog相關(guān)配置簡(jiǎn)介

    本文詳細(xì)介紹了SpringCloud中AccessLog的相關(guān)配置,我們可以根據(jù)文中的相關(guān)數(shù)據(jù)配置出所需的AccessLog的信息以及格式,感興趣的小伙伴可以參考一下
    2021-08-08
  • Java向Runnable線程傳遞參數(shù)方法實(shí)例解析

    Java向Runnable線程傳遞參數(shù)方法實(shí)例解析

    這篇文章主要介紹了Java向Runnable線程傳遞參數(shù)方法實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • WebClient拋UnsupportedMediaTypeException異常解決

    WebClient拋UnsupportedMediaTypeException異常解決

    這篇文章主要為大家介紹了WebClient拋UnsupportedMediaTypeException異常的解決方案,文中給大家介紹了六中方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • Java Hibernate使用方法及整合查詢

    Java Hibernate使用方法及整合查詢

    這篇文章主要介紹了Java使用與整合Hibernate,在正式進(jìn)入Hibernate的高級(jí)應(yīng)用之前,需要了解聲明是數(shù)據(jù)模型與領(lǐng)域模型,這兩個(gè)概念將會(huì)幫助我們更好的理解實(shí)體對(duì)象的關(guān)聯(lián)關(guān)系映射
    2023-04-04
  • java實(shí)現(xiàn)簡(jiǎn)單學(xué)生成績(jī)檔案管理系統(tǒng)

    java實(shí)現(xiàn)簡(jiǎn)單學(xué)生成績(jī)檔案管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單學(xué)生成績(jī)檔案管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論

亳州市| 漯河市| 从江县| 三明市| 丹巴县| 图木舒克市| 蓬安县| 莆田市| 包头市| 陈巴尔虎旗| 城口县| 鹤壁市| 瑞昌市| 临沂市| 巴塘县| 庄河市| 威信县| 郧西县| 罗甸县| 南开区| 苏尼特左旗| 洪泽县| 芦溪县| 剑阁县| 洱源县| 玛多县| 商都县| 嘉荫县| 寿宁县| 天长市| 监利县| 舒城县| 齐齐哈尔市| 文昌市| 万山特区| 丹东市| 海晏县| 克什克腾旗| 临海市| 和平县| 阳原县|