MyBatisPlus实现连表操作、批量处理

1、实现连表查询

正常来说单靠mybatisplus无法实现连表查询,只能靠单表sql然后进行拼接形成连表查询,或者使用xml文件去编写sql语句来实现连表查询。但他又给我们提供了一个插件MyBatis-Plus-Join,用来弥补mybatisplus再连表上的不足,写法和之前的用法没有太多差别。

我们要使用这个工具首先要引入他的依赖;

复制代码
        <dependency>
            <groupId>com.github.yulichang</groupId>
            <artifactId>mybatis-plus-join-boot-starter</artifactId>
            <version>1.4.4.1</version>
        </dependency>

和普通的mybatisplus不同,他的mapper层继承的不是BaseMapper接口,而是MPJBaseMapper接口。

在server层的编写就是:

这个方法中一共涉及到两个表,user表和user_role表,然后就是查询出roleId为1的用户信息。

user表: user_role表 :

复制代码
@Override
    public Page<UserPo> selectByRoleName(Integer pageNum, Integer pageSize) {

        Page<UserPo> userPoPage = userMapper.selectJoinPage(new Page<>(pageNum, pageSize, true), UserPo.class, new MPJLambdaWrapper<UserPo>()
                .selectAll(UserPo.class)
                .innerJoin(UserRolePo.class, UserRolePo::getUserId, UserPo::getUserId)
                .eq(UserRolePo::getRoleId, role.getRoleId()));
       return userPoPage;
    }

再这个里面我使用了分页查询,可以看出和以前用mybatisplus的分页查询没有什么区别。

执行的SQL语句:

具体关于MyBatis-Plus-Join这个插件的使用,大家可以去官网看看,里面的使用方法介绍一目了然,还有样例使用:MyBatis-Plus-Join

2、实现批量操作

实现批量操作的话使用的是IService 类提供的 saveBatch 方法,来实现批量数据的插入功能,想要使用这个方法,和平常我们继承的东西不同。当然用这个接口里的方法不是真正的批量操作,实际上还是进行的一条一条sql的操作,比起真正的批量操作还是效率低一些。

Mapper层:

我们先创建一个Mapper窗口继承BaseMapper接口。

Server层:

接口要实现IService接口,然后实现类要继承ServiceImpl类和实现所对应的接口

这两三个地方都弄好之后我们就可以再Service实现类SignInServerImpl 中进行业务的编写了。

复制代码
@Service
public class SignInServerImpl extends ServiceImpl<SignInMapper, SignInPo>implements ISignInServer {
    
    /**
     * 往签到表里插入这个班里所有的学生
     * @param listSignPo
     * @return {@link Boolean}
     */
    @Override
    public Boolean insertAllClassmate(List<SignPo> listSignPo) {
        return this.saveBatch(listSignPo);
    }
    
    /**
     * 批量修改签到表里这个课的学生的签到状态和结束这个课
     * @param listSignPo
     * @return {@link Boolean}
     */
    @Override
    public Boolean signInOne(List<SignInDto> signInDtos) {
        List<SignInPo> list = new LinkedList<>();
        for (int i = 0; i < signInDtos.size(); i++) {
            SignInPo signInPo = new SignInPo();
            signInPo.setId(signInDtos.get(i).getSignId());
            signInPo.setIsSignIn(signInDtos.get(i).getIsSigIn());
            signInPo.setIsClassing(0);
            list.add(signInPo);
        }
        return this.updateBatchById(list);
    }
}

这是执行所打印的sql,可以看出执行的并不是批量插入的sql语句。而是一条一条的往外差人

相关推荐
孞㐑¥6 小时前
算法—滑动窗口
开发语言·c++·经验分享·笔记·算法
AI-小柒6 小时前
从零入门大语言模型(LLM):系统学习路线与实践指南
大数据·开发语言·人工智能·学习·信息可视化·语言模型·自然语言处理
invicinble6 小时前
关于对后端开发工程师,在项目层面的基本需求与进阶方向
java
hhy_smile6 小时前
Python environment and installation
开发语言·python
懒鸟一枚6 小时前
Java17新特性详解
java
戌中横6 小时前
JavaScript 对象
java·开发语言·javascript
crossaspeed6 小时前
面向对象的三大特征和反射(八股)
java·开发语言
连山齐名6 小时前
程序员棋谱之一——单例模式
开发语言·单例模式
zfj3216 小时前
java synchronized关键字用法和底层原理
java·开发语言·轻量级锁·重量级锁·偏向锁·线程同步
梵高的代码色盘6 小时前
互联网大厂Java求职面试实录与技术深度解析
java·spring·缓存·微服务·面试·互联网大厂·技术深度