您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

MybatisPlus生成器ServiceImpl类详解

时间:2022-08-03 11:54:40  来源:  作者:是啊超ya

ServiceImpl类是我们进行SQL操作中非常重要的一个类,通过MyBatisPlus生成的各个实体类的XXXImpl都会继承ServiceImpl类那里继承全部的方法,那么ServiceImpl类中有哪些方法呢?如下介绍:

/** * IService 实现类( 泛型:M 是 mApper 对象,T 是实体 ) * * @author hubin * @since 2018-06-23 */@SuppressWarnings("unchecked")public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {    protected Log log = LogFactory.getLog(getClass());    @Autowired    protected M baseMapper;    @Override    public M getBaseMapper() {        return baseMapper;    }    protected Class<T> entityClass = currentModelClass();    @Override    public Class<T> getEntityClass() {        return entityClass;    }    protected Class<T> mapperClass = currentMapperClass();    /**     * 判断数据库操作是否成功     *     * @param result 数据库操作返回影响条数     * @return boolean     * @deprecated 3.3.1     */    @Deprecated    protected boolean retBool(Integer result) {        return SqlHelper.retBool(result);    }    protected Class<T> currentMapperClass() {        return (Class<T>) ReflectionKit.getSuperClassGenericType(getClass(), 0);    }    protected Class<T> currentModelClass() {        return (Class<T>) ReflectionKit.getSuperClassGenericType(getClass(), 1);    }    /**     * 批量操作 SqlSession     *     * @deprecated 3.3.0     */    @Deprecated    protected SqlSession sqlSessionBatch() {        return SqlHelper.sqlSessionBatch(entityClass);    }    /**     * 释放sqlSession     *     * @param sqlSession session     * @deprecated 3.3.0     */    @Deprecated    protected void closeSqlSession(SqlSession sqlSession) {        SqlSessionUtils.closeSqlSession(sqlSession, GlobalConfigUtils.currentSessionFactory(entityClass));    }    /**     * 获取 SqlStatement     *     * @param sqlMethod ignore     * @return ignore     * @see #getSqlStatement(SqlMethod)     * @deprecated 3.4.0     */    @Deprecated    protected String sqlStatement(SqlMethod sqlMethod) {        return SqlHelper.table(entityClass).getSqlStatement(sqlMethod.getMethod());    }    /**     * 批量插入     *     * @param entityList ignore     * @param batchSize  ignore     * @return ignore     */    @Transactional(rollbackFor = Exception.class)    @Override    public boolean saveBatch(Collection<T> entityList, int batchSize) {        String sqlStatement = getSqlStatement(SqlMethod.INSERT_ONE);        return executeBatch(entityList, batchSize, (sqlSession, entity) -> sqlSession.insert(sqlStatement, entity));    }    /**     * 获取mapperStatementId     *     * @param sqlMethod 方法名     * @return 命名id     * @since 3.4.0     */    protected String getSqlStatement(SqlMethod sqlMethod) {        return SqlHelper.getSqlStatement(mapperClass, sqlMethod);    }    /**     * TableId 注解存在更新记录,否插入一条记录     *     * @param entity 实体对象     * @return boolean     */    @Transactional(rollbackFor = Exception.class)    @Override    public boolean saveOrUpdate(T entity) {        if (null != entity) {            TableInfo tableInfo = TableInfoHelper.getTableInfo(this.entityClass);            Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");            String keyProperty = tableInfo.getKeyProperty();            Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");            Object idVal = ReflectionKit.getFieldValue(entity, tableInfo.getKeyProperty());            return StringUtils.checkValNull(idVal) || Objects.isNull(getById((Serializable) idVal)) ? save(entity) : updateById(entity);        }        return false;    }    @Transactional(rollbackFor = Exception.class)    @Override    public boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize) {        TableInfo tableInfo = TableInfoHelper.getTableInfo(entityClass);        Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");        String keyProperty = tableInfo.getKeyProperty();        Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");        return SqlHelper.saveOrUpdateBatch(this.entityClass, this.mapperClass, this.log, entityList, batchSize, (sqlSession, entity) -> {            Object idVal = ReflectionKit.getFieldValue(entity, keyProperty);            return StringUtils.checkValNull(idVal)                || CollectionUtils.isEmpty(sqlSession.selectList(getSqlStatement(SqlMethod.SELECT_BY_ID), entity));        }, (sqlSession, entity) -> {            MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();            param.put(Constants.ENTITY, entity);            sqlSession.update(getSqlStatement(SqlMethod.UPDATE_BY_ID), param);        });    }    @Transactional(rollbackFor = Exception.class)    @Override    public boolean updateBatchById(Collection<T> entityList, int batchSize) {        String sqlStatement = getSqlStatement(SqlMethod.UPDATE_BY_ID);        return executeBatch(entityList, batchSize, (sqlSession, entity) -> {            MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();            param.put(Constants.ENTITY, entity);            sqlSession.update(sqlStatement, param);        });    }    @Override    public T getOne(Wrapper<T> queryWrapper, boolean throwEx) {        if (throwEx) {            return baseMapper.selectOne(queryWrapper);        }        return SqlHelper.getObject(log, baseMapper.selectList(queryWrapper));    }    @Override    public Map<String, Object> getMap(Wrapper<T> queryWrapper) {        return SqlHelper.getObject(log, baseMapper.selectMaps(queryWrapper));    }    @Override    public <V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {        return SqlHelper.getObject(log, listObjs(queryWrapper, mapper));    }    /**     * 执行批量操作     *     * @param consumer consumer     * @since 3.3.0     * @deprecated 3.3.1 后面我打算移除掉 {@link #executeBatch(Collection, int, BiConsumer)} }.     */    @Deprecated    protected boolean executeBatch(Consumer<SqlSession> consumer) {        return SqlHelper.executeBatch(this.entityClass, this.log, consumer);    }    /**     * 执行批量操作     *     * @param list      数据集合     * @param batchSize 批量大小     * @param consumer  执行方法     * @param <E>       泛型     * @return 操作结果     * @since 3.3.1     */    protected <E> boolean executeBatch(Collection<E> list, int batchSize, BiConsumer<SqlSession, E> consumer) {        return SqlHelper.executeBatch(this.entityClass, this.log, list, batchSize, consumer);    }    /**     * 执行批量操作(默认批次提交数量{@link IService#DEFAULT_BATCH_SIZE})     *     * @param list     数据集合     * @param consumer 执行方法     * @param <E>      泛型     * @return 操作结果     * @since 3.3.1     */    protected <E> boolean executeBatch(Collection<E> list, BiConsumer<SqlSession, E> consumer) {        return executeBatch(list, DEFAULT_BATCH_SIZE, consumer);    }}

ServiceImpl类各方法(未过期)的作用

1.getBaseMapper()
2.getEntityClass()
3.saveBatch()
4.saveOrUpdate()
5.saveOrUpdateBatch()
6.updateBatchById()
7.getOne()
8.getMap()
9.getObj()

ServiceImpl类各属性的作用

1.log:打印日志
2.baseMapper:实现了许多的SQL操作
3.entityClass:实体类
4.mapperClass:映射类

BaseMapper类中各方法

ServiceImpl类中有这个类的成员变量,因此通过ServiceImpl这个类便能够操作如下方法:

1.int insert(T entity);:插入记录
2.int deleteById(Serializable id);:通过id删除指定记录
3.int deleteByMap(Map<String, Object> columnMap):通过Map集合添加删除指定记录
4.int delete(@Param(Constants.WRAPPER) Wrapper queryWrapper):通过添加构造器删除指定记录
5.int deleteBatchIds(Collection<? extends Serializable> idList):通过List集合批量删除记录


6.int updateById(T entity):根据id修改指定记录
7.int update(T entity, Wrapper updateWrapper):根据条件构造器
8.T selectById(Serializable id):根据id查询指定记录
9.List selectBatchIds(Collection<? extends Serializable> idList):根据List集合批量查询记录
10.List selectByMap(Map<String, Object> columnMap):根据Map集合查询记录


11.T selectOne(Wrapper queryWrapper):根据条件构造器查询一条记录
12.Integer selectCount(Wrapper queryWrapper):根据条件构造器查询记录总数
13.List selectList(Wrapper queryWrapper):根据条件构造器查询全部记录
14.List<Map<String, Object>> selectMaps(Wrapper queryWrapper):根据条件构造器查询全部记录
15.ist selectObjs(Wrapper queryWrapper):根据条件构造器查询全部记录
16.<E extends IPage> E selectPage(E page, Wrapper queryWrapper):根据条件构造器查询全部记录(并翻页)
17.<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, Wrapper queryWrapper):根据条件构造器查询全部记录(并翻页)

Wrapper类各方法

1.getEntity():实体对象(子类实现)
2.getSqlSelectgetSqlSet():
3.getSqlComment():
4.getSqlFirst():
5.getExpression():获取 MergeSegments
6.getCustomSqlSegment():获取自定义SQL 简化自定义XML复杂情况
7.isEmptyOfWhere():查询条件为空(包含entity)
8.nonEmptyOfWhere():查询条件不为空(包含entity)
9.isEmptyOfNormal():查询条件为空(不包含entity)
10.nonEmptyOfNormal():查询条件为空(不包含entity)
11.nonEmptyOfEntity():深层实体判断属性
12.fieldStrategyMatch():根据实体FieldStrategy属性来决定判断逻辑
13.isEmptyOfEntity():深层实体判断属性
14.getTargetSql():获取格式化后的执行sql
15.clear():条件清空

实例说明

public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {}public class CategoryServiceImpl extends ServiceImpl<CategoryDao, CategoryEntity> implements CategoryService {}

在ServiceImpl中已经注入了Mapper对象: protected M baseMapper;因此XXXServiceImpl只要继承了这个原生的ServiceImpl,这个M实体Dao就已经注入了进来,不需要重新注入。



Tags:MybatisPlus   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
MyBatisPlus逻辑删除与唯一索引的兼容问题
需求背景比如有张用户表,在插入或者更新数据的时候,我们需要 用户名称(username),不能重复。我们首先考虑的是给该字段创建唯一索引create unique index uni_username on use...【详细内容】
2023-04-04  Search: MybatisPlus  点击:(186)  评论:(0)  加入收藏
MybatisPlus生成器ServiceImpl类详解
ServiceImpl类是我们进行SQL操作中非常重要的一个类,通过MybatisPlus生成的各个实体类的XXXImpl都会继承ServiceImpl类那里继承全部的方法,那么ServiceImpl类中有哪些方法呢?如...【详细内容】
2022-08-03  Search: MybatisPlus  点击:(1287)  评论:(0)  加入收藏
MyBatisPlus又在搞事了!发布神器,一个依赖轻松搞定权限问题
今天介绍一个 MyBatis - Plus 官方发布的神器:mybatis-mate 为 mp 企业级模块,支持分库分表,数据审计、数据敏感词过滤(AC算法),字段加密,字典回写(数据绑定),数据权限,表结构自动生成...【详细内容】
2022-06-17  Search: MybatisPlus  点击:(268)  评论:(0)  加入收藏
学会了MybatisPlus,代码开发效率提高了10倍
1. Mybatis 存在的痛点我们知道 MyBatis 是一个基于 java 的持久层框架,它内部封装了 jdbc,极大提高了我们的开发效率。但是使用 Mybatis 开发也有很多痛点: 每个 Dao 接口都需...【详细内容】
2022-06-14  Search: MybatisPlus  点击:(409)  评论:(0)  加入收藏
SpringBoot整合MybatisPlus基本的增删改查,保姆级教程
MybatisPlus是国产的第三方插件, 它封装了许多常用的CURDapi,免去了我们写mapper.xml的重复劳动,这里介绍了基本的整合SpringBoot和基础用法。2|0引入依赖在项目中pom文件引入m...【详细内容】
2022-05-05  Search: MybatisPlus  点击:(300)  评论:(0)  加入收藏
SpringBoot整合MybatisPlus数据自动填充
SpringBoot 集成 MybatisPlus 系列SpringBoot 版本:2.6.4 MybatisPlus 版本:3.5.1 SpringBoot整合MybatisPlus SpringBoot整合MybatisPlus数据自动填充 SpringBoot整合Mybatis...【详细内容】
2022-03-18  Search: MybatisPlus  点击:(580)  评论:(0)  加入收藏
MybatisPlus中实体类属性对应枚举类实现
一、前言1.1、关于枚举类① 枚举是JDK1.5中的新功能,我们可以使用枚举很好的去描述一些业务场景:一年有四季、人类有男女...② 同样我们在业务层面会有很多,比如状态属性、分...【详细内容】
2022-01-20  Search: MybatisPlus  点击:(668)  评论:(0)  加入收藏
用了MybatisPlus后,我很久没有手写sql了
(一)前言最早写JDBC的时候,要手动配连接信息,要一条条手写sql语句。后来Mybatis出现了,不需要再手动配置连接信息,sql语句也和代码隔离开来,但是还免不了写Sql。接着出现了MybatisP...【详细内容】
2021-09-17  Search: MybatisPlus  点击:(384)  评论:(0)  加入收藏
▌简易百科推荐
Qt与Flutter:在跨平台UI框架中哪个更受欢迎?
在跨平台UI框架领域,Qt和Flutter是两个备受瞩目的选择。它们各自具有独特的优势,也各自有着广泛的应用场景。本文将对Qt和Flutter进行详细的比较,以探讨在跨平台UI框架中哪个更...【详细内容】
2024-04-12  刘长伟    Tags:UI框架   点击:(7)  评论:(0)  加入收藏
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(11)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(23)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(62)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(52)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(43)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(58)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(72)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(95)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(91)  评论:(0)  加入收藏
站内最新
站内热门
站内头条