MyBatisPlus通用方法测试

1、MyBatisPlus的基本使用方式

  • Mapper层
    继承MyBatisPlus提供的BaseMapper即可。
@Repository
public interface UserMapper extends BaseMapper<User> {
}
  • Service层
    接口继承IService,实现类继承ServiceImpl即可。
public interface UserService extends IService<User> {
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
}

在BaseMapper和和IService两个接口中都提供了大量的通用方法。
BaseMapper中提供的方法如下:

public interface BaseMapper<T> extends Mapper<T> {

    /**
     * 插入一条记录
     *
     * @param entity 实体对象
     */
    int insert(T entity);

    /**
     * 根据 ID 删除
     *
     * @param id 主键ID
     */
    int deleteById(Serializable id);

    /**
     * 根据实体(ID)删除
     *
     * @param entity 实体对象
     * @since 3.4.4
     */
    int deleteById(T entity);

    /**
     * 根据 columnMap 条件,删除记录
     *
     * @param columnMap 表字段 map 对象
     */
    default int deleteByMap(Map<String, Object> columnMap) {
        QueryWrapper<T> qw = Wrappers.query();
        return this.delete(qw.allEq(columnMap));
    }

    /**
     * 根据 entity 条件,删除记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
     */
    int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 删除(根据ID或实体 批量删除)
     *
     * @param idList 主键ID列表或实体列表(不能为 null 以及 empty)
     */
    int deleteBatchIds(@Param(Constants.COLL) Collection<?> idList);

    /**
     * 根据 ID 修改
     *
     * @param entity 实体对象
     */
    int updateById(@Param(Constants.ENTITY) T entity);

    /**
     * 根据 whereEntity 条件,更新记录
     *
     * @param entity        实体对象 (set 条件值,可以为 null)
     * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
     */
    int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);

    /**
     * 根据 Wrapper 更新记录
     *
     * @param updateWrapper {@link UpdateWrapper} or {@link LambdaUpdateWrapper}
     * @since 3.5.4
     */
    default int update(@Param(Constants.WRAPPER) Wrapper<T> updateWrapper) {
        return update(null, updateWrapper);
    }

    /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     */
    T selectById(Serializable id);

    /**
     * 查询(根据ID 批量查询)
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     */
    List<T> selectBatchIds(@Param(Constants.COLL) Collection<? extends Serializable> idList);

    /**
     * 查询(根据ID 批量查询)
     *
     * @param idList        idList 主键ID列表(不能为 null 以及 empty)
     * @param resultHandler resultHandler 结果处理器 {@link ResultHandler}
     * @since 3.5.4
     */
    void selectBatchIds(@Param(Constants.COLL) Collection<? extends Serializable> idList, ResultHandler<T> resultHandler);

    /**
     * 查询(根据 columnMap 条件)
     *
     * @param columnMap 表字段 map 对象
     */
    default List<T> selectByMap(Map<String, Object> columnMap) {
        QueryWrapper<T> qw = Wrappers.query();
        return this.selectList(qw.allEq(columnMap));
    }

    /**
     * 查询(根据 columnMap 条件)
     *
     * @param columnMap     表字段 map 对象
     * @param resultHandler resultHandler 结果处理器 {@link ResultHandler}
     * @since 3.5.4
     */
    default void selectByMap(Map<String, Object> columnMap, ResultHandler<T> resultHandler) {
        this.selectList(Wrappers.<T>query().allEq(columnMap), resultHandler);
    }

    /**
     * 根据 entity 条件,查询一条记录
     * 

查询一条记录,例如 qw.last("limit 1") 限制取一条记录, 注意:多条数据会报异常

* * @param queryWrapper 实体对象封装操作类(可以为 null) */
default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) { return this.selectOne(queryWrapper, true); } /** * 根据 entity 条件,查询一条记录,现在会根据{@code throwEx}参数判断是否抛出异常,如果为false就直接返回一条数据 *

查询一条记录,例如 qw.last("limit 1") 限制取一条记录, 注意:多条数据会报异常

* * @param queryWrapper 实体对象封装操作类(可以为 null) * @param throwEx boolean 参数,为true如果存在多个结果直接抛出异常 */
default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper, boolean throwEx) { List<T> list = new ArrayList<>(); //TODO 后期配合Page参数可以做数据库分页,下面的换成RowBounds做限制结果集也行 this.selectList(queryWrapper, resultContext -> { T resultObject = resultContext.getResultObject(); list.add(resultObject); if (!throwEx || resultContext.getResultCount() > 1) { resultContext.stop(); } }); int size = list.size(); if (size == 1) { return list.get(0); } else if (size > 1) { if (throwEx) { throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found multiple records"); } return list.get(0); } return null; } /** * 根据 Wrapper 条件,判断是否存在记录 * * @param queryWrapper 实体对象封装操作类 * @return 是否存在记录 */ default boolean exists(Wrapper<T> queryWrapper) { Long count = this.selectCount(queryWrapper); return null != count && count > 0; } /** * 根据 Wrapper 条件,查询总记录数 * * @param queryWrapper 实体对象封装操作类(可以为 null) */ Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根据 entity 条件,查询全部记录 * * @param queryWrapper 实体对象封装操作类(可以为 null) */ List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根据 entity 条件,查询全部记录 * * @param queryWrapper 实体对象封装操作类(可以为 null) * @param resultHandler 结果处理器 {@link ResultHandler} * @since 3.5.4 */ void selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper, ResultHandler<T> resultHandler); /** * 根据 entity 条件,查询全部记录(并翻页) * * @param page 分页查询条件 * @param queryWrapper 实体对象封装操作类(可以为 null) * @since 3.5.3.2 */ List<T> selectList(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根据 entity 条件,查询全部记录(并翻页) * @param page 分页查询条件 * @param queryWrapper 实体对象封装操作类(可以为 null) * @param resultHandler 结果处理器 {@link ResultHandler} * @since 3.5.4 */ void selectList(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper, ResultHandler<T> resultHandler); /** * 根据 Wrapper 条件,查询全部记录 * * @param queryWrapper 实体对象封装操作类 */ List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根据 Wrapper 条件,查询全部记录 * * @param queryWrapper 实体对象封装操作类 * @param resultHandler 结果处理器 {@link ResultHandler} * @since 3.5.4 */ void selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper, ResultHandler<Map<String, Object>> resultHandler); /** * 根据 Wrapper 条件,查询全部记录(并翻页) * * @param page 分页查询条件 * @param queryWrapper 实体对象封装操作类 * @since 3.5.3.2 */ List<Map<String, Object>> selectMaps(IPage<? extends Map<String, Object>> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根据 Wrapper 条件,查询全部记录(并翻页) * * @param page 分页查询条件 * @param queryWrapper 实体对象封装操作类 * @param resultHandler 结果处理器 {@link ResultHandler} * @since 3.5.4 */ void selectMaps(IPage<? extends Map<String, Object>> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper, ResultHandler<Map<String, Object>> resultHandler); /** * 根据 Wrapper 条件,查询全部记录 *

注意: 只返回第一个字段的值

* * @param queryWrapper 实体对象封装操作类(可以为 null) */
<E> List<E> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根据 Wrapper 条件,查询全部记录 *

注意: 只返回第一个字段的值

* * @param queryWrapper 实体对象封装操作类(可以为 null) * @param resultHandler 结果处理器 {@link ResultHandler} * @since 3.5.4 */
<E> void selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper, ResultHandler<E> resultHandler); /** * 根据 entity 条件,查询全部记录(并翻页) * * @param page 分页查询条件 * @param queryWrapper 实体对象封装操作类(可以为 null) */ default <P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper) { List<T> list = selectList(page, queryWrapper); page.setRecords(list); return page; } /** * 根据 Wrapper 条件,查询全部记录(并翻页) * * @param page 分页查询条件 * @param queryWrapper 实体对象封装操作类 */ default <P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper) { List<Map<String, Object>> list = selectMaps(page, queryWrapper); page.setRecords(list); return page; } }

IService中提供的方法如下:

public interface IService<T> {

    /**
     * 默认批次提交数量
     */
    int DEFAULT_BATCH_SIZE = 1000;

    /**
     * 插入一条记录(选择字段,策略插入)
     *
     * @param entity 实体对象
     */
    default boolean save(T entity) {
        return SqlHelper.retBool(getBaseMapper().insert(entity));
    }

    /**
     * 插入(批量)
     *
     * @param entityList 实体对象集合
     */
    @Transactional(rollbackFor = Exception.class)
    default boolean saveBatch(Collection<T> entityList) {
        return saveBatch(entityList, DEFAULT_BATCH_SIZE);
    }

    /**
     * 插入(批量)
     *
     * @param entityList 实体对象集合
     * @param batchSize  插入批次数量
     */
    boolean saveBatch(Collection<T> entityList, int batchSize);

    /**
     * 批量修改插入
     *
     * @param entityList 实体对象集合
     */
    @Transactional(rollbackFor = Exception.class)
    default boolean saveOrUpdateBatch(Collection<T> entityList) {
        return saveOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE);
    }

    /**
     * 批量修改插入
     *
     * @param entityList 实体对象集合
     * @param batchSize  每次的数量
     */
    boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

    /**
     * 根据 ID 删除
     *
     * @param id 主键ID
     */
    default boolean removeById(Serializable id) {
        return SqlHelper.retBool(getBaseMapper().deleteById(id));
    }

    /**
     * 根据 ID 删除
     *
     * @param id      主键(类型必须与实体类型字段保持一致)
     * @param useFill 是否启用填充(为true的情况,会将入参转换实体进行delete删除)
     * @return 删除结果
     * @since 3.5.0
     */
    default boolean removeById(Serializable id, boolean useFill) {
        throw new UnsupportedOperationException("不支持的方法!");
    }

    /**
     * 根据实体(ID)删除
     *
     * @param entity 实体
     * @since 3.4.4
     */
    default boolean removeById(T entity) {
        return SqlHelper.retBool(getBaseMapper().deleteById(entity));
    }

    /**
     * 根据 columnMap 条件,删除记录
     *
     * @param columnMap 表字段 map 对象
     */
    default boolean removeByMap(Map<String, Object> columnMap) {
        Assert.notEmpty(columnMap, "error: columnMap must not be empty");
        return SqlHelper.retBool(getBaseMapper().deleteByMap(columnMap));
    }

    /**
     * 根据 entity 条件,删除记录
     *
     * @param queryWrapper 实体包装类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    default boolean remove(Wrapper<T> queryWrapper) {
        return SqlHelper.retBool(getBaseMapper().delete(queryWrapper));
    }

    /**
     * 删除(根据ID 批量删除)
     *
     * @param list 主键ID或实体列表
     */
    default boolean removeByIds(Collection<?> list) {
        if (CollectionUtils.isEmpty(list)) {
            return false;
        }
        return SqlHelper.retBool(getBaseMapper().deleteBatchIds(list));
    }

    /**
     * 批量删除
     *
     * @param list    主键ID或实体列表
     * @param useFill 是否填充(为true的情况,会将入参转换实体进行delete删除)
     * @return 删除结果
     * @since 3.5.0
     */
    @Transactional(rollbackFor = Exception.class)
    default boolean removeByIds(Collection<?> list, boolean useFill) {
        if (CollectionUtils.isEmpty(list)) {
            return false;
        }
        if (useFill) {
            return removeBatchByIds(list, true);
        }
        return SqlHelper.retBool(getBaseMapper().deleteBatchIds(list));
    }

    /**
     * 批量删除(jdbc批量提交)
     *
     * @param list 主键ID或实体列表(主键ID类型必须与实体类型字段保持一致)
     * @return 删除结果
     * @since 3.5.0
     */
    @Transactional(rollbackFor = Exception.class)
    default boolean removeBatchByIds(Collection<?> list) {
        return removeBatchByIds(list, DEFAULT_BATCH_SIZE);
    }

    /**
     * 批量删除(jdbc批量提交)
     *
     * @param list    主键ID或实体列表(主键ID类型必须与实体类型字段保持一致)
     * @param useFill 是否启用填充(为true的情况,会将入参转换实体进行delete删除)
     * @return 删除结果
     * @since 3.5.0
     */
    @Transactional(rollbackFor = Exception.class)
    default boolean removeBatchByIds(Collection<?> list, boolean useFill) {
        return removeBatchByIds(list, DEFAULT_BATCH_SIZE, useFill);
    }

    /**
     * 批量删除(jdbc批量提交)
     *
     * @param list      主键ID或实体列表
     * @param batchSize 批次大小
     * @return 删除结果
     * @since 3.5.0
     */
    default boolean removeBatchByIds(Collection<?> list, int batchSize) {
        throw new UnsupportedOperationException("不支持的方法!");
    }

    /**
     * 批量删除(jdbc批量提交)
     *
     * @param list      主键ID或实体列表
     * @param batchSize 批次大小
     * @param useFill   是否启用填充(为true的情况,会将入参转换实体进行delete删除)
     * @return 删除结果
     * @since 3.5.0
     */
    default boolean removeBatchByIds(Collection<?> list, int batchSize, boolean useFill) {
        throw new UnsupportedOperationException("不支持的方法!");
    }

    /**
     * 根据 ID 选择修改
     *
     * @param entity 实体对象
     */
    default boolean updateById(T entity) {
        return SqlHelper.retBool(getBaseMapper().updateById(entity));
    }

    /**
     * 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
     *
     * @param updateWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}
     */
    default boolean update(Wrapper<T> updateWrapper) {
        return update(null, updateWrapper);
    }

    /**
     * 根据 whereEntity 条件,更新记录
     *
     * @param entity        实体对象
     * @param updateWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}
     */
    default boolean update(T entity, Wrapper<T> updateWrapper) {
        return SqlHelper.retBool(getBaseMapper().update(entity, updateWrapper));
    }

    /**
     * 根据ID 批量更新
     *
     * @param entityList 实体对象集合
     */
    @Transactional(rollbackFor = Exception.class)
    default boolean updateBatchById(Collection<T> entityList) {
        return updateBatchById(entityList, DEFAULT_BATCH_SIZE);
    }

    /**
     * 根据ID 批量更新
     *
     * @param entityList 实体对象集合
     * @param batchSize  更新批次数量
     */
    boolean updateBatchById(Collection<T> entityList, int batchSize);

    /**
     * TableId 注解存在更新记录,否插入一条记录
     *
     * @param entity 实体对象
     */
    boolean saveOrUpdate(T entity);

    /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     */
    default T getById(Serializable id) {
        return getBaseMapper().selectById(id);
    }

    /**
     * 根据 ID 查询,返回一个Option对象
     *
     * @param id 主键ID
     * @return {@link Optional}
     */
    default Optional<T> getOptById(Serializable id) {
        return Optional.ofNullable(getBaseMapper().selectById(id));
    }

    /**
     * 查询(根据ID 批量查询)
     *
     * @param idList 主键ID列表
     */
    default List<T> listByIds(Collection<? extends Serializable> idList) {
        return getBaseMapper().selectBatchIds(idList);
    }

    /**
     * 查询(根据 columnMap 条件)
     *
     * @param columnMap 表字段 map 对象
     */
    default List<T> listByMap(Map<String, Object> columnMap) {
        return getBaseMapper().selectByMap(columnMap);
    }

    /**
     * 根据 Wrapper,查询一条记录 
*

结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

* * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */
default T getOne(Wrapper<T> queryWrapper) { return getOne(queryWrapper, true); } /** * 根据 Wrapper,查询一条记录
*

结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

* * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} * @return {@link Optional} 返回一个Optional对象 */
default Optional<T> getOneOpt(Wrapper<T> queryWrapper) { return getOneOpt(queryWrapper, true); } /** * 根据 Wrapper,查询一条记录 * * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} * @param throwEx 有多个 result 是否抛出异常 */ T getOne(Wrapper<T> queryWrapper, boolean throwEx); /** * 根据 Wrapper,查询一条记录 * * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} * @param throwEx 有多个 result 是否抛出异常 * @return {@link Optional} 返回一个Optional对象 */ Optional<T> getOneOpt(Wrapper<T> queryWrapper, boolean throwEx); /** * 根据 Wrapper,查询一条记录 * * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */ Map<String, Object> getMap(Wrapper<T> queryWrapper); /** * 根据 Wrapper,查询一条记录 * * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} * @param mapper 转换函数 */ <V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper); /** * 查询指定条件是否存在数据 * * @see Wrappers#emptyWrapper() */ default boolean exists(Wrapper<T> queryWrapper) { return getBaseMapper().exists(queryWrapper); } /** * 查询总记录数 * * @see Wrappers#emptyWrapper() */ default long count() { return count(Wrappers.emptyWrapper()); } /** * 根据 Wrapper 条件,查询总记录数 * * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */ default long count(Wrapper<T> queryWrapper) { return SqlHelper.retCount(getBaseMapper().selectCount(queryWrapper)); } /** * 查询列表 * * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */ default List<T> list(Wrapper<T> queryWrapper) { return getBaseMapper().selectList(queryWrapper); } /** * 查询列表 * * @param page 分页条件 * @param queryWrapper queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} * @return 列表数据 * @since 3.5.3.2 */ default List<T> list(IPage<T> page, Wrapper<T> queryWrapper) { return getBaseMapper().selectList(page, queryWrapper); } /** * 查询所有 * * @see Wrappers#emptyWrapper() */ default List<T> list() { return list(Wrappers.emptyWrapper()); } /** * 分页查询单表数据 * * @param page 分页条件 * @return 列表数据 * @since 3.5.3.2 */ default List<T> list(IPage<T> page) { return list(page, Wrappers.emptyWrapper()); } /** * 翻页查询 * * @param page 翻页对象 * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */ default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper) { return getBaseMapper().selectPage(page, queryWrapper); } /** * 无条件翻页查询 * * @param page 翻页对象 * @see Wrappers#emptyWrapper() */ default <E extends IPage<T>> E page(E page) { return page(page, Wrappers.emptyWrapper()); } /** * 查询列表 * * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */ default List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper) { return getBaseMapper().selectMaps(queryWrapper); } /** * 查询列表 * * @param page 分页条件 * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} * @return 列表数据 * @since 3.5.3.2 */ default List<Map<String, Object>> listMaps(IPage<? extends Map<String, Object>> page, Wrapper<T> queryWrapper) { return getBaseMapper().selectMaps(page, queryWrapper); } /** * 查询所有列表 * * @see Wrappers#emptyWrapper() */ default List<Map<String, Object>> listMaps() { return listMaps(Wrappers.emptyWrapper()); } /** * 查询列表 * * @param page 分页条件 * @see Wrappers#emptyWrapper() */ default List<Map<String, Object>> listMaps(IPage<? extends Map<String, Object>> page) { return listMaps(page, Wrappers.emptyWrapper()); } /** * 查询全部记录 */ default <E> List<E> listObjs() { return getBaseMapper().selectObjs(null); } /** * 查询全部记录 * * @param mapper 转换函数 */ default <V> List<V> listObjs(Function<? super Object, V> mapper) { return listObjs(Wrappers.emptyWrapper(), mapper); } /** * 根据 Wrapper 条件,查询全部记录 * * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */ default <E> List<E> listObjs(Wrapper<T> queryWrapper) { return getBaseMapper().selectObjs(queryWrapper); } /** * 根据 Wrapper 条件,查询全部记录 * * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} * @param mapper 转换函数 */ default <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) { return getBaseMapper().selectObjs(queryWrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList()); } /** * 翻页查询 * * @param page 翻页对象 * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */ default <E extends IPage<Map<String, Object>>> E pageMaps(E page, Wrapper<T> queryWrapper) { return getBaseMapper().selectMapsPage(page, queryWrapper); } /** * 无条件翻页查询 * * @param page 翻页对象 * @see Wrappers#emptyWrapper() */ default <E extends IPage<Map<String, Object>>> E pageMaps(E page) { return pageMaps(page, Wrappers.emptyWrapper()); } /** * 获取对应 entity 的 BaseMapper * * @return BaseMapper */ BaseMapper<T> getBaseMapper(); /** * 获取 entity 的 class * * @return {@link Class} */ Class<T> getEntityClass(); /** * 以下的方法使用介绍: * * 一. 名称介绍 * 1. 方法名带有 query 的为对数据的查询操作, 方法名带有 update 的为对数据的修改操作 * 2. 方法名带有 lambda 的为内部方法入参 column 支持函数式的 * 二. 支持介绍 * * 1. 方法名带有 query 的支持以 {@link ChainQuery} 内部的方法名结尾进行数据查询操作 * 2. 方法名带有 update 的支持以 {@link ChainUpdate} 内部的方法名为结尾进行数据修改操作 * * 三. 使用示例,只用不带 lambda 的方法各展示一个例子,其他类推 * 1. 根据条件获取一条数据: `query().eq("column", value).one()` * 2. 根据条件删除一条数据: `update().eq("column", value).remove()` * */ /** * 链式查询 普通 * * @return QueryWrapper 的包装类 */ default QueryChainWrapper<T> query() { return ChainWrappers.queryChain(getBaseMapper()); } /** * 链式查询 lambda 式 *

注意:不支持 Kotlin

* * @return LambdaQueryWrapper 的包装类 */
default LambdaQueryChainWrapper<T> lambdaQuery() { return ChainWrappers.lambdaQueryChain(getBaseMapper(), getEntityClass()); } /** * 链式查询 lambda 式 *

注意:不支持 Kotlin

* * @param entity 实体对象 * @return LambdaQueryWrapper 的包装类 */
default LambdaQueryChainWrapper<T> lambdaQuery(T entity) { return ChainWrappers.lambdaQueryChain(getBaseMapper(), entity); } /** * 链式查询 lambda 式 * kotlin 使用 * * @return KtQueryWrapper 的包装类 */ default KtQueryChainWrapper<T> ktQuery() { return ChainWrappers.ktQueryChain(getBaseMapper(), getEntityClass()); } /** * 链式查询 lambda 式 * kotlin 使用 * * @return KtQueryWrapper 的包装类 */ default KtUpdateChainWrapper<T> ktUpdate() { return ChainWrappers.ktUpdateChain(getBaseMapper(), getEntityClass()); } /** * 链式更改 普通 * * @return UpdateWrapper 的包装类 */ default UpdateChainWrapper<T> update() { return ChainWrappers.updateChain(getBaseMapper()); } /** * 链式更改 lambda 式 *

注意:不支持 Kotlin

* * @return LambdaUpdateWrapper 的包装类 */
default LambdaUpdateChainWrapper<T> lambdaUpdate() { return ChainWrappers.lambdaUpdateChain(getBaseMapper()); } /** *

* 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法 * 此次修改主要是减少了此项业务代码的代码量(存在性验证之后的saveOrUpdate操作) *

*

* 该方法不推荐在多线程并发下使用,并发可能存在间隙锁的问题,可以采用先查询后判断是否更新或保存。 *

*

* 该方法存在安全隐患将在后续大版本删除 *

* * @param entity 实体对象 */
@Deprecated default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) { return update(entity, updateWrapper) || saveOrUpdate(entity); } }

2 方法测试

2.1 BaseMapper
import com.giser.mybatisplus.mapper.UserMapper;
import com.giser.mybatisplus.pojo.User;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author giserDev
 * @description
 * @date 2023-12-11 21:04:32
 */
@SpringBootTest
@Slf4j
class BaseMapperTest {

    @Resource
    private UserMapper userMapper;

    /**
     * ==>  Preparing: SELECT id,name,age,email FROM user
     * ==> Parameters:
     * <==    Columns: id, name, age, email
     * <==        Row: 1, Jone, 18, [email protected]
     * <==        Row: 2, Jack, 20, [email protected]
     * <==        Row: 3, Tom, 28, [email protected]
     * <==        Row: 4, Sandy, 21, [email protected]
     * <==        Row: 5, Billie, 24, [email protected]
     * <==        Row: 1734200785845157889, kitty, 100, [email protected]
     * <==      Total: 6
     */
    @Test
    void testQueryAll(){
        List<User> userList = userMapper.selectList(null);
        log.info("查询集合信息{}", userList);
    }

    /**
     * ==>  Preparing: SELECT id,name,age,email FROM user WHERE id=?
     * ==> Parameters: 1734200785845157889(Long)
     * <==    Columns: id, name, age, email
     * <==        Row: 1734200785845157889, kitty, 100, [email protected]
     * <==      Total: 1
     */
    @Test
    void testQueryById(){
        User user = userMapper.selectById(1734200785845157889L);
        log.info("查询到的用户信息为{}", user);
    }

    /**
     * ==>  Preparing: SELECT id,name,age,email FROM user WHERE id IN ( ? , ? , ? )
     * ==> Parameters: 1(Integer), 2(Integer), 3(Integer)
     * <==    Columns: id, name, age, email
     * <==        Row: 1, Jone, 18, [email protected]
     * <==        Row: 2, Jack, 20, [email protected]
     * <==        Row: 3, Tom, 28, [email protected]
     * <==      Total: 3
     */
    @Test
    void testQueryByIdList(){
        List<User> userList = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        log.info("查询到的指定ID的用户信息为{}", userList);
    }

    /**
     * ==>  Preparing: SELECT id,name,age,email FROM user WHERE (name = ? AND age = ?)
     * ==> Parameters: Jack(String), 20(Integer)
     * <==    Columns: id, name, age, email
     * <==        Row: 2, Jack, 20, [email protected]
     * <==      Total: 1
     */
    @Test
    void testQueryByMap(){
        Map<String,Object> map = new HashMap<>();
        map.put("name", "Jack");
        map.put("age", 20);
        List<User> userList = userMapper.selectByMap(map);
        log.info("查询到的用户信息为{}", userList);
    }

    /**
     * ==>  Preparing: INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
     * ==> Parameters: 1734201345373761537(Long), 李雷(String), 12(Integer), [email protected](String)
     * <==    Updates: 1
     */
    @Test
    void testInsert(){
        User user = new User();
        user.setAge(12);
        user.setName("李雷");
        user.setEmail("[email protected]");
        int insert = userMapper.insert(user);
        log.info("新增结果为{}", insert);
    }

    /**
     * ==>  Preparing: DELETE FROM user WHERE id=?
     * ==> Parameters: 1734201345373761537(Long)
     * <==    Updates: 1
     */
    @Test
    void testDeleteById(){
        int deleteResult = userMapper.deleteById(1734201345373761537L);
        log.info("删除结果为{}", deleteResult);
    }

    /**
     * ==>  Preparing: DELETE FROM user WHERE id IN ( ? , ? )
     * ==> Parameters: 4(Integer), 5(Integer)
     * <==    Updates: 2
     */
    @Test
    void testDeleteByIds(){
        int result = userMapper.deleteBatchIds(Arrays.asList(4, 5));
        log.info("删除条数{}",  result);
    }

    /**
     * ==>  Preparing: DELETE FROM user WHERE (name = ? AND age = ?)
     * ==> Parameters: Tom(String), 35(Integer)
     * <==    Updates: 0
     */
    @Test
    void testDeleteByMap(){
        Map<String, Object> map = new HashMap<>();
        map.put("name", "Tom");
        map.put("age", 35);
        int deleteResult = userMapper.deleteByMap(map);
        log.info("删除条数{}", deleteResult);
    }

    /**
     * ==>  Preparing: UPDATE user SET name=?, age=?, email=? WHERE id=?
     * ==> Parameters: kitty(String), 100(Integer), [email protected](String), 1734200785845157889(Long)
     * <==    Updates: 1
     */
    @Test
    void testUpdateById(){
        User user = new User();
        user.setId(1734200785845157889L);
        user.setName("kitty");
        user.setAge(100);
        user.setEmail("[email protected]");
        int updateResult = userMapper.updateById(user);
        log.info("更新结果为{}", updateResult);
    }

}
2.2 BaseMapper
import com.giser.mybatisplus.pojo.User;
import com.giser.mybatisplus.service.UserService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.Assert;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;

/**
 * @author giserDev
 * @description
 * @date 2023-12-11 21:37:53
 */
@SpringBootTest
@Slf4j
class BaseServiceTest {

    @Resource
    private UserService userService;

    /**
     * ==>  Preparing: SELECT COUNT( * ) AS total FROM user
     * ==> Parameters:
     * <==    Columns: total
     * <==        Row: 4
     * <==      Total: 1
     */
    @Test
    void testCount(){
        long count = userService.count();
        log.info("总条数统计:{}", count);
    }

    /**
     * ==>  Preparing: INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
     * ==> Parameters: 1734234798978789377(Long), giserDev0(String), 20(Integer), [email protected](String)
     * ==> Parameters: 1734234799536631809(Long), giserDev1(String), 21(Integer), [email protected](String)
     * ==> Parameters: 1734234799536631810(Long), giserDev2(String), 22(Integer), [email protected](String)
     * ==> Parameters: 1734234799536631811(Long), giserDev3(String), 23(Integer), [email protected](String)
     * ==> Parameters: 1734234799536631812(Long), giserDev4(String), 24(Integer), [email protected](String)
     * ==> Parameters: 1734234799536631813(Long), giserDev5(String), 25(Integer), [email protected](String)
     * ==> Parameters: 1734234799536631814(Long), giserDev6(String), 26(Integer), [email protected](String)
     * ==> Parameters: 1734234799536631815(Long), giserDev7(String), 27(Integer), [email protected](String)
     * ==> Parameters: 1734234799599546369(Long), giserDev8(String), 28(Integer), [email protected](String)
     * ==> Parameters: 1734234799599546370(Long), giserDev9(String), 29(Integer), [email protected](String)
     */
    @Test
    void testSaveBatch(){
        List<User> userList = new ArrayList<>();
        Assert.notNull(userList, "集合不可为空");
        IntStream.range(0,10).forEach(index -> {
            User user = new User();
            user.setAge(20 + index);
            user.setName("giserDev"+index);
            user.setEmail("giserDev"+index+"@giser.com");
            userList.add(user);
        });
        Assert.notEmpty(userList, "添加的数据不可为空");
        userService.saveBatch(userList);
    }
}

你可能感兴趣的:(#,MyBatisPlus,mybatisplus)