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


    1、实现连表查询 

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

    c6307649c27d48868032dbf6febb8264.png

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

    1. <dependency>
    2. <groupId>com.github.yulichang</groupId>
    3. <artifactId>mybatis-plus-join-boot-starter</artifactId>
    4. <version>1.4.4.1</version>
    5. </dependency>

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

    ff6fb83b23464b6fa1238091a11f71b7.png

    在server层的编写就是:

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

    user表:f37b07073c6d496db2bf738299042448.png         user_role表 :601a33aa9503456b8fe2c02a10924bb7.png

    1. @Override
    2. public Page<UserPo> selectByRoleName(Integer pageNum, Integer pageSize) {
    3. Page<UserPo> userPoPage = userMapper.selectJoinPage(new Page<>(pageNum, pageSize, true), UserPo.class, new MPJLambdaWrapper<UserPo>()
    4. .selectAll(UserPo.class)
    5. .innerJoin(UserRolePo.class, UserRolePo::getUserId, UserPo::getUserId)
    6. .eq(UserRolePo::getRoleId, role.getRoleId()));
    7. return userPoPage;
    8. }

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

    执行的SQL语句

    fb735b4f290d46468b6f285d24481cf9.png

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

    2、实现批量操作

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

    Mapper层:    

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

    e064c77ee2f84eeeba55f2246fa57657.png

    Server层: 

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

    d6f2bfbdc1634121bc89462b90f986dc.png

    2b4fdcde6a73431dba537e79519eb183.png

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

    1. @Service
    2. public class SignInServerImpl extends ServiceImpl<SignInMapper, SignInPo>implements ISignInServer {
    3. /**
    4. * 往签到表里插入这个班里所有的学生
    5. * @param listSignPo
    6. * @return {@link Boolean}
    7. */
    8. @Override
    9. public Boolean insertAllClassmate(List<SignPo> listSignPo) {
    10. return this.saveBatch(listSignPo);
    11. }
    12. /**
    13. * 批量修改签到表里这个课的学生的签到状态和结束这个课
    14. * @param listSignPo
    15. * @return {@link Boolean}
    16. */
    17. @Override
    18. public Boolean signInOne(List<SignInDto> signInDtos) {
    19. List<SignInPo> list = new LinkedList<>();
    20. for (int i = 0; i < signInDtos.size(); i++) {
    21. SignInPo signInPo = new SignInPo();
    22. signInPo.setId(signInDtos.get(i).getSignId());
    23. signInPo.setIsSignIn(signInDtos.get(i).getIsSigIn());
    24. signInPo.setIsClassing(0);
    25. list.add(signInPo);
    26. }
    27. return this.updateBatchById(list);
    28. }
    29. }

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

    c8980db92fa84475b89fcb8e7946963f.png

  • 相关阅读:
    模型压缩-浅尝
    2022-8-21 第七小组 学习日记 (day45)Java测试***
    【Go】用 DBeaver、db browser 和 SqlCipher 读取 SqlCipher 数据库
    论文学习——多度量水文时间序列相似性分析
    Navisworks二次开发——工具附加模块添加
    【MySQL入门】第一话 · 初入“数据库”大陆
    python制作小游戏之二2048最终章
    RabbitMQ 消息中间件与集群的部署
    函数习题(下)
    【每日一题】补档 CF1678B-Tokitsukaze and Good 01-String | 思维 | 简单
  • 原文地址:https://blog.csdn.net/qq_64680177/article/details/133947746