MybatisPlus IService接口功能介绍

 更新时间:2024年09月22日 09:41:25   作者:游王子og  
MybatisPlus中的IService接口为开发者提供了一系列基础数据库操作方法,如增删改查等,通过泛型支持不同类型的实体和主键,IService的默认实现类为ServiceImpl,它实现了接口中的基本方法,用户可通过继承ServiceImpl来扩展自定义的业务逻辑

一、介绍

在MybatisPlus框架中,IService接口扮演着重要的角色。

作为一个通用的服务接口,IService定义了一系列方法,包括查询、插入、更新、删除等。

这些方法的定义使得在服务层进行数据库操作变得更为便捷和高效。

  • IService 接口是一个泛型接口,定义了一组通用的基础方法,包括常见的增删改查操作。
  • 例如,它提供了插入数据、根据主键更新数据、根据主键删除数据、根据主键查询数据等方法的签名。
  • 用户可以根据自己的需求和业务逻辑在自定义的服务接口中继承 IService 接口,并实现其中的方法。

用法:

 public interface UserService extends IService<User> {}
  • ServiceImpl 类是 IService 接口的默认实现类,提供了基本的增删改查操作的实现细节。
  • 它使用了泛型参数来规范实体类和主键类型,并实现了 IService 接口中定义的方法。
  • 用户可以继承 ServiceImpl 类,并在自己的实现类中添加或重写更具体的业务逻辑。

用法:

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

二、IService用法

1、添加数据

// 插入一条记录(选择字段,策略插入)
boolean save(T entity);

// 插入(批量)
boolean saveBatch(Collection<T> entityList);

// 插入(批量,限制数量)
boolean saveBatch(Collection<T> entityList, int batchSize);

// TableId 注解存在更新记录,否则插入一条记录
boolean saveOrUpdate(T entity);

// 根据 updateWrapper 尝试更新,否则继续执行 saveOrUpdate(T) 方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);

// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);

// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

可以开启 rewriteBatchedStatements=true 参数,提高批处理的执行效率。

2、删除数据

// 根据 entity 条件,删除记录
boolean remove(Wrapper<T> queryWrapper);

// 根据 ID 删除
boolean removeById(Serializable id);

// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);

// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);

3、修改数据

// 根据 UpdateWrapper 条件更新记录,需要设置sqlset
boolean update(Wrapper<T> updateWrapper);

// 根据 whereWrapper 条件,更新记录
boolean update(T updateEntity, Wrapper<T> whereWrapper);

// 根据 ID 选择修改
boolean updateById(T entity);

// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);

// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);

4、查询数据

查询一条数据

// 根据 ID 查询
T getById(Serializable id);

// 根据 Wrapper,查询一条记录。结果集如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);

// 根据 Wrapper,查询一条记录,这个是方法返回结果不止一条则会抛出异常,如果想默认取第一条结果,可以给这方法传第二个参数为false。
T getOne(Wrapper<T> queryWrapper, boolean throwEx);

// 根据 Wrapper,查询一条记录
Map<String, Object> getMap(Wrapper<T> queryWrapper);

// 根据 Wrapper,查询一条记录
// mapper:转换函数,用于将查询结果中的每个对象转换为指定的对象类型。
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

查询多条数据

// 查询所有
List<T> list();

// 查询列表
List<T> list(Wrapper<T> queryWrapper);

// 查询(根据 ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);

// 查询(根据 columnMap 条件)
Collection<T> listByMap(Map<String, Object> columnMap);

// 查询所有列表
List<Map<String, Object>> listMaps();

// 查询列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);

// 查询全部记录
List<Object> listObjs();

// 查询全部记录
<V> List<V> listObjs(Function<? super Object, V> mapper);

// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);

// 根据 Wrapper 条件,查询全部记录
// mapper:转换函数,用于将查询结果中的每个对象转换为指定的对象类型。
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

查询记录数 count()

// 查询总记录数
int count();

// 根据 Wrapper 条件,查询总记录数
int count(Wrapper<T> queryWrapper);

分页:Page

// 无条件分页查询
IPage<T> page(IPage<T> page);

// 条件分页查询
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);

// 无条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page);

// 条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);

IPage 是MyBatis-Plus 提供的一个分页相关的接口,它有一个实现类为 Page,类中定义了分页相关的多个参数。

  • size (每页显示条数):此参数通常由前端传给我们,然后再封装到Page对象中进行分页查询;
  • current (要展示哪一页数据):此参数通常由前端传给我们,然后再封装到Page对象中进行分页查询;
  • orders(排序规则集合):按照哪些字段进行排序?可以为多个,例如希望通过时间进行排序,如果时间相同就根据用户ID降序排序,可以添加多个字段;
  • total (总记录数):指查询完毕后返回的数据库中总记录数,注意不包含已被逻辑删除的数据;
  • records(查询到的分页结果集数据):分页查询得到的多条数据会存储在 records 中,可以看出该对象是一个集合,可以传递一个泛型,泛型就是查询到的数据对应的实体泛型;
public class Page<T> implements IPage<T> {
    private static final long serialVersionUID = 8545996863226528798L;
    protected List<T> records;
    protected long total;
    protected long size;
    protected long current;
    protected List<OrderItem> orders;
    protected boolean optimizeCountSql;
    protected boolean searchCount;
    protected boolean optimizeJoinOfCountSql;
    protected String countId;
    protected Long maxLimit;
/* 以下省略 */
}

Page对象使用演示:

@SpringBootTest
public class ProductMapperTest {
    // 自动注入 productMapper 接口对应的实现类对象
    @Autowired
    private ProductMapper productMapper;
    @Test
    public void testPageQuery(){
        // 创建分页查询相关参数 page,泛型为 Product,表示查询到的结果对应的实体类为Product
        Page<Product> page = new Page<>();
        // 设置分页查询显示第二页的数据,实际开发过程中该参数有前端传递
        page.setCurrent(2);
        // 设置分页查询每页显示四条数据,实际开发过程中该参数有前端传递
        page.setSize(4);
        // 创建排序字段集合,不想排序不加即可,实际开发过程中一般都会要求按照时间降序排序
        List<OrderItem> orders = new ArrayList<>();
        // 按照价格排序,排序方式为降序,ASC为True表示升序,false表示降序,第一个参数表示数据库中的列名
        orders.add(new OrderItem("price",false));
        // 按照生产时间排序,排序方式为降序
        orders.add(new OrderItem("production_date",false));
        // 将排序对象集合加入分页查询对象Page中
        page.setOrders(orders);
        // 执行分页查询,可以创建一个Page对象接受查询结果,
        // 也可以用查询条件参数page,但其实最后结果都是同一个
        page = productMapper.selectPage(page, null);
        // 可以新创建一个Page对象,就像下面这样
        Page<Product> productPage = productMapper.selectPage(page,null);
        // 输出分页查询结果显示当前的哪一页
        System.out.println(page.getCurrent());
        // 输出分页查询结果的总数据条数
        System.out.println(page.getTotal());
        // 输出分页查询结果的数据集合
        System.out.println(page.getRecords());
        // 输出分页查询结果的每页显示条数
        System.out.println(page.getSize());
        // 判断刚才分页查询的两个结果对象是否为同一个
        System.out.println(page == productPage);
        // 输出第一个分页查询对象内存地址
        System.out.println(page);
        // 输出第二个分页查询对象内存地址
        System.out.println(productPage);
    }
}

链式

链式查询演示:

// 链式查询 普通
QueryChainWrapper<T> query();

// 链式查询 lambda 式。注意:不支持 Kotlin
LambdaQueryChainWrapper<T> lambdaQuery();

// 示例:
// eq 指定条件
query().eq("column", value).one();
lambdaQuery().eq(Entity::getId, value).list();

链式更新演示:

// 链式更改 普通
UpdateChainWrapper<T> update();

// 链式更改 lambda 式。注意:不支持 Kotlin
LambdaUpdateChainWrapper<T> lambdaUpdate();

// 示例:
// eq 指定条件
update().eq("column", value).remove();
lambdaUpdate().eq(Entity::getId, value).update(entity);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

  • Java在算法题中的输入问题实例详解

    Java在算法题中的输入问题实例详解

    在校招笔试中,有的时候我们要自己设计输入输出,所以下面这篇文章主要给大家介绍了关于Java在算法题中的输入问题,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Spring Boot中实现定时任务应用实践

    Spring Boot中实现定时任务应用实践

    定时任务一般是项目中都需要用到的,可以用于定时处理一些特殊的任务。下面这篇文章主要给大家介绍了关于Spring Boot中实现定时任务应用实践的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2018-05-05
  • Spring测试 其实很简单

    Spring测试 其实很简单

    这篇文章主要为大家详细介绍了Spring测试,其实很简单,揭开集成测试神秘的面纱,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • java时间戳转换为日期格式的多种方式

    java时间戳转换为日期格式的多种方式

    本文介绍了五种将Java时间戳转换为日期格式的方法,包括使用Date类、LocalDateTime类、Instant类、DateUtils类以及自定义时区,每种方法都有其适用场景,可以根据具体需求选择合适的方法,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • Java设计模式之建造者模式

    Java设计模式之建造者模式

    这篇文章介绍了Java设计模式之建造者模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Java编程简单应用

    Java编程简单应用

    本文主要介绍了三个简单Java小程序———1、HelloWorld(HelloWorld的来源);2、输出个人信息3、输出特殊图案。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 为了多次读取ServletInputStream引发的一系列问题

    为了多次读取ServletInputStream引发的一系列问题

    这篇文章主要介绍了为了多次读取ServletInputStream引发的一系列问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java Object转Integer实现方式

    java Object转Integer实现方式

    这篇文章主要介绍了java Object转Integer实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java中的字节流InputStream和OutputStream详解

    Java中的字节流InputStream和OutputStream详解

    这篇文章主要介绍了Java中的字节流InputStream和OutputStream详解,继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节8bit,我们看到的具体的某一些管道,凡是以InputStream结尾的管道,都是以字节的形式向我们的程序输入数据,需要的朋友可以参考下
    2023-10-10
  • 解析JavaSE的继承和多态

    解析JavaSE的继承和多态

    这篇文章主要为大家详细介绍了JavaSE的继承和多态,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03

最新评论