網站首頁 編程語言 正文
文章目錄
- 前言
- 一、實體類的注解
- 二、Req查詢條件
- 三、Controller接口
- 四、Service接口
- 五、Service接口實現類
- 六、Mapper接口
- 七、枚舉的使用
- 總結
前言
最近的項目是使用mybatis-plus作為持久層框架,前面也記錄過mybatis-plus的基本使用,此次記錄一下本次項目中的一些使用要點
一、實體類的注解
基本的導入依賴和代碼自動生成器,可以去看以前的文章,本次不再贅述。
以項目中的一個實體類為例
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對象", description = "綠色活動")
public class Activity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
@ApiModelProperty(value = "關聯EMP活動ID")
private String empId;
@ApiModelProperty(value = "活動小圖")
private String image;
@ApiModelProperty(value = "活動名稱")
private String name;
@ApiModelProperty(value = "活動副標題")
private String subTitle;
@ApiModelProperty(value = "活動日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date activityDate;
@ApiModelProperty(value = "活動城市")
private String city;
@ApiModelProperty(value = "排序")
private Integer sort;
@ApiModelProperty(value = "簽到獎勵能量")
private Integer sigInEnergy;
@ApiModelProperty(value = "預約獎勵能量")
private Integer reservationEnergy;
@ApiModelProperty(value = "關聯綠色場景")
private String sceneRuleId;
@ApiModelProperty(value = "推薦(1:是,0:否)")
private Integer recommend;
@ApiModelProperty(value = "刪除標記")
private Integer delFlag;
}
實體類上mybatis-plus的注解有兩個,
- @TableName(“co_activity”)指定表名
- @TableId(value = “id”, type = IdType.ASSIGN_ID) 指定主鍵
實體類還應該實現序列化接口,方便后續對數據進行流操作
其余的注解是lombok注解和swagger文檔注解
二、Req查詢條件
req查詢條件是mybatis-plus封裝自己為我們封裝的查詢條件,需要我們繼承一個BaseRequest< T >類(其中T是我們的實體類),也支持我們對其進行自定義修改加入我們需要的查詢條件,默認的查詢條件如下:
mybatis-plus幫我們自動實現了分頁的查詢條件,當然在實際的開發中只有一個分頁條件是遠遠不夠的,下邊是我的自定義查詢條件:
三、Controller接口
這里我以一個條件查詢的方法演示
@Api(tags = "綠色活動")
@RestController
@RequestMapping("/activity")
@Slf4j
public class ActivityController {
@Resource
private IActivityService iActivityService;
@ApiOperation("分頁查詢")
@PostMapping("/admin/page")
public Result page(@RequestBody ActivityReq req) {
log.info("分頁查詢活動列表:{}", JSON.toJSONString(req));
Map<String, Object> page = iActivityService.pageQuery(req);
log.info("分頁查詢活動列表到的數據:{}", JSON.toJSONString(page));
return Result.ok(page);
}
}
也就是說,我們后端接口接收的查詢條件就是req,它以json的數據格式進行傳輸
傳入的數據格式如下
{
"id":"",
"empId":"",
"activityName":"",
"city":"",
"sceneRuleId":""
}
四、Service接口
service接口需要我們去實現一個mybatis-plus的接口IService< T >
public interface IActivityService extends IService<Activity> {
/**
* 分頁查詢
*
* @param req 查詢條件
* @return map
*/
Map<String, Object> pageQuery(ActivityReq req);
}
其中實現了一些基礎的CRUD方法,如果只是簡單不帶業務邏輯的基本功能,mybatis-plus都給我們進行了封裝,拿來即用,此處不再展示
五、Service接口實現類
這里除了我們需要去實現一個我們自定義的接口外,還需要我們去繼承一個mybatis-plus的類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("分頁查詢活動列表到的數據:{}", 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<>();
/*活動id模糊查詢*/
queryWrapper.like(StringUtils.isNotBlank(req.getId()), "id", req.getId());
/*emp活動id模糊查詢*/
queryWrapper.like(StringUtils.isNotBlank(req.getEmpId()), "emp_id", req.getEmpId());
/*活動名稱模糊查詢*/
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());
/*不查全國的*/
queryWrapper.ne("city", CityEnum.QUANGUO.getDesc());
/*場景*/
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);
}
/*將結果封裝為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("無");
} 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封裝結束");
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;
}
}
此處需要注意的是,我們需要使用一個StringUtils.isNotBlank(查詢條件) 方法去判斷我們的查詢條件是否為空,不為空再進行拼接,其次這里還使用了一個stream流去處理查詢出來的結果,因為mybatis-plus只支持單表查詢,但是對于復雜的顯示來說,我們不得不去另外一張表中取數據,所以,這里對查詢結果使用stream流進行數據處理,將我們需要的數據進行處理,然后返回
六、Mapper接口
有些時候我們自帶的查詢方法,極有可能不滿足我們的業務需求,所以我們需要使用mybatis的xml映射文件去編寫sql,和mybatis基本一致,需要注意的是我們的mapper也要繼承一個類BaseMapper< T > 其中封裝了一些基本的持久層的CRUD方法供我們使用
@Repository
public interface ActivityMapper extends BaseMapper<Activity> {
/**
* 獲取已經關聯的empId
* @return
*/
List<String> getEmpIds();
}
七、枚舉的使用
開發規范中,不允許魔法值的出現,所以在真實的開發中需要我們使用枚舉去完成一些類目的判斷,下面以城市為例:
@Getter
@AllArgsConstructor
public enum CityEnum {
BEIJING("110000", "北京市"),
SHANGHAI("310000", "上海市"),
GUANGZHOU("440100", "廣州市"),
SHENZHEN("440300", "深圳市"),
HANGZHOU("330100", "杭州市"),
FOSHAN("440600", "佛山市"),
QUANGUO("000000", "全國");
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;
}
}
以上就是一個城市的枚舉類
在使用的時候如下:
/*城市*/
CityEnum eumByCode = CityEnum.getEumByCode(req.getCityCode());
if (eumByCode != null) {
String city = eumByCode.getDesc();
queryWrapper.eq("city", city);
}
這樣就避免的魔法值的出現
常用的枚舉還有邏輯刪除
@Getter
@AllArgsConstructor
public enum DelFlagEnum {
NO_DEL(0, "未刪除"),
DEL(1, "已刪除");
private Integer code;
private String desc;
}
我們也可以在VO類中添加枚舉處理,例如我們需要在活動VO中獲取城市名,(假設model中是沒有城市名的,只存了一個code碼)
public String setCityName() {
String name = "";
CityEnum eumByCode = CityEnum.getEumByCode(this.city);
if (eumByCode != null) {
name = eumByCode.getDesc();
}
return name;
}
可以在VO中添加上邊的代碼,
總結
以上就是最近在使用mybatis-plus的一些總結
原文鏈接:https://blog.csdn.net/l_zl2021/article/details/131221060
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-02-25 Oracle?觸發器實現主鍵自增效果_oracle
- 2022-08-03 C#中POST接口formdata傳參模板的記錄_C#教程
- 2022-07-21 SystemVerilog中使用string所遇到的問題
- 2022-07-09 Python二分查找+字符串模板+textwrap模塊,_python
- 2022-10-16 Qt實現進程間通信_C 語言
- 2022-12-22 OpenHarmony如何調用電話服務API撥打電話_Android
- 2022-11-13 kvm?透傳顯卡至win10虛擬機的方法_Kvm
- 2022-05-13 C++ 減少臨時字符串對象的產生
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支