天天看點

Mybatisplus-【2/3】基礎操作

項目應用實踐:基于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 接口

  1. 泛型 T 為任意實體對象
  2. 對象 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;
    }