Mybatis-Plus CRUD 操作簡單瞭解一下各個介面簡介
mybatis-plus中包含BaseMapper,Iservice兩個介面和ServiceImpl類,BaseMapper 針對dao層的方法封裝 CRUD,IService 針對業務邏輯層的封裝,需要指定Dao層類和對應的實體類,是在BaseMapper基礎上的加強,ServiceImpl 針對業務邏輯層的實現,搞懂三者關係就能搞懂怎麼用;
一般典型的使用例子中,XxImpl類實現IService類。但是我下面的例子是XxImpl類繼承自ServiceImpl類,並例項化BaseMapper的子類XxMapper和持久化bean類,實現自定義的XxService介面(繼承IService介面),在XxImpl類實現CRUD的增刪改查功能,並重寫在XxService介面定義的方法。
各個類關係如圖
@Servicepublic class TemplateServiceImpl extends ServiceImpl<TemplateDao, Template> implements TemplateService { @Override public List<Template> queryAll() { return this.list(); } @Override public boolean existRecText(String recText) { return this.getOne( new LambdaQueryWrapper<Template>() .eq(Template::getTemplateRectext, recText)) == null ? false : true; } @Override public Template queryByRecText(String recText) { return this.getOne( new LambdaQueryWrapper<Template>() .eq(Template::getTemplateRectext, recText)); } @Override public boolean updataById(String id,int status,String msg) { return this.update(new LambdaUpdateWrapper<Template>().eq(Template::getTemplateTempId,id) .set(Template::getTemplateStatus,status) .set(Template::getTemplateMsg,msg) .set(Template::getUpdateTime, TimeUtil.getTime())); } @Override public void updateEntity(Template template) { this.updateById(template); } @Override public void saveNotId(Template template) { this.save(template); }}
ServiceImpl類持有BaseMapper這個介面的例項,並實現了Iservice這個介面, 所以XxImpl類(業務主要邏輯實現的地方)在繼承ServiceImpl類時候可以指定BaseMapper的子介面進行例項化(也就是例子中的MaterialDao),而ServiceImpl是Iservice介面的子介面,XxImpl類實現了TemplateServiceImpl這個介面定義的若干業務邏輯函式。
mybatisplus中的IService介面(混個臉熟,沒必要都記住):
【新增資料:(增)】 default boolean save(T entity); // 呼叫 BaseMapper 的 insert 方法,用於新增一條資料。 boolean saveBatch(Collection<T> entityList, int batchSize); // 批次插入資料注: entityList 表示實體物件集合 batchSize 表示一次批次插入的資料量,預設為 1000【新增或修改資料:(增或改)】 boolean saveOrUpdate(T entity); // id 若存在,則修改, id 不存在則新增資料 default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper); // 先根據條件嘗試更新,然後再執行 saveOrUpdate 操作 boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize); // 批次插入並修改資料 【刪除資料:(刪)】 default boolean removeById(Serializable id); // 呼叫 BaseMapper 的 deleteById 方法,根據 id 刪除資料。 default boolean removeByMap(Map<String, Object> columnMap); // 呼叫 BaseMapper 的 deleteByMap 方法,根據 map 定義欄位的條件刪除 default boolean remove(Wrapper<T> queryWrapper); // 呼叫 BaseMapper 的 delete 方法,根據實體類定義的 條件刪除物件。 default boolean removeByIds(Collection<? extends Serializable> idList); // 用 BaseMapper 的 deleteBatchIds 方法, 進行批次刪除。 【修改資料:(改)】 default boolean updateById(T entity); // 呼叫 BaseMapper 的 updateById 方法,根據 ID 選擇修改。 default boolean update(T entity, Wrapper<T> updateWrapper); // 呼叫 BaseMapper 的 update 方法,根據 updateWrapper 條件修改實體物件。 boolean updateBatchById(Collection<T> entityList, int batchSize); // 批次更新資料【查詢資料:(查)】 default T getById(Serializable id); // 呼叫 BaseMapper 的 selectById 方法,根據 主鍵 ID 返回資料。 default List<T> listByIds(Collection<? extends Serializable> idList); // 呼叫 BaseMapper 的 selectBatchIds 方法,批次查詢資料。 default List<T> listByMap(Map<String, Object> columnMap); // 呼叫 BaseMapper 的 selectByMap 方法,根據表字段條件查詢 default T getOne(Wrapper<T> queryWrapper); // 返回一條記錄(實體類儲存)。 Map<String, Object> getMap(Wrapper<T> queryWrapper); // 返回一條記錄(map 儲存)。 default int count(Wrapper<T> queryWrapper); // 根據條件返回 記錄數。 default List<T> list(); // 返回所有資料。 default List<T> list(Wrapper<T> queryWrapper); // 呼叫 BaseMapper 的 selectList 方法,查詢所有記錄(返回 entity 集合)。 default List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper); // 呼叫 BaseMapper 的 selectMaps 方法,查詢所有記錄(返回 map 集合)。 default List<Object> listObjs(); // 返回全部記錄,但只返回第一個欄位的值。 default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper); // 呼叫 BaseMapper 的 selectPage 方法,分頁查詢 default <E extends IPage<Map<String, Object>>> E pageMaps(E page, Wrapper<T> queryWrapper); // 呼叫 BaseMapper 的 selectMapsPage 方法,分頁查詢注: get 用於返回一條記錄。 list 用於返回多條記錄。 count 用於返回記錄總數。 page 用於分頁查詢。 【鏈式呼叫:】 default QueryChainWrapper<T> query(); // 普通鏈式查詢 default LambdaQueryChainWrapper<T> lambdaQuery(); // 支援 Lambda 表示式的修改 default UpdateChainWrapper<T> update(); // 普通鏈式修改 default LambdaUpdateChainWrapper<T> lambdaUpdate(); // 支援 Lambda 表示式的修改注: query 表示查詢 update 表示修改 Lambda 表示內部支援 Lambda 寫法。形如: query().eq("column", value).one(); lambdaQuery().eq(Entity::getId, value).list(); update().eq("column", value).remove(); lambdaUpdate().eq(Entity::getId, value).update(entity);
條件構造器(Wrapper,定義 where 條件)Wrapper 條件構造抽象類 -- AbstractWrapper 查詢條件封裝,用於生成 sql 中的 where 語句。 -- QueryWrapper Entity 物件封裝操作類,用於查詢。 -- UpdateWrapper Update 條件封裝操作類,用於更新。 -- AbstractLambdaWrapper 使用 Lambda 表示式封裝 wrapper -- LambdaQueryWrapper 使用 Lambda 語法封裝條件,用於查詢。 -- LambdaUpdateWrapper 使用 Lambda 語法封裝條件,用於更新。
常用條件:
【通用條件:】【比較大小: ( =, <>, >, >=, <, <= )】 eq(R column, Object val); // 等價於 =,例: eq("name", "老王") ---> name = '老王' ne(R column, Object val); // 等價於 <>,例: ne("name", "老王") ---> name <> '老王' gt(R column, Object val); // 等價於 >,例: gt("name", "老王") ---> name > '老王' ge(R column, Object val); // 等價於 >=,例: ge("name", "老王") ---> name >= '老王' lt(R column, Object val); // 等價於 <,例: lt("name", "老王") ---> name < '老王' le(R column, Object val); // 等價於 <=,例: le("name", "老王") ---> name <= '老王' 【範圍:(between、not between、in、not in)】 between(R column, Object val1, Object val2); // 等價於 between a and b, 例: between("age", 18, 30) ---> age between 18 and 30 notBetween(R column, Object val1, Object val2); // 等價於 not between a and b, 例: notBetween("age", 18, 30) ---> age not between 18 and 30 in(R column, Object... values); // 等價於 欄位 IN (v0, v1, ...),例: in("age",{1,2,3}) ---> age in (1,2,3) notIn(R column, Object... values); // 等價於 欄位 NOT IN (v0, v1, ...), 例: notIn("age",{1,2,3}) ---> age not in (1,2,3) inSql(R column, Object... values); // 等價於 欄位 IN (sql 語句), 例: inSql("id", "select id from table where id < 3") ---> id in (select id from table where id < 3) notInSql(R column, Object... values); // 等價於 欄位 NOT IN (sql 語句) 【模糊匹配:(like)】 like(R column, Object val); // 等價於 LIKE '%值%',例: like("name", "王") ---> name like '%王%' notLike(R column, Object val); // 等價於 NOT LIKE '%值%',例: notLike("name", "王") ---> name not like '%王%' likeLeft(R column, Object val); // 等價於 LIKE '%值',例: likeLeft("name", "王") ---> name like '%王' likeRight(R column, Object val); // 等價於 LIKE '值%',例: likeRight("name", "王") ---> name like '王%' 【空值比較:(isNull、isNotNull)】 isNull(R column); // 等價於 IS NULL,例: isNull("name") ---> name is null isNotNull(R column); // 等價於 IS NOT NULL,例: isNotNull("name") ---> name is not null【分組、排序:(group、having、order)】 groupBy(R... columns); // 等價於 GROUP BY 欄位, ..., 例: groupBy("id", "name") ---> group by id,name orderByAsc(R... columns); // 等價於 ORDER BY 欄位, ... ASC, 例: orderByAsc("id", "name") ---> order by id ASC,name ASC orderByDesc(R... columns); // 等價於 ORDER BY 欄位, ... DESC, 例: orderByDesc("id", "name") ---> order by id DESC,name DESC having(String sqlHaving, Object... params); // 等價於 HAVING ( sql語句 ), 例: having("sum(age) > {0}", 11) ---> having sum(age) > 11【拼接、巢狀 sql:(or、and、nested、apply)】 or(); // 等價於 a or b, 例:eq("id",1).or().eq("name","老王") ---> id = 1 or name = '老王' or(Consumer<Param> consumer); // 等價於 or(a or/and b),or 巢狀。例: or(i -> i.eq("name", "李白").ne("status", "活著")) ---> or (name = '李白' and status <> '活著') and(Consumer<Param> consumer); // 等價於 and(a or/and b),and 巢狀。例: and(i -> i.eq("name", "李白").ne("status", "活著")) ---> and (name = '李白' and status <> '活著') nested(Consumer<Param> consumer); // 等價於 (a or/and b),普通巢狀。例: nested(i -> i.eq("name", "李白").ne("status", "活著")) ---> (name = '李白' and status <> '活著') apply(String applySql, Object... params); // 拼接sql(若不使用 params 引數,可能存在 sql 注入),例: apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08") ---> date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'") last(String lastSql); // 無視最佳化規則直接拼接到 sql 的最後,可能存若在 sql 注入。 exists(String existsSql); // 拼接 exists 語句。例: exists("select id from table where age = 1") ---> exists (select id from table where age = 1) 【QueryWrapper 條件:】 select(String... sqlSelect); // 用於定義需要返回的欄位。例: select("id", "name", "age") ---> select id, name, age select(Predicate<TableFieldInfo> predicate); // Lambda 表示式,過濾需要的欄位。 lambda(); // 返回一個 LambdaQueryWrapper 【UpdateWrapper 條件:】 set(String column, Object val); // 用於設定 set 欄位值。例: set("name", null) ---> set name = null etSql(String sql); // 用於設定 set 欄位值。例: setSql("name = '老李頭'") ---> set name = '老李頭' lambda(); // 返回一個 LambdaUpdateWrapper