項目應用實踐:基于grpc從零開始搭建一個準生産分布式應用(0) - quickStart
本小節是使用此插件最常使用的功能,不難了解即可,本章内容也可當做字典來查問
一、AbstractWrapper
QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父類,用于生成 sql 的 where 條件, entity 屬性也用于生成 sql 的 where 條件,注意: entity 生成的 where 條件與 使用各個 api 生成的 where 條件沒有任何關聯行為
QueryWrapper
繼承自 AbstractWrapper ,自身的内部屬性 entity 也用于生成 where 條件,及 LambdaQueryWrapper, 可以通過 new QueryWrapper().lambda() 方法擷取
select(String... sqlSelect)
select(Predicate<TableFieldInfo> predicate)
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
所有方法如下表所示:
方法名 | 說明 | 使用 |
allEq(Map<R, V> params) | 全部 =(或個别 isNull) | allEq(params,true) |
eq | = | eq(“real_name”,“王昭君”) |
ne | <> | ne(“nick_name”,“空想 4”) |
gt | > | gt(“age”,21) |
ge | >= | ge(“age”,22) |
lt | < | lt(“age”,22) |
le | <= | le(“age”,21") |
between | cloum between ? and ? | between(“age”,0,21) |
notBetween | cloum between ? and ? | notBetween(“age”,0,21) |
like | cloum like ‘% 王 %’ | like(“real_name”,“王”) |
notLike | not like ‘% 王 %’ | notLike(“real_name”,“王”) |
likeLeft | like ‘% 王’ | likeLeft(“real_name”,“昭”) |
likeRight | like ‘王 %’ | likeRight(“real_name”,“昭”) |
isNull | is null | isNull(“gender”) |
isNotNull | is not null | isNotNull(“gender”) |
in | in (1,2,3) | in(“nick_name”,lists) |
notIn | age not in (1,2,3) | notIn(“nick_name”,lists) |
inSql | age in (1,2,3,4,5,6) | inSql(“nick_name”,"‘空想 4’,‘空想 5’,‘空想 6’") |
notInSql | age not in (1,2,3,4,5,6) | notInSql(“nick_name”,"‘空想 4’,‘空想 5’,‘空想 6’") |
groupBy | group by id,name | groupBy(“nick_name”,“age”) |
orderByAsc | order by id ASC,name ASC | orderByAsc(“nick_name”,“age”) |
orderByDesc | order by id DESC,name DESC | orderByDesc(“age”) |
orderBy | order by id ASC,name ASC | orderBy(true,true,“age”) |
having | having sum(age) > 10 | having(“sum(age) > 10”) |
or | id = 1 or name = ‘老王’ | eq(“nick_name”,“空想 4”).or(i->i.eq(“age”,21) eq(“nick_name”,“空想 4”).or().eq(“nick_name”,“空想 5”) |
and | and (name = ‘李白’ and status <> ‘活着’) | and(i->i.eq(“age”,21)) |
nested | (name = ‘李白’ and status <> ‘活着’) | nested(i->i.eq(“age”,21).eq(“nick_name”,“空想 4”)) |
apply | id = 1 | apply(“nick_name = ‘空想 4’”) |
last | 最後添加多個以最後的為準,有 sql 注入風險 | last(“limit 1”) |
exists | 拼接 EXISTS (sql 語句) | exists(“select id from table where age = 1”) |
notExists | 拼接 NOT EXISTS (sql 語句) | notExists(“select id from table where age = 1”) |
UpdateWrapper
繼承自 AbstractWrapper ,自身的内部屬性 entity 也用于生成 where 條件及 LambdaUpdateWrapper, 可以通過 new UpdateWrapper().lambda() 方法擷取!
set(String column, Object val)
set(boolean condition, String column, Object val)
public class UpdateWrapperTest {
@Autowired
private UserMapper userMapper;
/**
* UPDATE user SET age=?, email=? WHERE (name = ?)
*/
@Test
public void tests() {
//方式一:
User user = new User();
user.setAge(29);
user.setEmail("[email protected]");
userMapper.update(user,new UpdateWrapper<User>().eq("name","Tom"));
//方式二:
//不建立User對象
userMapper.update(null,new UpdateWrapper<User>()
.set("age",29).set("email","[email protected]").eq("name","Tom"));
}
/**
* 使用lambda條件構造器
* UPDATE user SET age=?, email=? WHERE (name = ?)
*/
@Test
public void testLambda() {
//方式一:
User user = new User();
user.setAge(29);
user.setEmail("[email protected]");
userMapper.update(user,new LambdaUpdateWrapper<User>().eq(User::getName,"Tom"));
//方式二:
//不建立User對象
userMapper.update(null,new LambdaUpdateWrapper<User>()
.set(User::getAge,29).set(User::getEmail,"[email protected]").eq(User::getName,"Tom"));
}
}
二、操作接口
IService CRUD 接口
- 泛型 T 為任意實體對象
- 對象 Wrapper 為 條件構造器
Save
// 插入一條記錄(選擇字段,政策插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);
參數說明
類型 | 參數名 | 描述 |
T | entity | 實體對象 |
Collection<T> | entityList | 實體對象集合 |
int | batchSize | 插入批次數量 |
SaveOrUpdate
// TableId 注解存在更新記錄,否插入一條記錄
boolean saveOrUpdate(T entity);
// 根據updateWrapper嘗試更新,否繼續執行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
參數說明
類型 | 參數名 | 描述 |
T | entity | 實體對象 |
Wrapper<T> | updateWrapper | 實體對象封裝操作類 UpdateWrapper |
Collection<T> | entityList | 實體對象集合 |
int | batchSize | 插入批次數量 |
Remove
// 根據 entity 條件,删除記錄
boolean remove(Wrapper<T> queryWrapper);
// 根據 ID 删除
boolean removeById(Serializable id);
// 根據 columnMap 條件,删除記錄
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根據ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);
參數說明
類型 | 參數名 | 描述 |
Wrapper<T> | queryWrapper | 實體包裝類 QueryWrapper |
Serializable | id | 主鍵 ID |
Map<String, Object> | columnMap | 表字段 map 對象 |
Collection<? extends Serializable> | idList | 主鍵 ID 清單 |
Update
// 根據 UpdateWrapper 條件,更新記錄 需要設定sqlset
boolean update(Wrapper<T> updateWrapper);
// 根據 whereWrapper 條件,更新記錄
boolean update(T updateEntity, Wrapper<T> whereWrapper);
// 根據 ID 選擇修改
boolean updateById(T entity);
// 根據ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根據ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);
參數說明
類型 | 參數名 | 描述 |
Wrapper<T> | updateWrapper | 實體對象封裝操作類 UpdateWrapper |
T | entity | 實體對象 |
Collection<T> | entityList | 實體對象集合 |
int | batchSize | 更新批次數量 |
Get
// 根據 ID 查詢
T getById(Serializable id);
// 根據 Wrapper,查詢一條記錄。結果集,如果是多個會抛出異常,随機取一條加上限制條件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);
// 根據 Wrapper,查詢一條記錄
T getOne(Wrapper<T> queryWrapper, boolean throwEx);
// 根據 Wrapper,查詢一條記錄
Map<String, Object> getMap(Wrapper<T> queryWrapper);
// 根據 Wrapper,查詢一條記錄
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
參數說明
類型 | 參數名 | 描述 |
Serializable | id | 主鍵 ID |
Wrapper<T> | queryWrapper | 實體對象封裝操作類 QueryWrapper |
boolean | throwEx | 有多個 result 是否抛出異常 |
T | entity | 實體對象 |
Function<? super Object, V> | mapper | 轉換函數 |
List
// 查詢所有
List<T> list();
// 查詢清單
List<T> list(Wrapper<T> queryWrapper);
// 查詢(根據ID 批量查詢)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查詢(根據 columnMap 條件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查詢所有清單
List<Map<String, Object>> listMaps();
// 查詢清單
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查詢全部記錄
List<Object> listObjs();
// 查詢全部記錄
<V> List<V> listObjs(Function<? super Object, V> mapper);
// 根據 Wrapper 條件,查詢全部記錄
List<Object> listObjs(Wrapper<T> queryWrapper);
// 根據 Wrapper 條件,查詢全部記錄
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
參數說明
類型 | 參數名 | 描述 |
Wrapper<T> | queryWrapper | 實體對象封裝操作類 QueryWrapper |
Collection<? extends Serializable> | idList | 主鍵 ID 清單 |
Map<String, Object> | columnMap | 表字段 map 對象 |
Function<? super Object, V> | mapper | 轉換函數 |
Page
// 無條件分頁查詢
IPage<T> page(IPage<T> page);
// 條件分頁查詢
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
// 無條件分頁查詢
IPage<Map<String, Object>> pageMaps(IPage<T> page);
// 條件分頁查詢
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);
參數說明
類型 | 參數名 | 描述 |
IPage<T> | page | 翻頁對象 |
Wrapper<T> | queryWrapper | 實體對象封裝操作類 QueryWrapper |
Count
// 查詢總記錄數
int count();
// 根據 Wrapper 條件,查詢總記錄數
int count(Wrapper<T> queryWrapper);
參數說明
類型 | 參數名 | 描述 |
Wrapper<T> | queryWrapper | 實體對象封裝操作類 QueryWrapper |
LambdaChain
query
// 鍊式查詢 普通
QueryChainWrapper<T> query();
// 鍊式查詢 lambda 式。注意:不支援 Kotlin
LambdaQueryChainWrapper<T> lambdaQuery();
// 示例:
query().eq("column", value).one();
lambdaQuery().eq(Entity::getId, value).list();
update
// 鍊式更改 普通
UpdateChainWrapper<T> update();
// 鍊式更改 lambda 式。注意:不支援 Kotlin
LambdaUpdateChainWrapper<T> lambdaUpdate();
// 示例:
update().eq("column", value).remove();
lambdaUpdate().eq(Entity::getId, value).update(entity);
BaseMapper CRUD 接口
通用 CRUD 封裝BaseMapper (opens new window)接口,為 Mybatis-Plus 啟動時自動解析實體表關系映射轉換為 Mybatis 内部對象注入容器
- 泛型 T 為任意實體對象
- 參數 Serializable 為任意類型主鍵 Mybatis-Plus 不推薦使用複合主鍵約定每一張表都有自己的唯一 id 主鍵
- 對象 Wrapper 為 條件構造器
insert
// 插入一條記錄
int insert(T entity);
參數說明
類型 | 參數名 | 描述 |
T | entity | 實體對象 |
Delete
// 根據 entity 條件,删除記錄
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
// 删除(根據ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根據 ID 删除
int deleteById(Serializable id);
// 根據 columnMap 條件,删除記錄
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
參數說明
類型 | 參數名 | 描述 |
Wrapper<T> | wrapper | 實體對象封裝操作類(可以為 null) |
Collection<? extends Serializable> | idList | 主鍵 ID 清單(不能為 null 以及 empty) |
Serializable | id | 主鍵 ID |
Map<String, Object> | columnMap | 表字段 map 對象 |
Update
// 根據 whereWrapper 條件,更新記錄
int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper<T> whereWrapper);
// 根據 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
參數說明
類型 | 參數名 | 描述 |
T | entity | 實體對象 (set 條件值,可為 null) |
Wrapper<T> | updateWrapper | 實體對象封裝操作類(可以為 null,裡面的 entity 用于生成 where 語句) |
Select
// 根據 ID 查詢
T selectById(Serializable id);
// 根據 entity 條件,查詢一條記錄
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 查詢(根據ID 批量查詢)
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根據 entity 條件,查詢全部記錄
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 查詢(根據 columnMap 條件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
// 根據 Wrapper 條件,查詢全部記錄
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根據 Wrapper 條件,查詢全部記錄。注意: 隻傳回第一個字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根據 entity 條件,查詢全部記錄(并翻頁)
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根據 Wrapper 條件,查詢全部記錄(并翻頁)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根據 Wrapper 條件,查詢總記錄數
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
參數說明
類型 | 參數名 | 描述 |
Serializable | id | 主鍵 ID |
Wrapper<T> | queryWrapper | 實體對象封裝操作類(可以為 null) |
Collection<? extends Serializable> | idList | 主鍵 ID 清單(不能為 null 以及 empty) |
Map<String, Object> | columnMap | 表字段 map 對象 |
IPage<T> | page | 分頁查詢條件(可以為 RowBounds.DEFAULT) |
三、分頁插件
內建方式-spring
<!-- spring xml 方式 -->
<property name="plugins">
<array>
<bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor">
<property name="sqlParser" ref="自定義解析類、可以沒有"/>
<property name="dialectClazz" value="自定義方言類、可以沒有"/>
<!-- COUNT SQL 解析.可以沒有 -->
<property name="countSqlParser" ref="countSqlParser"/>
</bean>
</array>
</property>
<bean id="countSqlParser" class="com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize">
<!-- 設定為 true 可以優化部分 left join 的sql -->
<property name="optimizeJoin" value="true"/>
</bean>
內建方式-springboot
//Spring boot方式
@Configuration
public class MybatisPlusConfig {
// 最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
return interceptor;
}
}
代碼實作
配置實作
public interface UserMapper {//可以繼承或者不繼承BaseMapper
/**
* <p>
* 查詢 : 根據state狀态查詢使用者清單,分頁顯示
* </p>
*
* @param page 分頁對象,xml中可以從裡面進行取值,傳遞參數 Page 即自動分頁,必須放在第一位(你可以繼承Page實作自己的分頁對象)
* @param state 狀态
* @return 分頁對象
*/
IPage<User> selectPageVo(Page<?> page, Integer state);//這處可以不寫@param
}
--------------------------------------mapper.xml--------------------------------------------
<select id="selectPageVo" resultType="com.baomidou.cloud.entity.UserVo">
SELECT id,name FROM user WHERE state=#{state}
</select>
編碼實作
public IPage<User> selectUserPage(Page<User> page, Integer state) {
// 不進行 count sql 優化,解決 MP 無法自動優化 SQL 問題,這時候你需要自己查詢 count 部分
// page.setOptimizeCountSql(false);
// 當 total 為小于 0 或者設定 setSearchCount(false) 分頁插件不會進行 count 查詢
// 要點!! 分頁傳回的對象與傳入的對象是同一個
return userMapper.selectPageVo(page, state);
}
public IPage<CaseEntity> pageCaseByCondition(Integer page, Integer size, CaseQuery caseQuery) {
//設定查詢條件
QueryWrapper<CaseEntity> querySql = new QueryWrapper<>();
//querySql.orderByDesc("ctime");
//querySql.like("column", "");
IPage<CaseEntity> iPage = new Page<>(page, size); //IPage<CaseEntity> patientPage1 = new Page<>(page, size, false);//不查詢總頁數
IPage<CaseEntity> result = this.getBaseMapper().selectPage(iPage, querySql);
// System.out.println("總頁數: "+result.getPages());
// System.out.println("總記錄數: "+result.getTotal());
return result;
}