优化:优化使用 MyBatis Plus ChainWrapper 的方式

This commit is contained in:
Charles7c 2023-03-04 17:38:10 +08:00
parent 304615ea23
commit 25f6e3402b
11 changed files with 91 additions and 89 deletions

View File

@ -18,6 +18,12 @@ package top.charles7c.cnadmin.common.base;
import java.util.Collection;
import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper;
import com.baomidou.mybatisplus.extension.toolkit.ChainWrappers;
import com.baomidou.mybatisplus.extension.toolkit.Db;
/**
@ -40,4 +46,60 @@ public interface BaseMapper<T> extends com.baomidou.mybatisplus.core.mapper.Base
default boolean insertBatch(Collection<T> entityList) {
return Db.saveBatch(entityList);
}
/**
* 链式查询
*
* @return QueryWrapper 的包装类
*/
default QueryChainWrapper<T> query() {
return ChainWrappers.queryChain(this);
}
/**
* 链式查询lambda
*
* @return LambdaQueryWrapper 的包装类
*/
default LambdaQueryChainWrapper<T> lambdaQuery() {
return ChainWrappers.lambdaQueryChain(this, this.currentEntityClass());
}
/**
* 链式查询lambda
*
* @param entity
* 实体对象
* @return LambdaQueryWrapper 的包装类
*/
default LambdaQueryChainWrapper<T> lambdaQuery(T entity) {
return ChainWrappers.lambdaQueryChain(this, entity);
}
/**
* 链式更改
*
* @return UpdateWrapper 的包装类
*/
default UpdateChainWrapper<T> update() {
return ChainWrappers.updateChain(this);
}
/**
* 链式更改lambda
*
* @return LambdaUpdateWrapper 的包装类
*/
default LambdaUpdateChainWrapper<T> lambdaUpdate() {
return ChainWrappers.lambdaUpdateChain(this);
}
/**
* 获取实体类 Class 对象
*
* @return 实体类 Class 对象
*/
default Class<T> currentEntityClass() {
return (Class<T>)ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapper.class, 0);
}
}

View File

@ -34,11 +34,6 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper;
import com.baomidou.mybatisplus.extension.toolkit.ChainWrappers;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
@ -267,53 +262,6 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T, V, D, Q, C ext
}
}
/**
* 链式查询
*
* @return QueryWrapper 的包装类
*/
protected QueryChainWrapper<T> query() {
return ChainWrappers.queryChain(baseMapper);
}
/**
* 链式查询lambda
*
* @return LambdaQueryWrapper 的包装类
*/
protected LambdaQueryChainWrapper<T> lambdaQuery() {
return ChainWrappers.lambdaQueryChain(baseMapper, entityClass);
}
/**
* 链式查询lambda
*
* @param entity
* 实体对象
* @return LambdaQueryWrapper 的包装类
*/
protected LambdaQueryChainWrapper<T> lambdaQuery(T entity) {
return ChainWrappers.lambdaQueryChain(baseMapper, entity);
}
/**
* 链式更改
*
* @return UpdateWrapper 的包装类
*/
protected UpdateChainWrapper<T> update() {
return ChainWrappers.updateChain(baseMapper);
}
/**
* 链式更改lambda
*
* @return LambdaUpdateWrapper 的包装类
*/
protected LambdaUpdateChainWrapper<T> lambdaUpdate() {
return ChainWrappers.lambdaUpdateChain(baseMapper);
}
/**
* 获取实体类 ID 名称
*

View File

@ -78,9 +78,9 @@ public class MybatisPlusConfiguration {
// 对于单一数据库类型来说都建议配置该值避免每次分页都去抓取数据库类型
// PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
// 溢出总页数后是否进行处理
// 溢出总页数后是否进行处理默认不处理
paginationInnerInterceptor.setOverflow(false);
// 单页分页条数限制
// 单页分页条数限制默认无限制
paginationInnerInterceptor.setMaxLimit(-1L);
return paginationInnerInterceptor;
}

View File

@ -26,7 +26,6 @@ import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
@ -56,7 +55,7 @@ public class QueryHelper {
* @return MyBatis Plus 查询条件封装对象
*/
public static <Q, R> QueryWrapper<R> build(Q query) {
QueryWrapper<R> queryWrapper = Wrappers.query();
QueryWrapper<R> queryWrapper = new QueryWrapper<>();
// 没有查询条件直接返回
if (query == null) {
return queryWrapper;

View File

@ -59,7 +59,6 @@ public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, DeptDO, DeptVO,
boolean isExists = this.checkNameExists(deptName, request.getParentId(), request.getDeptId());
CheckUtils.throwIf(() -> isExists, String.format("新增失败,'%s'已存在", deptName));
// 保存信息
request.setStatus(DisEnableStatusEnum.ENABLE);
return super.add(request);
}
@ -79,7 +78,7 @@ public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, DeptDO, DeptVO,
public void delete(List<Long> ids) {
CheckUtils.throwIf(() -> userService.countByDeptIds(ids) > 0, "所选部门存在用户关联,请解除关联后重试");
super.delete(ids);
super.lambdaUpdate().in(DeptDO::getParentId, ids).remove();
baseMapper.lambdaUpdate().in(DeptDO::getParentId, ids).remove();
}
@Override
@ -103,7 +102,7 @@ public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, DeptDO, DeptVO,
* @return 是否存在
*/
private boolean checkNameExists(String name, Long parentId, Long id) {
return super.lambdaQuery().eq(DeptDO::getDeptName, name).eq(DeptDO::getParentId, parentId)
return baseMapper.lambdaQuery().eq(DeptDO::getDeptName, name).eq(DeptDO::getParentId, parentId)
.ne(id != null, DeptDO::getDeptId, id).exists();
}
}

View File

@ -51,7 +51,6 @@ public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO,
boolean isExists = this.checkNameExists(menuName, request.getParentId(), request.getMenuId());
CheckUtils.throwIf(() -> isExists, String.format("新增失败,'%s'已存在", menuName));
// 保存信息
request.setStatus(DisEnableStatusEnum.ENABLE);
return super.add(request);
}
@ -63,7 +62,6 @@ public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO,
boolean isExists = this.checkNameExists(menuName, request.getParentId(), request.getMenuId());
CheckUtils.throwIf(() -> isExists, String.format("修改失败,'%s'已存在", menuName));
// 更新信息
super.update(request);
}
@ -71,7 +69,7 @@ public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO,
@Transactional(rollbackFor = Exception.class)
public void delete(List<Long> ids) {
super.delete(ids);
super.lambdaUpdate().in(MenuDO::getParentId, ids).remove();
baseMapper.lambdaUpdate().in(MenuDO::getParentId, ids).remove();
}
@Override
@ -91,7 +89,7 @@ public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO,
* @return 是否存在
*/
private boolean checkNameExists(String name, Long parentId, Long id) {
return super.lambdaQuery().eq(MenuDO::getMenuName, name).eq(MenuDO::getParentId, parentId)
return baseMapper.lambdaQuery().eq(MenuDO::getMenuName, name).eq(MenuDO::getParentId, parentId)
.ne(id != null, MenuDO::getMenuId, id).exists();
}
}

View File

@ -23,8 +23,6 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import cn.hutool.core.collection.CollUtil;
import top.charles7c.cnadmin.system.mapper.RoleDeptMapper;
@ -49,7 +47,7 @@ public class RoleDeptServiceImpl implements RoleDeptService {
return;
}
// 删除原有关联
roleDeptMapper.delete(Wrappers.<RoleDeptDO>lambdaQuery().eq(RoleDeptDO::getRoleId, roleId));
roleDeptMapper.lambdaUpdate().eq(RoleDeptDO::getRoleId, roleId).remove();
// 保存最新关联
List<RoleDeptDO> roleDeptList =
deptIds.stream().map(deptId -> new RoleDeptDO(roleId, deptId)).collect(Collectors.toList());

View File

@ -24,8 +24,6 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import cn.hutool.core.collection.CollUtil;
import top.charles7c.cnadmin.system.mapper.RoleMenuMapper;
@ -50,7 +48,7 @@ public class RoleMenuServiceImpl implements RoleMenuService {
return;
}
// 删除原有关联
roleMenuMapper.delete(Wrappers.<RoleMenuDO>lambdaQuery().eq(RoleMenuDO::getRoleId, roleId));
roleMenuMapper.lambdaUpdate().eq(RoleMenuDO::getRoleId, roleId).remove();
// 保存最新关联
List<RoleMenuDO> roleMenuList =
menuIds.stream().map(menuId -> new RoleMenuDO(roleId, menuId)).collect(Collectors.toList());

View File

@ -68,7 +68,7 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
CheckUtils.throwIf(() -> this.checkCodeExists(roleCode, request.getRoleId()),
String.format("新增失败,'%s'已存在", roleCode));
// 新增角色
// 新增信息
request.setStatus(DisEnableStatusEnum.ENABLE);
Long roleId = super.add(request);
// 保存角色和菜单关联
@ -88,7 +88,7 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
CheckUtils.throwIf(() -> this.checkCodeExists(roleCode, request.getRoleId()),
String.format("修改失败,'%s'已存在", roleCode));
// 更新角色
// 更新信息
super.update(request);
Long roleId = request.getRoleId();
// 保存角色和菜单关联
@ -131,14 +131,16 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
@Override
public List<String> listRoleNamesByRoleIds(List<Long> roleIds) {
List<RoleDO> roleList = super.lambdaQuery().select(RoleDO::getRoleName).in(RoleDO::getRoleId, roleIds).list();
List<RoleDO> roleList =
baseMapper.lambdaQuery().select(RoleDO::getRoleName).in(RoleDO::getRoleId, roleIds).list();
return roleList.stream().map(RoleDO::getRoleName).collect(Collectors.toList());
}
@Override
public Set<String> listRoleCodesByUserId(Long userId) {
List<Long> roleIds = userRoleService.listRoleIdsByUserId(userId);
List<RoleDO> roleList = super.lambdaQuery().select(RoleDO::getRoleCode).in(RoleDO::getRoleId, roleIds).list();
List<RoleDO> roleList =
baseMapper.lambdaQuery().select(RoleDO::getRoleCode).in(RoleDO::getRoleId, roleIds).list();
return roleList.stream().map(RoleDO::getRoleCode).collect(Collectors.toSet());
}
@ -152,7 +154,7 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
* @return 是否存在
*/
private boolean checkNameExists(String name, Long id) {
return super.lambdaQuery().eq(RoleDO::getRoleName, name).ne(id != null, RoleDO::getRoleId, id).exists();
return baseMapper.lambdaQuery().eq(RoleDO::getRoleName, name).ne(id != null, RoleDO::getRoleId, id).exists();
}
/**
@ -165,6 +167,6 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
* @return 是否存在
*/
private boolean checkCodeExists(String code, Long id) {
return super.lambdaQuery().eq(RoleDO::getRoleCode, code).ne(id != null, RoleDO::getRoleId, id).exists();
return baseMapper.lambdaQuery().eq(RoleDO::getRoleCode, code).ne(id != null, RoleDO::getRoleId, id).exists();
}
}

View File

@ -23,8 +23,6 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import cn.hutool.core.collection.CollUtil;
import top.charles7c.cnadmin.system.mapper.UserRoleMapper;
@ -49,7 +47,7 @@ public class UserRoleServiceImpl implements UserRoleService {
return;
}
// 删除原有关联
userRoleMapper.delete(Wrappers.<UserRoleDO>lambdaQuery().eq(UserRoleDO::getUserId, userId));
userRoleMapper.lambdaUpdate().eq(UserRoleDO::getUserId, userId).remove();
// 保存最新关联
List<UserRoleDO> userRoleList =
roleIds.stream().map(roleId -> new UserRoleDO(userId, roleId)).collect(Collectors.toList());
@ -58,7 +56,7 @@ public class UserRoleServiceImpl implements UserRoleService {
@Override
public Long countByRoleIds(List<Long> roleIds) {
return userRoleMapper.selectCount(Wrappers.<UserRoleDO>lambdaQuery().in(UserRoleDO::getRoleId, roleIds));
return userRoleMapper.lambdaQuery().in(UserRoleDO::getRoleId, roleIds).count();
}
@Override

View File

@ -77,10 +77,10 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
boolean isExists = this.checkNameExists(username, request.getUserId());
CheckUtils.throwIf(() -> isExists, String.format("新增失败,'%s'已存在", username));
// 新增用户
// 新增信息
request.setStatus(DisEnableStatusEnum.ENABLE);
Long userId = super.add(request);
super.lambdaUpdate()
baseMapper.lambdaUpdate()
.set(UserDO::getPassword, SecureUtils.md5Salt(SysConsts.DEFAULT_PASSWORD, userId.toString()))
.set(UserDO::getPwdResetTime, LocalDateTime.now()).eq(UserDO::getUserId, userId).update();
// 保存用户和角色关联
@ -95,7 +95,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
boolean isExists = this.checkNameExists(username, request.getUserId());
CheckUtils.throwIf(() -> isExists, String.format("修改失败,'%s'已存在", username));
// 更新用户
// 更新信息
super.update(request);
Long userId = request.getUserId();
// 保存用户和角色关联
@ -133,7 +133,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
// 更新用户头像
String newAvatar = newAvatarFile.getName();
super.lambdaUpdate().set(UserDO::getAvatar, newAvatar).eq(UserDO::getUserId, userId).update();
baseMapper.lambdaUpdate().set(UserDO::getAvatar, newAvatar).eq(UserDO::getUserId, userId).update();
// 删除原头像
LoginUser loginUser = LoginHelper.getLoginUser();
@ -157,7 +157,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
// 更新密码和密码重置时间
LocalDateTime now = LocalDateTime.now();
super.lambdaUpdate().set(UserDO::getPassword, SecureUtils.md5Salt(newPassword, userId.toString()))
baseMapper.lambdaUpdate().set(UserDO::getPassword, SecureUtils.md5Salt(newPassword, userId.toString()))
.set(UserDO::getPwdResetTime, now).eq(UserDO::getUserId, userId).update();
// 更新登录用户信息
@ -172,12 +172,12 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
UserDO userDO = super.getById(userId);
CheckUtils.throwIfNotEqual(SecureUtils.md5Salt(currentPassword, userId.toString()), userDO.getPassword(),
"当前密码错误");
Long count = super.lambdaQuery().eq(UserDO::getEmail, newEmail).count();
Long count = baseMapper.lambdaQuery().eq(UserDO::getEmail, newEmail).count();
CheckUtils.throwIf(() -> count > 0, "邮箱已绑定其他账号,请更换其他邮箱");
CheckUtils.throwIfEqual(newEmail, userDO.getEmail(), "新邮箱不能与当前邮箱相同");
// 更新邮箱
super.lambdaUpdate().set(UserDO::getEmail, newEmail).eq(UserDO::getUserId, userId).update();
baseMapper.lambdaUpdate().set(UserDO::getEmail, newEmail).eq(UserDO::getUserId, userId).update();
// 更新登录用户信息
LoginUser loginUser = LoginHelper.getLoginUser();
@ -202,12 +202,12 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
@Override
public UserDO getByUsername(String username) {
return super.lambdaQuery().eq(UserDO::getUsername, username).one();
return baseMapper.lambdaQuery().eq(UserDO::getUsername, username).one();
}
@Override
public Long countByDeptIds(List<Long> deptIds) {
return super.lambdaQuery().in(UserDO::getDeptId, deptIds).count();
return baseMapper.lambdaQuery().in(UserDO::getDeptId, deptIds).count();
}
@Override
@ -225,6 +225,6 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
* @return 是否存在
*/
private boolean checkNameExists(String name, Long id) {
return super.lambdaQuery().eq(UserDO::getUsername, name).ne(id != null, UserDO::getUserId, id).exists();
return baseMapper.lambdaQuery().eq(UserDO::getUsername, name).ne(id != null, UserDO::getUserId, id).exists();
}
}