mybatis plus 深入學習 【Base Mapper】的方法 【IService】的方法

mybatis plus 深入學習

常見注解

1.@TableName

  • 描述:表名注解,標識實體類對應的表
  • 使用位置:實體類
@TableName("sys_user")
public class User {private Long id;private String name;private Integer age;private String email;
}
屬性類型必須指定默認值描述
valueString“”表名
schemaString“”schema
keepGlobalPrefixbooleanfalse是否保持使用全局的 tablePrefix 的值(當全局 tablePrefix 生效時)
resultMapString“”xml 中 resultMap 的 id(用于滿足特定類型的實體類對象綁定)
autoResultMapbooleanfalse是否自動構建 resultMap 并使用(如果設置 resultMap 則不會進行 resultMap 的自動構建與注入)
excludePropertyString[]{}需要排除的屬性名 @since 3.3.1

2.@TableId

  • 描述:主鍵注解
  • 使用位置:實體類主鍵字段
@TableName("sys_user")
public class User {@TableIdprivate Long id;private String name;private Integer age;private String email;
}
屬性類型必須指定默認值描述
valueString“”主鍵字段名
typeEnumIdType.NONE指定主鍵類型

IdType

  • TableId里的值
描述
AUTO數據庫 ID 自增
NONE無狀態,該類型為未設置主鍵類型(注解里等于跟隨全局,全局里約等于 INPUT)
INPUTinsert 前自行 set 主鍵值
ASSIGN_ID分配 ID(主鍵類型為 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默認實現類為DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID分配 UUID,主鍵類型為 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默認 default 方法)
ID_WORKER分布式全局唯一 ID 長整型類型(please use ASSIGN_ID)
UUID32 位 UUID 字符串(please use ASSIGN_UUID)
ID_WORKER_STR分布式全局唯一 ID 字符串類型(please use ASSIGN_ID)

LambdaQueryrapper和QueryWrapper

查詢的數據和另一張表的某一列有關

假如我想查年齡大于30歲用戶的訂單信息

int age = 30;
LambdaQueryWrapper<Order> orderWrapper = Wrappers.<Order>lambdaQuery().inSql(Order::getUserId, "SELECT id FROM user where age > " + age);List<Order> orderList = orderDao.selectList(orderWrapper);

動態條件構建

LambdaQueryWrapper<User> queryWrapper = Wrappers.<User>lambdaQuery();
if (StringUtils.isNotBlank(username)) {queryWrapper.like(User::getUsername, username);
}
if (minAge != null) {queryWrapper.ge(User::getAge, minAge);
}// 等價于// queryWrapper.ge(minAge != null, User::getAge, minAge);
if (maxAge != null) {queryWrapper.le(User::getAge, maxAge);
}// 可鏈式
queryWrapper.ge(minAge != null, User::getAge, minAge).le(maxAge != null, User::getAge, maxAge);
// 也是等價于上面的
List<User> userList = userDao.selectList(queryWrapper);

mysql函數嵌入

假設你有一個實體類User,其中包含了一個日期字段birthDate,你想要查詢生日在特定月份的用戶,并將生日格式化為"yyyy-MM-dd"格式:

@Testpublic static void Test2() {// 選擇要查詢的月份,這里假設選擇1月int selectedMonth = 1;LambdaQueryWrapper<User> queryWrapper = Wrappers.<User>lambdaQuery().apply("MONTH(birth_date) = {0}", selectedMonth).select(User::getId, User::getName, User::getBirthDate);List<User> userList = userDao.selectList(queryWrapper);DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");for (User user : userList) {String formattedBirthDate = user.getBirthDate().format(formatter);System.out.println("User ID: " + user.getId() + ", Name: " + user.getName() + ", Formatted Birth Date: " + formattedBirthDate);}}

自定義SQL片段構建

有時候,可能需要構建復雜的查詢條件,而標準的查詢方法不足以滿足需求。在這種情況下,可以使用自定義SQL片段來構建查詢條件。例如,如果你需要使用OR條件連接多個子條件,可以這樣做:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.or(qw -> qw.like("username", "Alice").or().like("username", "Bob"));List<User> userList = userDao.selectList(queryWrapper);
  • 使用了.or(qw -> ...)來構建自定義的OR條件,然后在其中使用多個.like()條件。這樣就創建了一個查詢條件,要么用戶名包含"Alice"要么包含"Bob"的用戶。
LambdaQueryWrapper<SysUserEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysUserEntity::getStatus, 1).and(i->i.eq(SysUserEntity::getDeptId,3).or().eq(SysUserEntity::getDeptId, 5));
List<SysUserEntity> userEntityList = userService.list(queryWrapper);
  • sql語句user_id,username,password,salt,dept_id,email,mobile,avatar,nick_name,real_name,mini_openid,status,create_user_id,create_time FROM sys_user WHERE (status = ? AND (dept_id = ? OR dept_id = ?))

選擇性加載數據

避免不必要的數據加載是提高查詢性能的關鍵。在查詢時,只選擇那些你實際需要的字段,而不是加載整個實體對象。使用select方法來指定要查詢的字段,以減少數據傳輸和內存占用。

LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();.select(User::getId, User::getName).eq(User::getStatus, 1);List<User> userList = userDao.selectList(queryWrapper);

分頁查詢

如果查詢結果集很大,使用分頁查詢來限制返回的數據量。MyBatis-Plus提供了分頁查詢的支持,可以使用Page類來進行分頁操作。

// 1,10 一般是通過前端動態傳參進去查找
Page<User> page = new Page<>(1, 10); // 從第一頁開始,每頁顯示10條記錄
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();.eq(User::getStatus, 1);IPage<User> userPage = userDao.selectPage(page, queryWrapper);

BaseMapper

參數說明

類型參數名描述
Tentity實體對象
CollectionentityList實體對象集合
intbatchSize插入批次數量
別名et實體類對象
別名ew查詢條件wrapper對象

basemapper類

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package com.baomidou.mybatisplus.core.mapper;import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;public interface BaseMapper<T> extends Mapper<T> {int insert(T entity);
T entity = new T(); // 創建實體對象
baseMapper.insert(entity); // 插入數據
    int deleteById(Serializable id);
Serializable id = 1L; // 要刪除的實體的主鍵ID=xxx,可序列化的值
baseMapper.deleteById(id); // 刪除數據
    int deleteByMap(@Param("cm") Map<String, Object> columnMap);
Map<String, Object> columnMap = new HashMap<>();//創建一個map集合存放符合刪除條件需要刪除的數據
columnMap.put("name", "zs"); // 設置刪除條件,比如name字段等于"zs",將name字段等于"zs"的數據放入創建的map集合
columnMap.put("", "");// 其他條件
baseMapper.deleteByMap(columnMap); // 刪除滿足條件的數據
    int delete(@Param("ew") Wrapper<T> wrapper);
// 創建Wrapper對象,設置刪除條件
LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(T::getName, "zs"); // 設置刪除條件,比如name字段等于"zs"
baseMapper.delete(wrapper); // 刪除滿足條件的數據
    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
Collection<? extends Serializable> idList = Arrays.asList(1L, 2L, 3L); // 要刪除的實體的主鍵ID列表
baseMapper.deleteBatchIds(idList); // 批量刪除數據
    int updateById(@Param("et") T entity);
T entity = new T(); // 創建實體對象
entity.setId(1L); // 設置要更新的實體的主鍵ID
baseMapper.updateById(entity); // 更新數據
    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
T entity = new T(); // 創建實體對象
// 創建Wrapper對象,設置更新條件
LambdaUpdateWrapper<T> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(T::getName, "zs"); // 設置更新條件,比如name字段等于"zs"
baseMapper.update(entity, updateWrapper); // 更新滿足條件的數據
    T selectById(Serializable id);
Serializable id = 1L; // 要查詢的實體的主鍵ID
T entity = baseMapper.selectById(id); // 查詢數據
    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
Collection<? extends Serializable> idList = Arrays.asList(1L, 2L, 3L); // 要查詢的實體的主鍵ID列表
List<T> entityList = baseMapper.selectBatchIds(idList); // 批量查詢數據
    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("name", "zs"); // 設置查詢條件,比如name字段等于"zs"
List<T> entityList = baseMapper.selectByMap(columnMap); // 查詢滿足條件的數據
    T selectOne(@Param("ew") Wrapper<T> queryWrapper);
// 創建Wrapper對象,設置查詢條件
LambdaQueryWrapper<T> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(T::getName, "zs"); // 設置查詢條件,比如name字段等于"zs"
T entity = baseMapper.selectOne(queryWrapper); // 查詢滿足條件的數據,只查一條數據
    Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
// 創建Wrapper對象,設置查詢條件
LambdaQueryWrapper<T> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(T::getName, "zs"); // 設置查詢條件,比如name字段等于"zs"
int count = baseMapper.selectCount(queryWrapper); // 查詢滿足條件的數據總數
    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
// 創建Wrapper對象,設置查詢條件
LambdaQueryWrapper<T> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(T::getAge, 18); // 設置查詢條件,比如age字段等于18
List<T> entityList = baseMapper.selectList(queryWrapper); // 查詢滿足條件的數據列表
    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
// 創建Wrapper對象,設置查詢條件
LambdaQueryWrapper<T> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(T::getAge, 18); // 設置查詢條件,比如age字段等于18
List<Map<String, Object>> mapList = baseMapper.selectMaps(queryWrapper); // 查詢滿足條件的數據列表,并返回Map集合
    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
// 創建 Wrapper 對象,設置查詢條件
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getAge, 18); // 設置查詢條件,比如 age 字段等于 18// 執行查詢操作,返回單個字段值列表
List<Object> ageList = userMapper.selectObjs(queryWrapper); // 查詢滿足條件的 age 字段值列表
    <E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
// 創建Wrapper對象,設置查詢條件,分頁查詢
LambdaQueryWrapper<T> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(T::getAge, 18); // 設置查詢條件,比如age字段等于18
Page<T> page = new Page<>(1, 10); // 創建分頁對象,設置當前頁和每頁顯示數量
IPage<T> pageResult = baseMapper.selectPage(page, queryWrapper); // 分頁查詢滿足條件的數據
List<T> entityList = pageResult.getRecords(); // 當前頁的數據列表
long total = pageResult.getTotal(); // 總記錄數
    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
Page<Map<String, Object>> mapPage = userMapper.selectMapsPage(page, queryWrapper);// 根據分頁條件查詢返回map集合}

IService類

和mapper層方法大差不差

說明:

  • 通用 Service CRUD 封裝IService 接口,進一步封裝 CRUD 采用 get 查詢單行 remove 刪除 list 查詢集合 page 分頁 前綴命名方式區分 Mapper 層避免混淆,
  • 泛型 T 為任意實體對象
  • 建議如果存在自定義通用 Service 方法的可能,請創建自己的 IBaseService 繼承 Mybatis-Plus 提供的基類
  • 對象 Wrapper 為 條件構造器

save

// 插入一條記錄(選擇字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);
參數說明
類型參數名描述
Tentity實體對象
CollectionentityList實體對象集合
intbatchSize插入批次數量
案例
SysUserEntity user = new SysUserEntity();
user.setUsername("zs");
user.setMobile("1234567891");
// user.set...
userService.save(user);List<SysUserEntity> userEntityList = new ArrayList<>();
for (int i = 0; i < 10; i++) {SysUserEntity user = new SysUserEntity();user.setUsername("zs");user.setMobile("1234567891");// user.set...userEntityList.add(user);
}userService.saveBatch(userEntityList);
userService.saveBatch(userEntityList, 2); // 設置每個批次傳入數據條數
// 該值為2時 10/2 = 5次 插入

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);
參數說明
類型參數名描述
Tentity實體對象
WrapperupdateWrapper實體對象封裝操作類 UpdateWrapper
CollectionentityList實體對象集合
intbatchSize插入批次數量
案例
// 創建一個 SysUserEntity 對象并設置屬性
SysUserEntity user = new SysUserEntity();
user.setuserId(3); // 假設庫中有id為3的就是更新操作,沒有就是插入操作
user.setUsername("zs");
user.setMobile("1234567891");
// 可以繼續設置其他屬性...// 調用 saveOrUpdate 方法保存或更新數據,根據主鍵是否存在來決定是插入還是更新
userService.saveOrUpdate(user);// 創建多個 SysUserEntity 對象并設置屬性
List<SysUserEntity> userEntityList = new ArrayList<>();
for (int i = 0; i < 10; i++) {SysUserEntity user = new SysUserEntity();if (i % 2 == 0) {user.setuserId(i); // 假設庫中有id為i的就是更新操作,沒有就是插入操作}user.setUsername("zs");user.setMobile("1234567891");// 可以繼續設置其他屬性...userEntityList.add(user);
}// 調用 saveOrUpdateBatch 方法批量保存或更新數據,根據主鍵是否存在來決定是插入還是更新
userService.saveOrUpdateBatch(userEntityList);// 使用 saveOrUpdateBatch 方法,可以設置每個批次傳入數據條數
userService.saveOrUpdateBatch(userEntityList, 2);
// 當 batchSize 設置為 2 時,10/2 = 5 次插入操作

Remove

// 根據 queryWrapper 設置的條件,刪除記錄
boolean remove(Wrapper<T> queryWrapper);
// 根據 ID 刪除
boolean removeById(Serializable id);
// 根據 columnMap 條件,刪除記錄
boolean removeByMap(Map<String, Object> columnMap);
// 刪除(根據ID 批量刪除)
boolean removeByIds(Collection<? extends Serializable> idList);
參數說明
類型參數名描述
WrapperqueryWrapper實體包裝類 QueryWrapper
Serializableid主鍵 ID
Map<String, Object>columnMap表字段 map 對象
Collection<? extends Serializable>idList主鍵 ID 列表
案例
// 根據 queryWrapper 設置的條件,刪除記錄
LambdaQueryWrapper<SysUserEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysUserEntity::getUsername, "zs");
boolean removeResult = userService.remove(queryWrapper);// 根據 ID 刪除
Long idToRemove = 1L; // 假設要刪除的記錄的 ID 為 1
boolean removeByIdResult = userService.removeById(idToRemove);// 根據 columnMap 條件,刪除記錄
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("username", "zs");
boolean removeByMapResult = userService.removeByMap(columnMap);// 批量刪除(根據ID 批量刪除)
List<Long> idListToRemove = Arrays.asList(1L, 2L, 3L); // 假設要刪除的記錄的 ID 列表
boolean removeByIdsResult = userService.removeByIds(idListToRemove);

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);
參數說明
類型參數名描述
WrapperupdateWrapper實體對象封裝操作類 UpdateWrapper
Tentity實體對象
CollectionentityList實體對象集合
intbatchSize更新批次數量
案例
// 根據 UpdateWrapper 條件,更新記錄 需要設置sqlset
UpdateWrapper<SysUserEntity> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("username", "zs");
boolean updateResult1 = userService.update(updateWrapper);// 根據 whereWrapper 條件,更新記錄
UpdateWrapper<SysUserEntity> whereWrapper = new UpdateWrapper<>();
whereWrapper.eq("username", "zs");
SysUserEntity updateEntity = new SysUserEntity();
updateEntity.setMobile("1234567890");
boolean updateResult2 = userService.update(updateEntity, whereWrapper);// 根據 ID 選擇修改
SysUserEntity entityToUpdate = new SysUserEntity();
entityToUpdate.setId(1L); // 假設要更新的記錄的 ID 為 1
entityToUpdate.setUsername("newZs");
boolean updateByIdResult = userService.updateById(entityToUpdate);// 根據ID 批量更新
List<SysUserEntity> entityListToUpdate = new ArrayList<>();
// 假設填充了需要更新的實體對象到 entityListToUpdate 中
boolean updateBatchByIdResult1 = userService.updateBatchById(entityListToUpdate);// 根據ID 批量更新,設置每個批次傳入數據條數
boolean updateBatchByIdResult2 = userService.updateBatchById(entityListToUpdate, 2);
// 當 batchSize 設置為 2 時,批量更新操作,每次更新 2 條數據

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);
參數說明
類型參數名描述
Serializableid主鍵 ID
WrapperqueryWrapper實體對象封裝操作類 QueryWrapper
booleanthrowEx有多個 result 是否拋出異常
Tentity實體對象
Function<? super Object, V>mapper轉換函數
案例
// 根據 ID 查詢
Long userId = 1L; // 假設要查詢的記錄的 ID 為 1
SysUserEntity userById = userService.getById(userId);// 根據 Wrapper,查詢一條記錄。結果集,如果是多個會拋出異常,隨機取一條加上限制條件 wrapper.last("LIMIT 1")
QueryWrapper<SysUserEntity> queryWrapper1 = new QueryWrapper<>();
queryWrapper1.eq("username", "zs").last("limmit 1");
SysUserEntity userOne1 = userService.getOne(queryWrapper1);// 根據 Wrapper,查詢一條記錄,如果有多個結果是否拋出異常
QueryWrapper<SysUserEntity> queryWrapper2 = new QueryWrapper<>();
queryWrapper2.eq("status", 1);
SysUserEntity userOne2 = userService.getOne(queryWrapper2, true);// 根據 Wrapper,查詢一條記錄,并返回 Map 類型結果
QueryWrapper<SysUserEntity> queryWrapper3 = new QueryWrapper<>();
queryWrapper3.eq("age", 25);
Map<String, Object> userMap = userService.getMap(queryWrapper3);// 根據 Wrapper,查詢一條記錄,并通過轉換函數返回特定類型的結果
QueryWrapper<SysUserEntity> queryWrapper4 = new QueryWrapper<>();
queryWrapper4.eq("gender", "male");
Function<Object, String> mapper = obj -> {// 假設轉換函數將查詢結果轉換為字符串類型return "User: " + ((SysUserEntity) obj).getUsername();
};
String username = userService.getObj(queryWrapper4, 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);
參數說明
類型參數名描述
WrapperqueryWrapper實體對象封裝操作類 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);
參數說明
類型參數名描述
IPagepage翻頁對象
WrapperqueryWrapper實體對象封裝操作類 QueryWrapper

Count

// 查詢總記錄數
int count();
// 根據 Wrapper 條件,查詢總記錄數
int count(Wrapper<T> queryWrapper);
參數說明
類型參數名描述
WrapperqueryWrapper實體對象封裝操作類 QueryWrapper

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712260.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712260.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712260.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux系統化學習】信號的保存

目錄 阻塞信號 信號處理常見方式概覽 信號的其他相關概念 在內核中的表示 sigset_t 信號集操作函數 sigprocmask函數 sigpending函數 信號的捕捉 內核如何實現信號的捕捉 sigaction函數 可重入函數 volatile 阻塞信號 信號處理常見方式概覽 當信號來臨時&#x…

c++算法入門教程(2)

C是一種功能強大且廣泛應用的編程語言&#xff0c;對于想要深入學習編程和算法的人來說&#xff0c;掌握C是一個重要的里程碑。本文將帶你逐步了解C編程的基礎知識&#xff0c;并介紹一些常見的算法和編程技巧幫你入門c算法。 ?在c算法入門教程(1) 中&#xff0c;我講解了什么…

GEE:使用Sigmoid激活函數對單波段圖像進行變換(以NDVI為例)

作者:CSDN @ _養樂多_ 本文將介紹在 Google Earth Engine (GEE)平臺上,對任意單波段影像進行 Sigmoid 變換的代碼。并以對 NDVI 影像像素值的變換為例。 文章目錄 一、Sigmoid激活函數1.1 什么是 Sigmoid 激活函數1.2 用到遙感圖像上有什么用?二、代碼鏈接三、完整代碼一…

查詢每個會話使用內存大小(DM8達夢數據庫)

DM8達夢數據庫查詢每個會話使用內存大小 1 環境介紹2 查詢每個sql會話使用內存大小3 達夢數據庫學習使用列表 1 環境介紹 在某些環境數據庫內存增長到服務器內存用完,發生OOM事件,可以分析sql會話使用內存大小; 2 查詢每個sql會話使用內存大小 --創建SQL會話占用內存記錄表 …

共享棧的C語言實現

共享棧&#xff1a;所謂共享棧就是為了節省空間&#xff0c;讓兩個棧共享一片連續的存儲空間&#xff0c;兩個棧從這片連續的共享空間的兩端向中間擴充自己的存儲空間&#xff0c;設這片存儲空間的大小為maxSize&#xff0c;采用棧頂指針始終指向當前棧頂元素的方式來實現共享棧…

簡單認識算法的復雜度

時間復雜度與空間復雜度 1.算法的復雜度 ? 算法在編寫成可執行程序后&#xff0c;運行時需要耗費時間資源和空間(內存)資源 。因此衡量一個算法的好壞&#xff0c;一般是從時間和空間兩個維度來衡量的&#xff0c;即時間復雜度和空間復雜度。 ? 時間復雜度主要衡量一個算法…

MYSQL02高級_目錄結構、默認數據庫、表文件、系統獨立表空間

文章目錄 ①. MySQL目錄結構②. 查看默認數據庫③. MYSQL5.7和8表文件③. 系統、獨立表空間 ①. MySQL目錄結構 ①. 如何查看關聯mysql目錄 [rootmysql8 ~]# find / -name mysql /var/lib/mysql /var/lib/mysql/mysql /etc/selinux/targeted/tmp/modules/100/mysql /etc/seli…

前端src中圖片img標簽資源的幾種寫法?

在 Vue 項目中引用圖片路徑有幾種不同的方法&#xff0c;具體取決于你的項目結構和配置。以下是幾種常見的方式&#xff1a; 1. 靜態資源目錄 (Public) 如果你的圖片放在了項目的 public 目錄下&#xff08;例如&#xff0c;Vite 和 Create Vue App 腳手架工具通常使用這個目…

05 OpenCV圖像混合技術

文章目錄 理論算子示例 理論 其中 的取值范圍為0~1之間 算子 addWeighted CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2, double beta,double gamma, OutputArray dst, int dtype -1 ); 參數1&#xff1a;輸入圖像Mat …

2024年【廣東省安全員A證第四批(主要負責人)】考試試卷及廣東省安全員A證第四批(主要負責人)作業模擬考試

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 廣東省安全員A證第四批&#xff08;主要負責人&#xff09;考試試卷根據新廣東省安全員A證第四批&#xff08;主要負責人&#xff09;考試大綱要求&#xff0c;安全生產模擬考試一點通將廣東省安全員A證第四批&#x…

釘釘機器人發送折線圖卡片 工具類代碼

釘釘機器人 “創建并投放卡片 接口 ” 可以 發送折線圖、柱狀圖 官方文檔&#xff1a;創建并投放卡片 - 釘釘開放平臺 0依賴、1模板、2機器人放到內部應用、3放開這個權限 、4工具類、5調用工具類 拼接入參 卡片模板 自己看文檔創建&#xff0c;卡片模板的id 有用 0、依賴…

Springboot項目中定時任務的四種實現方式

文章目錄 1. 使用Scheduled注解1.1 時間間隔執行1.2 固定時間點執行 2. 使用EnableScheduling注解啟用定時任務3. 實現SchedulingConfigurer接口4. 使用Quartz框架4.1 配置QuartzScheduler4.2 定義Job類和Trigger類 5. 總結 在開發現代應用時&#xff0c;定時任務是一個非常常見…

地圖可視化繪制 | R-ggplot2 NC地圖文件可視化

在推出兩期數據分享之后&#xff0c;獲取數據的小伙伴們也知道&#xff0c;數據格式都是NetCDF(nc) 格式網格數據&#xff0c;雖然我在推文分享中說明使用Python、R或者GIS類軟件都是可以進行 處理和可視化繪制的&#xff0c;但是&#xff0c;還是有小伙伴咨詢使用編程軟件Pyth…

牛客周賽 Round 34(A,B,C,D,E,F,G)

把這場忘了。。官方也遲遲不發題解 比賽鏈接 出題人題解 A 小紅的字符串生成 思路&#xff1a; 枚舉四種字符串打印出來即可&#xff0c;為了防止重復可以用set先去一下重。 code&#xff1a; #include <iostream> #include <cstdio> #include <cstring&g…

Opencv實戰(4)詳解輪廓

輪廓 Opencv實戰系列&#xff0c;前文&#xff1a; 文章目錄 輪廓(1).查找繪制1.findContours()2.drawContours() (2).層級結構(3).篩選輪廓(4).凸包 (1).查找繪制 預處理&#xff1a; 灰度化&#xff1a;使用cv::cvtColor()圖像去噪&#xff1a;使用高斯濾波cv::Gaussian(…

Acwing-基礎算法課筆記之數學知識(擴展歐幾里得算法)

Acwing-基礎算法課筆記之數學知識&#xff08;擴展歐幾里得算法&#xff09; 一、擴展歐幾里得算法1、裴蜀定理2、過程模擬3、代碼模板 二、線性同余方程1、定義2、模擬過程3、結論證明 一、擴展歐幾里得算法 1、裴蜀定理 對于任意正整數 a a a&#xff0c; b b b&#xff0…

day48 ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

一遍過。 當前房屋偷與不偷取決于 前一個房屋和前兩個房屋是否被偷了。所以這里就更感覺到&#xff0c;當前狀態和前面狀態會有一種依賴關系&#xff0c;那么這種依賴關系都是動規的遞推公式。 class Solution { public:int rob(vector<int>& nums) {vector<vec…

門店縱深不足、入口有遮擋影響客流準確率?近景客流幫你搞定!

為了優化運營策略、提升門店營收&#xff0c;很多店鋪和商場都會安裝客流攝像機。但是在實際應用中&#xff0c;由于門店縱深受限等原因&#xff0c;導致無法使用之前的常規客流產品。 針對這種情況&#xff0c;悠絡客最新研發了近景客流產品&#xff0c;即使存在入口被遮擋或門…

內網信息搜集

目錄 內網基礎知識 基本流程圖 怎么判斷是否在域內 常規信息類收集-應用&服務&權限等 cs信息搜集 bloodhound安裝及使用 內網基礎知識 工作組&#xff1a;將不同的計算機按照功能分別列入不同的組&#xff0c;想要訪問某個部門的資源&#xff0c;只要在【網絡】里…

pyqt教程

一、組件安裝配置 1.安裝組件 在Anaconda Prompt下進入自己的python環境 pip install PyQt5 pip install PyQt5-tools 2.vscode安裝插件 3.配置路徑 配置Pyuic:Cmd與Qtdesigner:Path路徑 1.Pyuic:Cmd路徑 一般是在你安裝的python環境下的 \Scripts\pyuic5.exe 2.Qtdesigner:P…