mybatis-plus學習
阿新 • • 發佈:2021-08-02
MybatisPlus
Spring相關注解
@TableName是mybatis-plus中的註解,主要是實現實體型別和資料庫中的表實現對映,在物件中新增@TableName,指定資料庫表名.
@TableId :將資料庫的主鍵與之對映,在呼叫mplus中繼承的baseMapper封裝的方法時,如果不指定該主鍵,則傳入id無效查詢,結果為null(例如baseMapper的getOne(引數為id))
//AUTO自增,根據當前表中id最大值自增+1 @TableId(type = IdType.Auto) private Long id; //NONE,MP set主鍵,雪花演算法實現:資料型別為long,資料庫表的長度要改 @TableId(type = IdType.NONE) private Long id; //開發者手動賦值 INPUT,如果沒有對id進行賦值,那麼存進資料庫中為0(long) @TableId(type = IdType.INPUT) private Long id; //ASSIGN_ID 使用mp自動賦值 採取雪花演算法 //ASSIGN_UUID 要求主鍵型別必須是String型別,會自動生成UUID進行賦值
@TableField註解可以指定欄位的一些屬性,常常解決的問題有2個:
1、物件中的屬性名和欄位名不一致的問題(非駝峰)
2、物件中的屬性欄位在表中不存在的問
@TableField(value="email")//解決欄位名不一致
private String mail;
@TableField(exist=false)//該欄位在資料庫表中不存在
private String address;
@TableField(select=false)//大欄位不加入查詢
private String password;
SpringBoot相關配置
#MyBatis 配置檔案位置. mybatis-plus.config-location = classpath:mybatis-config.xml #MyBatis Mapper 所對應的 XML 檔案位置. mybatis-plus.mapper-locations = classpath*:mybatis/*.xml #別名包掃描路徑,註冊後在 Mapper 對應的 XML 檔案中可以直接使用類名 mybatis-plus.type-aliases-package = cn.itcast.mp.pojo #關閉自動駝峰對映,該引數不能和mybatis-plus.config-location同時存在 mybatis-plus.configuration.map-underscore-to-camel-case=false #全域性地開啟或關閉配置檔案中的所有對映器已經配置的任何快取,預設為 true。 mybatis-plus.configuration.cache-enabled=false #全域性預設主鍵型別,設定後,即可省略實體物件中的@TableId(type = IdType.AUTO)配置。 mybatis-plus.global-config.db-config.id-type=auto #表名字首,全域性配置後可省略@TableName()配置。 mybatis-plus.global-config.db-config.table-prefix=tb_
BaseMapper通用CRUD
1.插入
int result = this.baseMapper.insert(user); //返回的result是受影響的行數,並不是自增後的id
2.更新
//updateById 根據id更新,更新不為null的欄位
this.baseMapper.updateById(user);
// update(QueryWrapper)更新的條件 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("id", 6); //執行更新操作 int result = this.baseMapper.update(user, wrapper);
//update(UpdateWrapper)更新的條件以及欄位
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id", 6).set("age", 23);
//執行更新操作
int result = this.baseMapper.update(null, wrapper);
3.刪除
//deleteById 執行刪除操作
int result = this.baseMapper.deleteById(6L);
//deleteByMap 將columnMap中的元素設定為刪除的條件多個之間為and關係
int result = this.userMapper.deleteByMap(columnMap);
//deleteBatchIds 將實體物件進行包裝,包裝為操作條件
QueryWrapper<User> wrapper = new QueryWrapper<>(user);
int result = this.userMapper.delete(wrapper);
//根據id集合批量刪除
int result = this.userMapper.deleteBatchIds(Arrays.asList(1L,10L,20L));
4.查詢
//selectBatchIds 根據id查詢資料
User user = this.userMapper.selectById(2L);
List<User> users = this.userMapper.selectBatchIds(Arrays.asList(2L, 3L, 10L));
//selectOne
QueryWrapper<User> wrapper = new QueryWrapper<User>();
wrapper.eq("name", "李四");
//根據條件查詢一條資料,如果結果超過一條會報錯
User user = this.userMapper.selectOne(wrapper);
//selectCount 根據條件查詢資料條數
QueryWrapper<User> wrapper = new QueryWrapper<User>();
wrapper.gt("age", 23); //年齡大於23歲
Integer count = this.userMapper.selectCount(wrapper);
//selectList 根據 entity 條件,查詢全部記錄
QueryWrapper<User> wrapper = new QueryWrapper<User>();
wrapper.gt("age", 23); //年齡大於23歲
//根據條件查詢資料
List<User> users = this.baseMapper.selectList(wrapper);
// selectPage 根據 entity 條件,查詢全部記錄(並翻頁),需安裝外掛
QueryWrapper<User> wrapper = new QueryWrapper<User>();
wrapper.gt("age", 20); //年齡大於20歲
Page<User> page = new Page<>(1,1);
//根據條件查詢資料
IPage<User> iPage = this.baseMapper.selectPage(page, wrapper);
IService通用CRUD
1.Save
// 插入一條記錄(選擇欄位,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);
2.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);
3.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);
4.Update
// 根據 UpdateWrapper 條件,更新記錄 需要設定sqlset
boolean update(Wrapper<T> updateWrapper);
// 根據 whereEntity 條件,更新記錄
boolean update(T entity, Wrapper<T> updateWrapper);
// 根據 ID 選擇修改
boolean updateById(T entity);
// 根據ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根據ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);
5.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);
6.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);
7.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);
8.Count
// 查詢總記錄數
int count();
// 根據 Wrapper 條件,查詢總記錄數
int count(Wrapper<T> queryWrapper);
9.Chain
// 鏈式查詢 普通
QueryChainWrapper<T> query();
// 鏈式查詢 lambda 式。注意:不支援 Kotlin
LambdaQueryChainWrapper<T> lambdaQuery();
// 示例:
query().eq("column", value).one();
lambdaQuery().eq(Entity::getId, value).list();
// 鏈式更改 普通
UpdateChainWrapper<T> update();
// 鏈式更改 lambda 式。注意:不支援 Kotlin
LambdaUpdateChainWrapper<T> lambdaUpdate();
// 示例:
update().eq("column", value).remove();
lambdaUpdate().eq(Entity::getId, value).update(entity);
條件構造器
allEq
//個別引數說明: params : key 為資料庫欄位名, value 為欄位值 a : 為 true 則在 map 的 value 為null 時呼叫 isNull 方法,為 false 時則忽略 value 為 null 的
allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean a)
allEq(boolean condition, Map<R, V> params, boolean a)
基本比較操作
//eq(等於=),ne(不等於<>),gt(打於>),ge(大於等於>=),lt(小於<),le(小於等於<=),between(BETWEEN 值1 AND 值2),notBetween(同上),in(欄位 IN (value.get(0), value.get(1), ...)),notIn(同上)
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("password", "123456")
.ge("age", 20)
.in("name", "李四", "王五", "趙六");
模糊查詢
like -> LIKE '%值%'
notLike -> NOT LIKE '%值%'
likeLeft -> LIKE '%值'
likeRight -> LIKE '值%'
wrapper.like("name", "曹");
排序
orderBy -> 排序:ORDER BY 欄位, ...
orderByAsc -> 排序:ORDER BY 欄位, ... ASC
orderByDesc -> 排序:ORDER BY 欄位, ... DESC
wrapper.orderByDesc("age");
邏輯查詢
or -> OR
主動呼叫 or 表示緊接著下一個方法不是用 and 連線!(不呼叫 or 則預設為使用 and 連線)
and -> AND 巢狀
例: and(i -> i.eq("name", "李白").ne("status", "活著")) ---> and (name = '李白' and status <> '活著')
groupBy
groupBy("id", "name")
//—>group by id,name
having
having("sum(age) > 10")
//—>having sum(age) > 10
select(進行指定欄位查詢)
wrapper.eq("name", "李四").or().eq("age", 24)
.select("id", "name", "age");
inSql
inSql("id", "select id from table where id < 3")
//—>id in (select id from table where id < 3)
//notInSql同上
exists
exists("select id from table where age = 1")
//—>exists (select id from table where age = 1)
//notExists