MybatisPlus IService接口功能介紹
一、介紹
在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 關(guān)鍵字是Java 14中引入的一個(gè)新的語(yǔ)義特性。Lombok 是一個(gè)Java庫(kù),可以自動(dòng)生成一些已知的模式為Java字節(jié)碼。本文我們將探討各種使用情況,包括java record 的一些限制。對(duì)于每個(gè)例子,我們將看到Lombok如何派上用場(chǎng),并比較這兩種解決方案2022-07-07
使用Backoff策略提高HttpClient連接管理的效率
這篇文章主要為大家介紹了Backoff策略提高HttpClient連接管理的效率使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
java實(shí)現(xiàn)的AES加密算法完整實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)的AES加密算法,結(jié)合完整實(shí)例形式分析了AES加密類(lèi)的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
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)用后端
我們講到了后端純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

