日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

mybatis-plus在實(shí)際開(kāi)發(fā)中的應(yīng)用

作者:鑄鍵為犁 更新時(shí)間: 2023-07-25 編程語(yǔ)言

文章目錄

  • 前言
  • 一、實(shí)體類(lèi)的注解
  • 二、Req查詢(xún)條件
  • 三、Controller接口
  • 四、Service接口
  • 五、Service接口實(shí)現(xiàn)類(lèi)
  • 六、Mapper接口
  • 七、枚舉的使用
  • 總結(jié)


前言

最近的項(xiàng)目是使用mybatis-plus作為持久層框架,前面也記錄過(guò)mybatis-plus的基本使用,此次記錄一下本次項(xiàng)目中的一些使用要點(diǎn)


一、實(shí)體類(lèi)的注解

基本的導(dǎo)入依賴(lài)和代碼自動(dòng)生成器,可以去看以前的文章,本次不再贅述。
以項(xiàng)目中的一個(gè)實(shí)體類(lèi)為例

import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;

import java.util.Date;

import com.baomidou.mybatisplus.annotation.TableId;

import java.io.Serializable;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("co_activity")
@ApiModel(value = "Activity對(duì)象", description = "綠色活動(dòng)")
public class Activity implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private String id;

    @ApiModelProperty(value = "關(guān)聯(lián)EMP活動(dòng)ID")
    private String empId;

    @ApiModelProperty(value = "活動(dòng)小圖")
    private String image;

    @ApiModelProperty(value = "活動(dòng)名稱(chēng)")
    private String name;

    @ApiModelProperty(value = "活動(dòng)副標(biāo)題")
    private String subTitle;

    @ApiModelProperty(value = "活動(dòng)日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date activityDate;

    @ApiModelProperty(value = "活動(dòng)城市")
    private String city;

    @ApiModelProperty(value = "排序")
    private Integer sort;

    @ApiModelProperty(value = "簽到獎(jiǎng)勵(lì)能量")
    private Integer sigInEnergy;

    @ApiModelProperty(value = "預(yù)約獎(jiǎng)勵(lì)能量")
    private Integer reservationEnergy;

    @ApiModelProperty(value = "關(guān)聯(lián)綠色場(chǎng)景")
    private String sceneRuleId;

    @ApiModelProperty(value = "推薦(1:是,0:否)")
    private Integer recommend;

    @ApiModelProperty(value = "刪除標(biāo)記")
    private Integer delFlag;


}

實(shí)體類(lèi)上mybatis-plus的注解有兩個(gè),

  • @TableName(“co_activity”)指定表名
  • @TableId(value = “id”, type = IdType.ASSIGN_ID) 指定主鍵

實(shí)體類(lèi)還應(yīng)該實(shí)現(xiàn)序列化接口,方便后續(xù)對(duì)數(shù)據(jù)進(jìn)行流操作
其余的注解是lombok注解和swagger文檔注解

二、Req查詢(xún)條件

req查詢(xún)條件是mybatis-plus封裝自己為我們封裝的查詢(xún)條件,需要我們繼承一個(gè)BaseRequest< T >類(lèi)(其中T是我們的實(shí)體類(lèi)),也支持我們對(duì)其進(jìn)行自定義修改加入我們需要的查詢(xún)條件,默認(rèn)的查詢(xún)條件如下:
在這里插入圖片描述
在這里插入圖片描述
mybatis-plus幫我們自動(dòng)實(shí)現(xiàn)了分頁(yè)的查詢(xún)條件,當(dāng)然在實(shí)際的開(kāi)發(fā)中只有一個(gè)分頁(yè)條件是遠(yuǎn)遠(yuǎn)不夠的,下邊是我的自定義查詢(xún)條件:
在這里插入圖片描述

三、Controller接口

這里我以一個(gè)條件查詢(xún)的方法演示

@Api(tags = "綠色活動(dòng)")
@RestController
@RequestMapping("/activity")
@Slf4j
public class ActivityController {

    @Resource
    private IActivityService iActivityService;
    
    @ApiOperation("分頁(yè)查詢(xún)")
    @PostMapping("/admin/page")
    public Result page(@RequestBody ActivityReq req) {
        log.info("分頁(yè)查詢(xún)活動(dòng)列表:{}", JSON.toJSONString(req));
        Map<String, Object> page = iActivityService.pageQuery(req);
        log.info("分頁(yè)查詢(xún)活動(dòng)列表到的數(shù)據(jù):{}", JSON.toJSONString(page));
        return Result.ok(page);
    }
}    

也就是說(shuō),我們后端接口接收的查詢(xún)條件就是req,它以json的數(shù)據(jù)格式進(jìn)行傳輸
傳入的數(shù)據(jù)格式如下

{
    "id":"",
    "empId":"",
    "activityName":"",
    "city":"",
    "sceneRuleId":""
}

四、Service接口

service接口需要我們?nèi)?shí)現(xiàn)一個(gè)mybatis-plus的接口IService< T >

public interface IActivityService extends IService<Activity> {

    /**
     * 分頁(yè)查詢(xún)
     *
     * @param req 查詢(xún)條件
     * @return map
     */

    Map<String, Object> pageQuery(ActivityReq req);
}

其中實(shí)現(xiàn)了一些基礎(chǔ)的CRUD方法,如果只是簡(jiǎn)單不帶業(yè)務(wù)邏輯的基本功能,mybatis-plus都給我們進(jìn)行了封裝,拿來(lái)即用,此處不再展示

五、Service接口實(shí)現(xiàn)類(lèi)

這里除了我們需要去實(shí)現(xiàn)一個(gè)我們自定義的接口外,還需要我們?nèi)ダ^承一個(gè)mybatis-plus的類(lèi)ServiceImpl<Mapper, Model> 代碼如下:

@Service
@Slf4j
public class ActivityServiceImpl extends ServiceImpl<ActivityMapper, Activity> 
implements IActivityService {
	@Autowired
    private ActivityMapper activityMapper;
	
	 @Override
    public Map<String, Object> pageQuery(ActivityReq req) {
        log.info("分頁(yè)查詢(xún)活動(dòng)列表到的數(shù)據(jù):{}", JSON.toJSONString(req));
        List<SceneRule> sceneRules = sceneRuleMapper.selectList(new QueryWrapper<>());
        Map<String, String> sceneRuleMap = new HashMap<>(sceneRules.size());
        for (SceneRule sceneRule : sceneRules) {
            sceneRuleMap.put(sceneRule.getId(), sceneRule.getName());
        }
        QueryWrapper<Activity> queryWrapper = new QueryWrapper<>();
        /*活動(dòng)id模糊查詢(xún)*/
        queryWrapper.like(StringUtils.isNotBlank(req.getId()), "id", req.getId());
        /*emp活動(dòng)id模糊查詢(xún)*/
        queryWrapper.like(StringUtils.isNotBlank(req.getEmpId()), "emp_id", req.getEmpId());
        /*活動(dòng)名稱(chēng)模糊查詢(xún)*/
        queryWrapper.like(StringUtils.isNotBlank(req.getActivityName()), "name", req.getActivityName());
        /*城市*/
        CityEnum eumByCode = CityEnum.getEumByCode(req.getCityCode());
        if (eumByCode != null) {
            String city = eumByCode.getDesc();
            queryWrapper.eq("city", city);
        }
        /*未刪除的*/
        queryWrapper.eq("del_flag", DelFlagEnum.NO_DEL.getCode());
        /*不查全國(guó)的*/
        queryWrapper.ne("city", CityEnum.QUANGUO.getDesc());
        /*場(chǎng)景*/
        queryWrapper.eq(StringUtils.isNotBlank(req.getSceneRuleId()), "scene_rule_id", req.getSceneRuleId());
        /*日期降序*/
        queryWrapper.orderByDesc("activity_date");
        IPage<Activity> page = baseMapper.selectPage(req.getPage(), queryWrapper);
        List<Activity> activityList = page.getRecords();
        List<String> empIds = new ArrayList<>(activityList.size());
        for (Activity activity : activityList) {
            if (StringUtils.isNotBlank(activity.getEmpId()) && !empIds.contains(activity.getEmpId())) {
                empIds.add(activity.getEmpId());
            }
        }
        List<EmpVo> empVoList = empVoList(empIds);
        Map<String, EmpVo> empVoMap = new HashMap<>(empVoList.size());
        for (EmpVo empVo : empVoList) {
            empVoMap.put(empVo.getEventId(), empVo);
        }
        /*將結(jié)果封裝為VO返回前端*/
        List<ActivityVo> list = page.getRecords().stream().map(activity -> {
            ActivityVo vo = new ActivityVo();
            BeanUtils.copyProperties(activity, vo);
            if (sceneRuleMap.get(activity.getSceneRuleId()) == null) {
                vo.setSceneRuleName("無(wú)");
            } else {
                vo.setSceneRuleName(sceneRuleMap.get(activity.getSceneRuleId()));
            }
            EmpVo empVo = empVoMap.get(activity.getEmpId());
            if (empVo != null) {
                String image = null;
                vo.setName(empVo.getTitle());
                vo.setSubTitle(empVo.getType());
                vo.setActivityDate(empVo.getHoldingEndTime());
                vo.setCityName(empVo.getCity());
                if ("0".equals(empVo.getEventScene())) {
                    image = empVo.getAppCoverImage();
                } else if ("1".equals(empVo.getEventScene())) {
                    List<String> eventImageList = empVo.getEventImageList();
                    if (CollectionUtils.isNotEmpty(eventImageList)) {
                        image = eventImageList.get(0);
                    }
                }
                vo.setImage(image);
            }
            log.info("vo封裝結(jié)束");
            return vo;
        }).collect(Collectors.toList());

        Map<String, Object> map = new HashMap<>(3);
        map.put("total", page.getTotal());
        map.put("list", list);
        map.put("page", page.getCurrent());
        return map;
    }
}

此處需要注意的是,我們需要使用一個(gè)StringUtils.isNotBlank(查詢(xún)條件) 方法去判斷我們的查詢(xún)條件是否為空,不為空再進(jìn)行拼接,其次這里還使用了一個(gè)stream流去處理查詢(xún)出來(lái)的結(jié)果,因?yàn)閙ybatis-plus只支持單表查詢(xún),但是對(duì)于復(fù)雜的顯示來(lái)說(shuō),我們不得不去另外一張表中取數(shù)據(jù),所以,這里對(duì)查詢(xún)結(jié)果使用stream流進(jìn)行數(shù)據(jù)處理,將我們需要的數(shù)據(jù)進(jìn)行處理,然后返回

六、Mapper接口

有些時(shí)候我們自帶的查詢(xún)方法,極有可能不滿(mǎn)足我們的業(yè)務(wù)需求,所以我們需要使用mybatis的xml映射文件去編寫(xiě)sql,和mybatis基本一致,需要注意的是我們的mapper也要繼承一個(gè)類(lèi)BaseMapper< T > 其中封裝了一些基本的持久層的CRUD方法供我們使用

@Repository
public interface ActivityMapper extends BaseMapper<Activity> {
    /**
     * 獲取已經(jīng)關(guān)聯(lián)的empId
     * @return
     */
    List<String> getEmpIds();
}

七、枚舉的使用

開(kāi)發(fā)規(guī)范中,不允許魔法值的出現(xiàn),所以在真實(shí)的開(kāi)發(fā)中需要我們使用枚舉去完成一些類(lèi)目的判斷,下面以城市為例:

@Getter
@AllArgsConstructor
public enum CityEnum {

    BEIJING("110000", "北京市"),
    SHANGHAI("310000", "上海市"),
    GUANGZHOU("440100", "廣州市"),
    SHENZHEN("440300", "深圳市"),
    HANGZHOU("330100", "杭州市"),
    FOSHAN("440600", "佛山市"),
    QUANGUO("000000", "全國(guó)");

    private String code;
    private String desc;

    public static CityEnum getEumByCode(String code) {
        if (code == null) {
            return null;
        }

        for (CityEnum type : CityEnum.values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        return null;
    }
}

以上就是一個(gè)城市的枚舉類(lèi)

在使用的時(shí)候如下:

/*城市*/
 CityEnum eumByCode = CityEnum.getEumByCode(req.getCityCode());
 if (eumByCode != null) {
     String city = eumByCode.getDesc();
     queryWrapper.eq("city", city);
 }

這樣就避免的魔法值的出現(xiàn)
常用的枚舉還有邏輯刪除

@Getter
@AllArgsConstructor
public enum DelFlagEnum {
    NO_DEL(0, "未刪除"),
    DEL(1, "已刪除");
    private Integer code;
    private String desc;
}

我們也可以在VO類(lèi)中添加枚舉處理,例如我們需要在活動(dòng)VO中獲取城市名,(假設(shè)model中是沒(méi)有城市名的,只存了一個(gè)code碼)

    public String setCityName() {
        String name = "";
        CityEnum eumByCode = CityEnum.getEumByCode(this.city);
        if (eumByCode != null) {
            name = eumByCode.getDesc();
        }
        return name;
    }

可以在VO中添加上邊的代碼,


總結(jié)

以上就是最近在使用mybatis-plus的一些總結(jié)

原文鏈接:https://blog.csdn.net/l_zl2021/article/details/131221060

  • 上一篇:沒(méi)有了
  • 下一篇:沒(méi)有了
欄目分類(lèi)
最近更新