日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[MyBatisPlus]通用Service接口测试通用Service

發布時間:2023/12/4 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [MyBatisPlus]通用Service接口测试通用Service 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

通用Service接口

說明:

  • 通用 Service CRUD 封裝IService接口,進一步封裝 CRUD 采用 get 查詢單行 remove 刪 除 list 查詢集合 page 分頁 前綴命名方式區分 Mapper 層避免混淆,
  • 泛型 T 為任意實體對象
  • 建議如果存在自定義通用 Service 方法的可能,請創建自己的 IBaseService 繼承
    Mybatis-Plus 提供的基類
  • 官網地址:https://baomidou.com/pages/49cc81/#service-crud-%E6%8E%A5%E5%8F%
    A3

IService

/** Copyright (c) 2011-2022, baomidou (jobob@qq.com).** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/ package com.baomidou.mybatisplus.extension.service;import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.conditions.query.ChainQuery; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.ChainUpdate; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper; import com.baomidou.mybatisplus.extension.kotlin.KtQueryChainWrapper; import com.baomidou.mybatisplus.extension.kotlin.KtUpdateChainWrapper; import com.baomidou.mybatisplus.extension.toolkit.ChainWrappers; import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; import org.springframework.transaction.annotation.Transactional;import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors;/*** 頂級 Service** @author hubin* @since 2018-06-23*/ 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 批量查詢)** @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,查詢一條記錄 <br/>* <p>結果集,如果是多個會拋出異常,隨機取一條加上限制條件 wrapper.last("LIMIT 1")</p>** @param queryWrapper 實體對象封裝操作類 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}*/default T getOne(Wrapper<T> queryWrapper) {return getOne(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}*/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 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);}/*** 查詢所有** @see Wrappers#emptyWrapper()*/default List<T> list() {return list(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);}/*** 查詢所有列表** @see Wrappers#emptyWrapper()*/default List<Map<String, Object>> listMaps() {return listMaps(Wrappers.emptyWrapper());}/*** 查詢全部記錄*/default List<Object> listObjs() {return listObjs(Function.identity());}/*** 查詢全部記錄** @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 List<Object> listObjs(Wrapper<T> queryWrapper) {return listObjs(queryWrapper, Function.identity());}/*** 根據 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<T>}*/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 式* <p>注意:不支持 Kotlin </p>** @return LambdaQueryWrapper 的包裝類*/default LambdaQueryChainWrapper<T> lambdaQuery() {return ChainWrappers.lambdaQueryChain(getBaseMapper());}/*** 鏈式查詢 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 式* <p>注意:不支持 Kotlin </p>** @return LambdaUpdateWrapper 的包裝類*/default LambdaUpdateChainWrapper<T> lambdaUpdate() {return ChainWrappers.lambdaUpdateChain(getBaseMapper());}/*** <p>* 根據updateWrapper嘗試更新,否繼續執行saveOrUpdate(T)方法* 此次修改主要是減少了此項業務代碼的代碼量(存在性驗證之后的saveOrUpdate操作)* </p>** @param entity 實體對象*/default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) {return update(entity, updateWrapper) || saveOrUpdate(entity);} }

MyBatis-Plus中有一個接口 IService和其實現類 ServiceImpl,封裝了常見的業務層邏輯
詳情查看源碼IService和ServiceImpl

創建Service接口和實現類

UserService.interface

package com.xxxx.mybatisplus.service;import com.baomidou.mybatisplus.extension.service.IService; import com.xxxx.mybatisplus.pojo.User;public interface UserService extends IService<User> { }

UserServiceImpl

package com.xxxx.mybatisplus.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xxxx.mybatisplus.mapper.UserMapper; import com.xxxx.mybatisplus.pojo.User; import com.xxxx.mybatisplus.service.UserService; import org.springframework.stereotype.Service;@Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}

測試通過Service

查詢總記錄數

package com.xxxx.mybatisplus;import com.xxxx.mybatisplus.service.UserService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest public class MyBatisPlusServiceTest {@Autowiredprivate UserService userService;/*** 查詢總記錄數* SELECT COUNT( * ) FROM user*/@Testpublic void testGetCount(){long count = userService.count();System.out.println("總記錄數 = "+count);}}

批量添加功能

@Testpublic void testInsertMore(){List<User> list = new ArrayList<>();for (int i = 1;i<=10;i++){User user = new User();user.setName("ybc"+i);user.setAge(20+i);list.add(user);}boolean b = userService.saveBatch(list);System.out.println(b);}


總結

以上是生活随笔為你收集整理的[MyBatisPlus]通用Service接口测试通用Service的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。