Mybatis-plus_CURD接口-IService


  • 0x01_简单看一下批量的源码

  • 0x01_实验1:查询

    • 单次查询getXXX测试

    • 批量查询listXXX测试

  • 0x02_实验2:insert

  • 0x03_其他数据库操作不再介绍,与查询和新增类似,看API就可以


Mybatis-plus_CURD接口-IService

前几篇提到的都是用userMapper操作数据库,实际开发中很少这么做。更常用的是service接口(CURD接口),在业务层简化开发。

CURD接口的官网地址:https://baomidou.com/pages/49cc81/#service-crud-%E6%8E%A5%E5%8F%A3

官网的部分介绍如下:

说明:

  • 通用 Service CRUD 封装IService (opens new window)接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,
  • 泛型 T 为任意实体对象
  • 建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类
  • 对象 Wrapper 为 条件构造器

0x01_简单看一下批量的源码

在实验开始之前,下载相关源码,查看一些重要的API

  • 1.关注默认批次提交数量

    Mybatis-plus_CURD接口-IService

    在批量进行操作的时候,最好特别需要指明批量提交的数量,避免无法描述的错误。

    以批量插入为例,简单看一下源码:在IService接口中,有定义了一个saveBatch方法:

    Mybatis-plus_CURD接口-IService

    看一下其具体实现:在ServiceImpl.java类中:

    Mybatis-plus_CURD接口-IService
    image-20221022141851502
        @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));
    }

    再看具体的executeBatch方法:

    protected <E> boolean executeBatch(Collection<E> list, int batchSize, BiConsumer<SqlSession, E> consumer) {
    return SqlHelper.executeBatch(this.entityClass, this.log, list, batchSize, consumer);
    }

    再看SqlHelper.executeBatch方法:

        public static <E> boolean executeBatch(Class<?> entityClass, Log log, Collection<E> list, int batchSize, BiConsumer<SqlSession, E> consumer) {
    Assert.isFalse(batchSize < 1, "batchSize must not be less than one");
    return !CollectionUtils.isEmpty(list) && executeBatch(entityClass, log, sqlSession -> {
    int size = list.size();
    int idxLimit = Math.min(batchSize, size);
    int i = 1;
    for (E element : list) {
    consumer.accept(sqlSession, element);
    if (i == idxLimit) {
    sqlSession.flushStatements();
    idxLimit = Math.min(idxLimit + batchSize, size);
    }
    i++;
    }
    });
    }

    说明:需要传入batchSize,即批量操作的数量,然后再for循环中,会比较batchSize 和需要批量插入的list的大小,两者取其小赋值为idxLimit,进行批量操作,每次循环次数到idxLimit就执行sqlSession.flushStatements();,也就是数据库刷新操作(这个sqlSession.flushStatements在我读mybatis缓存的相关的源码的时候,就经常碰到)。

    所以,数据的批量操作,不是你想要插多少就插多少的。“批处理”的思想。

0x01_实验1:查询

IService接口提供了很多数据库CURD方法。其中关于查询,有两类,单次查询还是批量查询,单次查询一般都是getXXX,批量查询一般都是listXXX,

Mybatis-plus_CURD接口-IService

准备自定义接口和相关实现类:(MVC结构)

Mybatis-plus_CURD接口-IService

其中:IUserService接口实现IService接口:

package com.bones.mp.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.bones.mp.pojo.User;

/**
* @author : bones
* @version : 1.0
*/

public interface IUserService extends IService<User> {
}

impl/UserService.java:继承ServiceImpl类,实现自定义的IUserService接口

package com.bones.mp.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bones.mp.mapper.UserMapper;
import com.bones.mp.pojo.User;
import com.bones.mp.service.IUserService;
import org.springframework.stereotype.Service;

/**
* @author : bones
* @version : 1.0
*/

@Service
public class UserService extends ServiceImpl<UserMapper, User> implements IUserService {
}

特别注意:一定要加上注解@Service

测试方法:

利用UserService进行查询,所以要进行声明:

    @Autowired
private IUserService userService;

单次查询getXXX测试

//单次查询
@Test
void testGetXXX(){
User user = userService.getById(1);
System.out.println("user = " + user);
}

批量查询listXXX测试

@Test
void testList(){
System.out.println("全部查询list");
//全部查询,没有条件,相当于select * from user
List<User> list = userService.list();
list.forEach(System.out::println);

System.out.println("批量查询listMaps");
System.out.println();
//查询数据,没有条件,但是返回数据类型是map
List<Map<String, Object>> maps = userService.listMaps();
maps.forEach(System.out::println);


System.out.println("批量查询,但是返回数据类型是obj,只返回主键");
List<Object> objects = userService.listObjs();
objects.forEach(System.out::println);


}

注:

1.listObjs()方法用于取出通过MybatisPlus查询到的数据并放入List中,其中取出的数据并不包括对象所有的字段,最多只能返回一个字段。

2.listMaps()方法返回的数据结构是map,但是返回的数据是全的。

0x02_实验2:insert

在IService接口中,有saveXXX方法作为数据库的insert操作:

Mybatis-plus_CURD接口-IService

建议在新增的时候,除了传入新增的对象,最好传入size,自己指定批量新增的数量。

以下面这个测试方法为例:

@Test
void saveBatchUser(){
List<User> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User user = new User(null, "aaa" + i, 10 + i, "aaa" + i + "@163.com");
list.add(user);
}
boolean b = userService.saveBatch(list,5);
System.out.println("b = " + b);
}

运行结果中,打印的日志是批量增加的(5个5个批量增加)

Mybatis-plus_CURD接口-IService
image-20221022163550236

如果不指定,又小于1000个,那就是按照你的list个数来新增。

0x03_其他数据库操作不再介绍,与查询和新增类似,看API就可以


原文始发于微信公众号(小东方不败):Mybatis-plus_CURD接口-IService

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/47206.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!