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语句。而是一条一条的往外差人

相关推荐
小蒜学长1 分钟前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险
掉进电商坑三年没爬出来的东叔12 分钟前
青龙面板进阶:一个面板聚合多平台签到,所有积分自动领
java·开发语言
iCxhust25 分钟前
51单片机电力载波应用开发(七)广播通讯
c语言·开发语言·单片机·嵌入式硬件·51单片机
殷色玫瑰1 小时前
C++ STL:stack、queue、priority_queue 与容器适配器详解
java·开发语言·数据结构·c++·算法·visualstudio
IT方大同1 小时前
java输入输出+方法
java·开发语言·python
滕州市燕猫虎计算机科技工作室个体工商户1 小时前
《Rust程序设计》学习笔记一
开发语言·rust·学习笔记·rust程序设计
Yyyyyy~1 小时前
【Java】String
java
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: 服务拆分之服务远程调用
java·开发语言·spring cloud
努力努力再努力wz2 小时前
【CUDA入门系列】CUDA编程实战:设备选择、显存管理、Kernel、Stream 与 Event 全流程梳理
开发语言·c++
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: 路由断言工厂
java·spring·spring cloud