Springboot集成mybatis-plus扩展IService

注意:文中涉及到的逻辑删除填充自动填充字段不在本文中详细描述,如有需要请到http://Mybatis-plus逻辑删除更新字段icon-default.png?t=N176https://blog.youkuaiyun.com/qq_43040552/article/details/129276903

版本

  <!-- SpringBoot的依赖配置-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.5.14</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
 <!-- mybatis增强插件-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-extension</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>

创建自定义MybaseMapper

public interface MyBaseMapper<T> extends BaseMapper<T> {
    /**
     * 根据id逻辑删除并填充字段
     * @param entity
     * @return
     */
    int deleteByIdWithFill(T entity );

    /**
     * 批量逻辑删除并填充字段
     * @param entity
     * @param wrapper
     * @return
     */
    int batchDeleteWithFill(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> wrapper);
}

创建BaseService

public interface BaseService<T> extends IService<T> {

    /**
     * 获取 QueryWrapper
     *
     * @return
     */
    QueryWrapper<T> getWarpper();

    /**
     * 获取 QueryWrapper
     *
     * @param condition 查询条件对象的JSON字符串
     * @return
     */
    QueryWrapper<T> getWarpper(String condition);

    /**
     * 获取 QueryWrapper
     *
     * @param condition   查询条件对象的JSON字符串
     * @param isCamelCase 是否进行驼峰命名转下划线
     * @return
     */
    QueryWrapper<T> getWarpper(String condition, boolean isCamelCase);

    /**
     * 获取 LambdaQueryWrapper
     *
     * @param condition 查询条件对象的JSON字符串
     * @return
     */
    LambdaQueryWrapper<T> getLambda(String condition);

    /**
     * 获取 LambdaQueryWrapper
     *
     * @param condition   查询条件对象的JSON字符串
     * @param isCamelCase 是否进行驼峰命名转下划线
     * @return
     */
    LambdaQueryWrapper<T> getLambda(String condition, boolean isCamelCase);

    /**
     * 获取 LambdaQueryWrapper
     *
     * @return
     */
    LambdaQueryWrapper<T> getLambda();

    /**
     * 获取排序字段
     * 获取请求参数 orderBy
     *
     * @return
     */
    List<OrderBy> getOrderBys();

    /**
     * 获取排序字段
     * 获取请求参数 orderBy
     *
     * @return
     */
    List<OrderItem> getOrderItems();


    /**
     * 获取排序字段
     * 获取请求参数 orderBy
     *
     * @return
     */
    List<OrderItem> getOrderItemsByJson(String orderJson);

    /**
     * 根据排序的json字符串获取排序
     *
     * @param orderStr json map类型 key 排序字段 value 排序类型
     * @return
     */
    List<OrderItem> getOrderItemsByMap(String orderStr);

    /**
     * 根据map生成排序
     *
     * @param map key 排序字段 value 排序类型
     * @return
     */
    List<OrderItem> getOrderItems(Map<String, String> map);

    /**
     * 排序
     * 如果column 为空 返回 null
     *
     * @param column 排序字段,默认进行驼峰转化
     * @param isAsc  是否ase 排序
     * @return
     */
    OrderItem getOrderItem(String column, boolean isAsc);

    /**
     * 获取 QueryWrapper
     *
     * @param condition 查询条件对象的JSON字符串
     * @return
     */
    QueryWrapper<T> getWarpper(String condition, String orderJson);

    /**
     * 根据 entity 条件,逻辑删除记录
     * 根据 {@link TableField} 中 fill 属性自动填充
     *
     * @param queryWrapper 实体包装类 {@link QueryWrapper}
     */
    boolean removeLogic(Wrapper<T> queryWrapper);

    /**
     * 删除(根据ID 逻辑删除)
     * 根据 {@link TableField} 中 fill 属性自动填充
     *
     * @param id 主键ID
     */
    boolean removeLogicById(Serializable id);

    /**
     * 删除(根据ID 批量逻辑删除)
     * 根据 {@link TableField} 中 fill 属性自动填充
     *
     * @param idList 主键ID列表
     */
    boolean removeLogicByIds(Collection<? extends Serializable> idList);
}

创建BaseServiceImpl

public abstract class BaseServiceImpl<M extends BaseMapper<T>, T>
        extends ServiceImpl<M, T>
        implements BaseService<T> {
    /**
     * 获取页数 默认1
     *
     * @return
     */
    public Integer getPageNum() {
        return ServletUtils.getParameterToInt(PageConstants.PAGE_NUM, PageConstants.PAGE_NUM_DEF);
    }

    /**
     * 获取每页条数 默认10
     *
     * @return
     */
    public Integer getPageSize() {
        return ServletUtils.getParameterToInt(PageConstants.PAGE_SIZE, PageConstants.PAGE_SIZE_DEF);
    }

    /**
     * 获取 page 对象
     *
     * @return
     */
    public Page<T> getPage() {
        Integer current = getPageNum();
        Integer size = getPageSize();
        return getPage(current, size);
    }

    /**
     * 获取 page 对象
     *
     * @param pageNum  页数 默认 1
     * @param pageSize 条目数 默认 10
     * @return
     */
    public Page<T> getPage(Integer pageNum, Integer pageSize) {
        Page<T> page = new Page<>();
        page.setCurrent(ObjectUtil.isEmpty(pageNum) ? PageConstants.PAGE_NUM_DEF : pageNum);
        page.setSize(ObjectUtil.isEmpty(pageSize) ? PageConstants.PAGE_SIZE_DEF : pageSize);
        return page;
    }

    /**
     * 根据页数和条目数翻页查询
     *
     * @see Wrappers#emptyWrapper()
     */
    public <E extends IPage<T>> E page() {
        return (E) super.page(getPage());
    }

    /**
     * 翻页查询
     *
     * @param queryWrapper 实体对象封装操作类 {@link QueryWrapper}
     */
    public <E extends IPage<T>> E page(Wrapper<T> queryWrapper) {
        return (E) super.page(getPage(), queryWrapper);
    }


    /**
     * 根据条件获取 QueryWrapper
     *
     * @param condition 查询条件对象的JSON字符串
     * @return
     * @see
     */
    @Override
    public QueryWrapper<T> getWarpper(String condition) {
        if (StringUtils.isNotBlank(condition)) {
            return SearchUtils.parseWhereSql(condition);
        } else {
            return Wrappers.query();
        }
    }

    /**
     * 根据条件获取 QueryWrapper
     *
     * @param condition   查询条件对象的JSON字符串 {@link Condition}
     * @param isCamelCase 是否进行驼峰命名转下划线
     * @return
     * @see
     */
    @Override
    public QueryWrapper<T> getWarpper(String condition, boolean isCamelCase) {
        if (StringUtils.isNotBlank(condition)) {
            return SearchUtils.parseWhereSql(condition, isCamelCase);
        } else {
            return Wrappers.query();
        }
    }

    /**
     * 获取 QueryWrapper
     *
     * @return
     */
    @Override
    public QueryWrapper<T> getWarpper() {
        return getWarpper(null);
    }


    /**
     * 获取 LambdaQueryWrapper
     *
     * @return
     */
    @Override
    public LambdaQueryWrapper<T> getLambda(String condition) {
        return getWarpper(condition).lambda();
    }

    /**
     * 获取 LambdaQueryWrapper
     *
     * @param condition   查询条件对象的JSON字符串
     * @param isCamelCase 是否进行驼峰命名转下划线
     * @return
     */
    @Override
    public LambdaQueryWrapper<T> getLambda(String condition, boolean isCamelCase) {
        return getWarpper(condition, isCamelCase).lambda();
    }

    /**
     * 获取 LambdaQueryWrapper
     *
     * @return
     */
    @Override
    public LambdaQueryWrapper<T> getLambda() {
        return Wrappers.lambdaQuery();
    }

    /**
     * 获取排序字段
     * 获取请求参数 orderBy
     *
     * @return
     */
    @Override
    public List<OrderBy> getOrderBys() {
        String order = ServletUtils.getParameter(PageConstants.ORDER);
        if (ObjectUtil.isEmpty(order)) {
            return null;
        }
        List<OrderBy> orderByList = new ArrayList<>();
        if (JsonUtil.isTypeJSONArray(order)) {
            orderByList.addAll(JsonUtil.toList(order, OrderBy.class));
        } else {
            orderByList.add(JsonUtil.parse(order, OrderBy.class));
        }
        return orderByList;
    }

    /**
     * 获取排序字段
     * 获取请求参数 orderBy
     * 数据类型{@link OrderBy}
     *
     * @return
     */
    @Override
    public List<OrderItem> getOrderItems() {
        String order = ServletUtils.getParameter(PageConstants.ORDER);
        return OrderItemUtils.getOrder(order);
    }

    /**
     * 获取排序字段
     * 获取请求参数 orderBy
     * 数据类型{@link OrderBy}
     *
     * @return
     */
    @Override
    public List<OrderItem> getOrderItemsByJson(String orderJson) {
        return OrderItemUtils.getOrder(orderJson);
    }

    /**
     * 根据排序的json字符串获取排序
     *
     * @param orderStr json map类型 key 排序字段 value 排序类型
     * @return
     */
    @Override
    public List<OrderItem> getOrderItemsByMap(String orderStr) {
        if (StrUtil.isNotBlank(orderStr)) {
            return OrderItemUtils.getOrder(orderStr);
        }
        return null;
    }

    /**
     * 根据map生成排序
     *
     * @param map key 排序字段 value 排序类型
     * @return
     */
    @Override
    public List<OrderItem> getOrderItems(Map<String, String> map) {
        return OrderItemUtils.getOrder(map);
    }

    /**
     * 排序
     * 如果column 为空 返回 null
     *
     * @param column 排序字段,默认进行驼峰转化
     * @param isAsc  是否ase 排序
     * @return
     */
    @Override
    public OrderItem getOrderItem(String column, boolean isAsc) {
        return OrderItemUtils.getOrder(column, isAsc);
    }

    /**
     * 获取 QueryWrapper
     *
     * @param condition 查询条件对象的JSON字符串
     * @param orderJson
     * @return
     */
    @Override
    public QueryWrapper<T> getWarpper(String condition, String orderJson) {
        QueryWrapper<T> warpper = getWarpper(condition);
        List<OrderItem> orderItems = getOrderItemsByJson(orderJson);
        if (orderItems != null) {
            for (OrderItem orderItem : orderItems) {
                if (orderItem.isAsc()) {
                    warpper.orderByAsc(orderItem.getColumn());
                } else {
                    warpper.orderByDesc(orderItem.getColumn());
                }
            }
        }
        return warpper;
    }

    /**
     * 根据 entity 条件,逻辑删除记录
     * 根据注解自动更新字段值
     * Mapper 必须继承 MyBaseMapper
     * 根据 {@link com.baomidou.mybatisplus.annotation.TableField} 中 fill 属性自动填充
     *
     * @param queryWrapper 实体包装类 {@link QueryWrapper}
     */
    @Override
    public boolean removeLogic(Wrapper<T> queryWrapper) {
        MyBaseMapper myBaseMapper = getMyBaseMapper();
        if (myBaseMapper == null) {
            return remove(queryWrapper);
        } else {
            T instance = ReflectUtil.newInstance(getEntityClass());
            return SqlHelper.retBool(myBaseMapper.batchDeleteWithFill(instance, queryWrapper));
        }

    }

    /**
     * 删除(根据ID 逻辑删除)
     * 根据注解自动更新字段值
     * Mapper 必须继承 MyBaseMapper
     * 根据 {@link com.baomidou.mybatisplus.annotation.TableField} 中 fill 属性自动填充
     *
     * @param id 主键ID
     */
    @Override
    public boolean removeLogicById(Serializable id) {
        if (ObjectUtil.isEmpty(id)) {
            return false;
        }
        MyBaseMapper myBaseMapper = getMyBaseMapper();
        if (myBaseMapper == null) {
            return removeById(id);
        } else {
            T instance = ReflectUtil.newInstance(getEntityClass());
            ReflectUtil.setFieldValue(instance, "id", id);
            return SqlHelper.retBool(myBaseMapper.deleteByIdWithFill(instance));
        }
    }

    /**
     * 删除(根据ID 批量逻辑删除)
     * 根据注解自动更新字段值
     * Mapper 必须继承 MyBaseMapper
     * 根据 {@link com.baomidou.mybatisplus.annotation.TableField} 中 fill 属性自动填充
     *
     * @param idList 主键ID列表
     */
    @Override
    public boolean removeLogicByIds(Collection<? extends Serializable> idList) {
        if (ObjectUtil.isEmpty(idList)) {
            return false;
        }
        MyBaseMapper myBaseMapper = getMyBaseMapper();
        if (myBaseMapper == null) {
            return removeByIds(idList);
        } else {
            LambdaQueryWrapper<T> lambda = getLambda();
            String idsStr = idList.toString();
            lambda.apply("id in (" + idsStr.substring(1, idsStr.length() - 1) + ")");
            T instance = ReflectUtil.newInstance(getEntityClass());
            return SqlHelper.retBool(myBaseMapper.batchDeleteWithFill(instance, lambda));
        }
    }

    /**
     * 获取 MyBaseMapper
     *
     * @return
     */
    public MyBaseMapper getMyBaseMapper() {
        if (baseMapper instanceof MyBaseMapper) {
            return (MyBaseMapper) baseMapper;
        }
        return null;
    }
}

使用

1、mapper继承MyBaseMapper

public interface SysOperLogMapper extends BaseMapper<SysOperLog> {
}

2、service继承BaseService

public interface SysOperLogService extends BaseService<SysOperLog> {

}

3、serviceImpl继承BaseServiceImpl

@Service
public class SysOperLogServiceImpl extends BaseServiceImpl<SysOperLogMapper, SysOperLog> implements SysOperLogService {
    
}

至此扩展完成,在调用service中时,可以同时使用扩展方法及mybatis-plus自带的方法

注意:文中涉及到的逻辑删除填充自动填充字段不在本文中详细描述,如有需要请到

Mybatis-plus逻辑删除更新字段icon-default.png?t=N176https://blog.youkuaiyun.com/qq_43040552/article/details/129276903

### 回答1: CentOS 7上启动httpd服务失败可能有多种原因,以下是一些常见的解决方法: 1. 检查httpd配置文件是否正确:可以使用命令`httpd -t`检查httpd配置文件是否正确,如果有错误,需要修改配置文件。 2. 检查端口是否被占用:可以使用命令`netstat -tlnp`查看端口是否被占用,如果被占用需要释放端口或修改httpd配置文件中的端口号。 3. 检查httpd服务是否安装:可以使用命令`rpm -qa | grep httpd`查看httpd服务是否安装,如果没有安装需要先安装httpd服务。 4. 检查httpd服务是否启动:可以使用命令`systemctl status httpd`查看httpd服务是否启动,如果没有启动需要使用命令`systemctl start httpd`启动httpd服务。 5. 检查SELinux是否开启:如果SELinux开启,可能会导致httpd服务启动失败,需要使用命令`setenforce 0`关闭SELinux,或者修改SELinux策略。 以上是一些常见的解决方法,如果以上方法都无法解决问题,可以查看httpd服务日志文件,找到具体的错误信息,然后根据错误信息进行解决。 ### 回答2: CentOS 7上的httpd服务启动失败可能有多种原因。以下列出了一些常见问题和解决方法: 1. 端口被占用 当httpd试图占用已被其他程序占用的端口时会启动失败。此时可以通过使用`netstat -tunlp`命令检查端口占用情况,然后杀死占用该端口的进程及时释放端口。或者修改httpd的配置文件,将端口修改为未被占用的端口。 2. 配置文件错误 有时httpd服务的配置文件中可能出现错误,例如语法错误或路径错误等等。在启动httpd服务之前,可以使用`apachectl configtest`命令进行检查,如果输出“Syntax OK”,则表示配置文件没有错误。如果出现错误,则需要根据错误提示进行相应修改。 3. 依赖关系问题 如果httpd依赖的其他程序或库缺失,也会导致启动失败。可以通过使用`systemctl status httpd.service`命令来查看httpd服务状态,如果输出“Failed to start”或“Loaded: failed”,则需要检查依赖关系是否完整。 4. SELinux问题 当SELinux启用时,有时会导致httpd服务启动失败。在这种情况下,可以在SELinux上禁用httpd服务,或者修改httpd配置文件解决SELinux相关的问题。 5. 用户权限问题 httpd服务的启动可能需要特定的用户权限。如果使用的用户权限不够,则无法启动。可以尝试使用root用户启动httpd服务,或者根据需要修改相应的用户权限。 ### 回答3: CentOS 7中的Apache HTTP服务器(httpd)是一个常见的Web服务器,如果遇到httpd服务启动失败的情况,可能会影响服务器正常的工作和对外服务的稳定性。本文将提供一些可能会导致httpd服务启动失败的原因,并给出相应的解决方法。 1. 端口被占用 如果端口被其他进程占用,httpd服务就无法启动。可以通过 netstat -tulpn 命令查看端口占用情况,并杀死占用该端口的进程。如果端口被 httpd 服务自身占用,可以通过 systemctl restart httpd 命令重启 httpd 服务;如果是其他进程占用了端口,可以通过 kill 命令杀死该进程或更改 httpd.conf 文件配置,将 httpd 服务的端口改为其他空闲端口,重新启动。 2. 配置文件错误 httpd 服务的配置文件通常是 /etc/httpd/conf/httpd.conf,如果其中存在语法错误、权限问题或者其它配置错误,可能会导致 httpd 服务启动出错。可以通过将 httpd.conf 文件备份后删掉,重新执行 yum install httpd 命令安装 httpd 服务,然后手动修改 httpd.conf 文件,逐个检查每个配置项是否正确,确认无误后重启 httpd 服务。 3. SELinux 问题 SELinux 是 CentOS 7中提供的一种安全模块,它可以对系统文件和应用程序进行安全管控。如果 SELinux 配置不正确,可能会阻止 httpd 服务正常启动。可以通过修改 /etc/selinux/config 文件中 SELINUX=disabled 来暂时关闭 SELinux,然后重新启动 httpd 服务;或者一个更优的方式是,根据日志确定问题原因,使用命令 semanage 或者 setsebool 等工具将相关目录或者配置加入到 SELinux 许可列表中,重新启动 httpd 服务,以恢复服务正常工作。 4. 防火墙问题 如果你的 CentOs 7 服务器启用了防火墙,有可能会导致 httpd 服务启动失败。可以通过检查防火墙相关配置来确定问题原因,解决方案是修改防火墙规则,将端口 80 或者 443 等 httpd 服务需要的端口放行,重新启动 httpd 服务。 总之,当遇到 httpd 服务启动失败时,不要慌张,可以先通过日志或者执行命令查看错误信息,找到错误原因,然后根据错误原因一步一步解决问题。在解决问题过程中注意备份原始配置文件,以免造成不必要的损失。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值