網(wǎng)站首頁(yè) 編程語(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)有了
相關(guān)推薦
- 2023-02-10 利用Python獲取文件夾下所有文件實(shí)例代碼_python
- 2023-03-01 React?Ref?Callback使用場(chǎng)景最佳實(shí)踐詳解_React
- 2022-11-23 關(guān)于vba代碼運(yùn)行時(shí)錯(cuò)誤1004?應(yīng)用程序定義或?qū)ο蠖x錯(cuò)誤問(wèn)題_VBA
- 2022-09-23 Go語(yǔ)言結(jié)構(gòu)體Go?range的學(xué)習(xí)教程_Golang
- 2022-03-29 C語(yǔ)言的基本編寫(xiě)規(guī)范你了解嗎_C 語(yǔ)言
- 2022-09-02 Golang基礎(chǔ)教程之字符串string實(shí)例詳解_Golang
- 2022-11-13 python學(xué)習(xí)之whl文件解釋與安裝詳解_python
- 2022-09-05 Golang中的Interface詳解_Golang
- 欄目分類(lèi)
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支