最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MybatisPlus IService接口功能介紹

 更新時(shí)間:2024年09月22日 09:41:25   作者:游王子og  
MybatisPlus中的IService接口為開(kāi)發(fā)者提供了一系列基礎(chǔ)數(shù)據(jù)庫(kù)操作方法,如增刪改查等,通過(guò)泛型支持不同類(lèi)型的實(shí)體和主鍵,IService的默認(rèn)實(shí)現(xiàn)類(lèi)為ServiceImpl,它實(shí)現(xiàn)了接口中的基本方法,用戶(hù)可通過(guò)繼承ServiceImpl來(lái)擴(kuò)展自定義的業(yè)務(wù)邏輯

一、介紹

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

作為一個(gè)通用的服務(wù)接口,IService定義了一系列方法,包括查詢(xún)、插入、更新、刪除等。

這些方法的定義使得在服務(wù)層進(jìn)行數(shù)據(jù)庫(kù)操作變得更為便捷和高效。

  • IService 接口是一個(gè)泛型接口,定義了一組通用的基礎(chǔ)方法,包括常見(jiàn)的增刪改查操作。
  • 例如,它提供了插入數(shù)據(jù)、根據(jù)主鍵更新數(shù)據(jù)、根據(jù)主鍵刪除數(shù)據(jù)、根據(jù)主鍵查詢(xún)數(shù)據(jù)等方法的簽名。
  • 用戶(hù)可以根據(jù)自己的需求和業(yè)務(wù)邏輯在自定義的服務(wù)接口中繼承 IService 接口,并實(shí)現(xiàn)其中的方法。

用法:

 public interface UserService extends IService<User> {}
  • ServiceImpl 類(lèi)是 IService 接口的默認(rèn)實(shí)現(xiàn)類(lèi),提供了基本的增刪改查操作的實(shí)現(xiàn)細(xì)節(jié)。
  • 它使用了泛型參數(shù)來(lái)規(guī)范實(shí)體類(lèi)和主鍵類(lèi)型,并實(shí)現(xiàn)了 IService 接口中定義的方法。
  • 用戶(hù)可以繼承 ServiceImpl 類(lèi),并在自己的實(shí)現(xiàn)類(lèi)中添加或重寫(xiě)更具體的業(yè)務(wù)邏輯。

用法:

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

二、IService用法

1、添加數(shù)據(jù)

// 插入一條記錄(選擇字段,策略插入)
boolean save(T entity);

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

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

// TableId 注解存在更新記錄,否則插入一條記錄
boolean saveOrUpdate(T entity);

// 根據(jù) updateWrapper 嘗試更新,否則繼續(xù)執(zhí)行 saveOrUpdate(T) 方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);

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

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

可以開(kāi)啟 rewriteBatchedStatements=true 參數(shù),提高批處理的執(zhí)行效率。

2、刪除數(shù)據(jù)

// 根據(jù) entity 條件,刪除記錄
boolean remove(Wrapper<T> queryWrapper);

// 根據(jù) ID 刪除
boolean removeById(Serializable id);

// 根據(jù) columnMap 條件,刪除記錄
boolean removeByMap(Map<String, Object> columnMap);

// 刪除(根據(jù)ID 批量刪除)
boolean removeByIds(Collection<? extends Serializable> idList);

3、修改數(shù)據(jù)

// 根據(jù) UpdateWrapper 條件更新記錄,需要設(shè)置sqlset
boolean update(Wrapper<T> updateWrapper);

// 根據(jù) whereWrapper 條件,更新記錄
boolean update(T updateEntity, Wrapper<T> whereWrapper);

// 根據(jù) ID 選擇修改
boolean updateById(T entity);

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

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

4、查詢(xún)數(shù)據(jù)

查詢(xún)一條數(shù)據(jù)

// 根據(jù) ID 查詢(xún)
T getById(Serializable id);

// 根據(jù) Wrapper,查詢(xún)一條記錄。結(jié)果集如果是多個(gè)會(huì)拋出異常,隨機(jī)取一條加上限制條件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);

// 根據(jù) Wrapper,查詢(xún)一條記錄,這個(gè)是方法返回結(jié)果不止一條則會(huì)拋出異常,如果想默認(rèn)取第一條結(jié)果,可以給這方法傳第二個(gè)參數(shù)為false。
T getOne(Wrapper<T> queryWrapper, boolean throwEx);

// 根據(jù) Wrapper,查詢(xún)一條記錄
Map<String, Object> getMap(Wrapper<T> queryWrapper);

// 根據(jù) Wrapper,查詢(xún)一條記錄
// mapper:轉(zhuǎn)換函數(shù),用于將查詢(xún)結(jié)果中的每個(gè)對(duì)象轉(zhuǎn)換為指定的對(duì)象類(lèi)型。
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

查詢(xún)多條數(shù)據(jù)

// 查詢(xún)所有
List<T> list();

// 查詢(xún)列表
List<T> list(Wrapper<T> queryWrapper);

// 查詢(xún)(根據(jù) ID 批量查詢(xún))
Collection<T> listByIds(Collection<? extends Serializable> idList);

// 查詢(xún)(根據(jù) columnMap 條件)
Collection<T> listByMap(Map<String, Object> columnMap);

// 查詢(xún)所有列表
List<Map<String, Object>> listMaps();

// 查詢(xún)列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);

// 查詢(xún)?nèi)坑涗?
List<Object> listObjs();

// 查詢(xún)?nèi)坑涗?
<V> List<V> listObjs(Function<? super Object, V> mapper);

// 根據(jù) Wrapper 條件,查詢(xún)?nèi)坑涗?
List<Object> listObjs(Wrapper<T> queryWrapper);

// 根據(jù) Wrapper 條件,查詢(xún)?nèi)坑涗?
// mapper:轉(zhuǎn)換函數(shù),用于將查詢(xún)結(jié)果中的每個(gè)對(duì)象轉(zhuǎn)換為指定的對(duì)象類(lèi)型。
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

查詢(xún)記錄數(shù) count()

// 查詢(xún)總記錄數(shù)
int count();

// 根據(jù) Wrapper 條件,查詢(xún)總記錄數(shù)
int count(Wrapper<T> queryWrapper);

分頁(yè):Page

// 無(wú)條件分頁(yè)查詢(xún)
IPage<T> page(IPage<T> page);

// 條件分頁(yè)查詢(xún)
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);

// 無(wú)條件分頁(yè)查詢(xún)
IPage<Map<String, Object>> pageMaps(IPage<T> page);

// 條件分頁(yè)查詢(xún)
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);

IPage 是MyBatis-Plus 提供的一個(gè)分頁(yè)相關(guān)的接口,它有一個(gè)實(shí)現(xiàn)類(lèi)為 Page,類(lèi)中定義了分頁(yè)相關(guān)的多個(gè)參數(shù)。

  • size (每頁(yè)顯示條數(shù)):此參數(shù)通常由前端傳給我們,然后再封裝到Page對(duì)象中進(jìn)行分頁(yè)查詢(xún);
  • current (要展示哪一頁(yè)數(shù)據(jù)):此參數(shù)通常由前端傳給我們,然后再封裝到Page對(duì)象中進(jìn)行分頁(yè)查詢(xún);
  • orders(排序規(guī)則集合):按照哪些字段進(jìn)行排序?可以為多個(gè),例如希望通過(guò)時(shí)間進(jìn)行排序,如果時(shí)間相同就根據(jù)用戶(hù)ID降序排序,可以添加多個(gè)字段;
  • total (總記錄數(shù)):指查詢(xún)完畢后返回的數(shù)據(jù)庫(kù)中總記錄數(shù),注意不包含已被邏輯刪除的數(shù)據(jù);
  • records(查詢(xún)到的分頁(yè)結(jié)果集數(shù)據(jù)):分頁(yè)查詢(xún)得到的多條數(shù)據(jù)會(huì)存儲(chǔ)在 records 中,可以看出該對(duì)象是一個(gè)集合,可以傳遞一個(gè)泛型,泛型就是查詢(xún)到的數(shù)據(jù)對(duì)應(yīng)的實(shí)體泛型;
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對(duì)象使用演示:

@SpringBootTest
public class ProductMapperTest {
    // 自動(dòng)注入 productMapper 接口對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)對(duì)象
    @Autowired
    private ProductMapper productMapper;
    @Test
    public void testPageQuery(){
        // 創(chuàng)建分頁(yè)查詢(xún)相關(guān)參數(shù) page,泛型為 Product,表示查詢(xún)到的結(jié)果對(duì)應(yīng)的實(shí)體類(lèi)為Product
        Page<Product> page = new Page<>();
        // 設(shè)置分頁(yè)查詢(xún)顯示第二頁(yè)的數(shù)據(jù),實(shí)際開(kāi)發(fā)過(guò)程中該參數(shù)有前端傳遞
        page.setCurrent(2);
        // 設(shè)置分頁(yè)查詢(xún)每頁(yè)顯示四條數(shù)據(jù),實(shí)際開(kāi)發(fā)過(guò)程中該參數(shù)有前端傳遞
        page.setSize(4);
        // 創(chuàng)建排序字段集合,不想排序不加即可,實(shí)際開(kāi)發(fā)過(guò)程中一般都會(huì)要求按照時(shí)間降序排序
        List<OrderItem> orders = new ArrayList<>();
        // 按照價(jià)格排序,排序方式為降序,ASC為T(mén)rue表示升序,false表示降序,第一個(gè)參數(shù)表示數(shù)據(jù)庫(kù)中的列名
        orders.add(new OrderItem("price",false));
        // 按照生產(chǎn)時(shí)間排序,排序方式為降序
        orders.add(new OrderItem("production_date",false));
        // 將排序?qū)ο蠹霞尤敕猪?yè)查詢(xún)對(duì)象Page中
        page.setOrders(orders);
        // 執(zhí)行分頁(yè)查詢(xún),可以創(chuàng)建一個(gè)Page對(duì)象接受查詢(xún)結(jié)果,
        // 也可以用查詢(xún)條件參數(shù)page,但其實(shí)最后結(jié)果都是同一個(gè)
        page = productMapper.selectPage(page, null);
        // 可以新創(chuàng)建一個(gè)Page對(duì)象,就像下面這樣
        Page<Product> productPage = productMapper.selectPage(page,null);
        // 輸出分頁(yè)查詢(xún)結(jié)果顯示當(dāng)前的哪一頁(yè)
        System.out.println(page.getCurrent());
        // 輸出分頁(yè)查詢(xún)結(jié)果的總數(shù)據(jù)條數(shù)
        System.out.println(page.getTotal());
        // 輸出分頁(yè)查詢(xún)結(jié)果的數(shù)據(jù)集合
        System.out.println(page.getRecords());
        // 輸出分頁(yè)查詢(xún)結(jié)果的每頁(yè)顯示條數(shù)
        System.out.println(page.getSize());
        // 判斷剛才分頁(yè)查詢(xún)的兩個(gè)結(jié)果對(duì)象是否為同一個(gè)
        System.out.println(page == productPage);
        // 輸出第一個(gè)分頁(yè)查詢(xún)對(duì)象內(nèi)存地址
        System.out.println(page);
        // 輸出第二個(gè)分頁(yè)查詢(xún)對(duì)象內(nèi)存地址
        System.out.println(productPage);
    }
}

鏈?zhǔn)?/h4>

鏈?zhǔn)讲樵?xún)演示:

// 鏈?zhǔn)讲樵?xún) 普通
QueryChainWrapper<T> query();

// 鏈?zhǔn)讲樵?xún) lambda 式。注意:不支持 Kotlin
LambdaQueryChainWrapper<T> lambdaQuery();

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

鏈?zhǔn)礁卵菔荆?/p>

// 鏈?zhǔn)礁?普通
UpdateChainWrapper<T> update();

// 鏈?zhǔn)礁?lambda 式。注意:不支持 Kotlin
LambdaUpdateChainWrapper<T> lambdaUpdate();

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一文了解Java中record和lombok的使用對(duì)比

    一文了解Java中record和lombok的使用對(duì)比

    Java的 record 關(guān)鍵字是Java 14中引入的一個(gè)新的語(yǔ)義特性。Lombok 是一個(gè)Java庫(kù),可以自動(dòng)生成一些已知的模式為Java字節(jié)碼。本文我們將探討各種使用情況,包括java record 的一些限制。對(duì)于每個(gè)例子,我們將看到Lombok如何派上用場(chǎng),并比較這兩種解決方案
    2022-07-07
  • java如何獲取文件或目錄的路徑

    java如何獲取文件或目錄的路徑

    介紹了幾種獲取項(xiàng)目路徑的方法,包括System.getProperty("user.dir")、類(lèi)加載器getResource()、file.getPath()和file.getCanonicalPath(),并比較了它們的優(yōu)缺點(diǎn),推薦使用System.getProperty("user.dir")更為方便
    2025-11-11
  • 使用Backoff策略提高HttpClient連接管理的效率

    使用Backoff策略提高HttpClient連接管理的效率

    這篇文章主要為大家介紹了Backoff策略提高HttpClient連接管理的效率使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 掃二維碼自動(dòng)跳轉(zhuǎn)【java】詳解

    掃二維碼自動(dòng)跳轉(zhuǎn)【java】詳解

    這篇文章主要介紹了java掃二維碼自動(dòng)跳轉(zhuǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • java實(shí)現(xiàn)的AES加密算法完整實(shí)例

    java實(shí)現(xiàn)的AES加密算法完整實(shí)例

    這篇文章主要介紹了java實(shí)現(xiàn)的AES加密算法,結(jié)合完整實(shí)例形式分析了AES加密類(lèi)的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • Centos中安裝jdk案例講解

    Centos中安裝jdk案例講解

    這篇文章主要介紹了Centos中安裝jdk案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Hibernate管理Session和批量操作分析

    Hibernate管理Session和批量操作分析

    這篇文章主要介紹了Hibernate管理Session和批量操作的技巧,包括Hibernate管理Session、批量處理數(shù)據(jù)等的常用技巧及注意事項(xiàng),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • Java 實(shí)戰(zhàn)練手項(xiàng)目之酒店管理系統(tǒng)的實(shí)現(xiàn)流程

    Java 實(shí)戰(zhàn)練手項(xiàng)目之酒店管理系統(tǒng)的實(shí)現(xiàn)流程

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)酒店管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • Dwr3.0純注解(純Java Code配置)配置與應(yīng)用淺析二之前端調(diào)用后端

    Dwr3.0純注解(純Java Code配置)配置與應(yīng)用淺析二之前端調(diào)用后端

    我們講到了后端純Java Code的Dwr3配置,完全去掉了dwr.xml配置文件,但是對(duì)于使用注解的類(lèi)卻沒(méi)有使用包掃描,而是在Servlet初始化參數(shù)的classes里面加入了我們的Service組件的聲明暴露,對(duì)于這個(gè)問(wèn)題需要后面我們?cè)偌?xì)細(xì)研究下這篇文章,主要分析介紹前端怎么直接調(diào)用后端
    2016-04-04
  • 深入淺析 Spring Boot Starter

    深入淺析 Spring Boot Starter

    Spring框架功能很強(qiáng)大,但是就算是一個(gè)很簡(jiǎn)單的項(xiàng)目,我們也要配置很多東西。接下來(lái)通過(guò)本文給大家分享Spring Boot Starter 知識(shí),感興趣的朋友一起看看吧
    2017-10-10

最新評(píng)論

龙川县| 若尔盖县| 普定县| 稻城县| 扬州市| 双城市| 道孚县| 盘锦市| 沂水县| 万全县| 高邮市| 瑞昌市| 沿河| 新乡县| 迁安市| 将乐县| 云安县| 三河市| 宁晋县| 乌兰浩特市| 江口县| 江油市| 成都市| 澄城县| 禄劝| 南涧| 府谷县| 贡山| 炉霍县| 富顺县| 四会市| 谷城县| 清流县| 绍兴市| 海兴县| 黎平县| 天峻县| 大方县| 原阳县| 澳门| 乌什县|