MyBatisPlus-02-核心功能

文章目錄

  • 【README】
  • 【1】MyBatis-plus常見注解
  • 【2】MyBatis-Plus常見配置
    • 【2.1】MyBatis-Plus配置示例
  • 【3】MyBatisPlus核心內容
    • 【3.1】條件構造器
      • 【3.1.1】業務場景1-帶多字段條件的查詢-使用QueryWrapper
      • 【3.1.2】業務場景2-帶條件的更新-使用QueryWrapper
      • 【3.1.3】業務場景3-帶條件對字段做計算-使用UpdateWrapper
      • 【3.1.4】lambda語法的QueryWrapper-使用LambdaQueryWrapper
  • 【4】自定義sql(MyBatisPlus的優缺點)
    • 【4.1】MyBatisPlus使用自定義sql的場景
      • 【第1步】構建更新條件-使用LambdaQueryWrapper
      • 【第2步】mapper方法中使用@Param注解聲明wrapper實例名稱為ew(而且必須為ew)
      • 【第3步】自定義sql,使用Wrapper條件
  • 【5】MyBatisPlus提供的Service接口(IService)
    • 【5.1】繼承ServiceImpl 類
      • 【5.1.1】使用ServiceImpl接口更新用戶余額
      • 【5.1.2】使用ServiceImpl接口查詢用戶信息
    • 【5.2】基于restful風格實現下列接口
      • 【5.2.1】restfulApi使用MyBatisPlus(無需編寫業務dao,自定義業務service繼承MyBatisPlus-ServiceImpl即可)
    • 【5.3】自定義用戶Mapper(ServiceImpl無法滿足復雜業務邏輯的情況)
      • 【5.3.1】代碼實現
      • 【5.3.2】測試效果
  • 【6】IService的lambda方法
    • 【6.1】IService-lambda方法實現多條件復雜查詢
      • 【6.1.1】測試用例
    • 【6.2】通過IService-Lambda方法改造根據id扣減用戶余額
      • 【6.2.1】測試用例
  • 【7】IService批量新增
    • 【7.1】多個循環插入用戶
    • 【7.2】批量插入用戶

【README】

本文代碼參見: https://github.com/TomJourney/mybatis-plus-test

本文集成了springboot與mybatis-plus;

本文主要內容如下(總結自B站黑馬程序員):

  • MybatisPlus常見注解;
  • MybatisPlus常見配置;
  • 條件構造器;
  • 自定義sql;
  • IService接口;


【1】MyBatis-plus常見注解

【注解官方使用文檔】https://baomidou.com/reference/annotation/

1)MybatisPlus通過掃描實體類,并基于反射獲取po類信息作為數據庫表信息;默認規則如下:

  • 類名駝峰轉下劃線作為表名;
  • 名為id的字段作為主鍵;
  • 變量名駝峰轉下劃線作為表的字段名;

補充:若po類的字段與數據庫表字段不滿足上述默認規則,則需要使用注解來做自定義(這就是注解的作用,非常重要)

2)注解(修飾po):

  • @TableName: 設置表名;
  • @TableId:指定表中的主鍵字段;
  • @TableField:指定表中的普通字段;
@Data
@TableName("user_tbl")
public class UserPO {@TableId("idXXX")private Long id;@TableField("nameXXX")private String name;private String mobilePhone;private String addr;
}


【2】MyBatis-Plus常見配置

mybatis-plus常見配置官方文檔:https://baomidou.com/reference/

【2.1】MyBatis-Plus配置示例

# 更多配置可以參考:  https://baomidou.com/reference/
# 別名掃描包
mybatis-plus.type-aliases-package=com.tom.study.mybatisplustest.infrastructure.dao# mapper.xml路徑
mybatis-plus.mapper-locations=classpath*:com.tom.study.mybatisplustest.infrastructure.dao/**/*.xml# 配置
# 是否開啟下劃線和駝峰的映射
mybatis-plus.configuration.map-underscore-to-camel-case=true
# 是否開啟二級緩存
mybatis-plus.configuration.cache-enabled=false# 全局配置
# 更新策略: 只更新非空字段 
mybatis-plus.global-config.db-config.update-strategy=not_null


【3】MyBatisPlus核心內容

【3.1】條件構造器

1)MybatisPlus支持各種復雜的where條件,Wrapper類就是構建條件的包裝器,該類定義了多種方法用于抽象sql條件(where子句);

在這里插入圖片描述



【3.1.1】業務場景1-帶多字段條件的查詢-使用QueryWrapper

【業務場景】查詢id大于100且名字包含6的用戶

sql語句偽代碼: select * from table where id > 100 and name like %6%;【說明:本sql僅供參考,生產環境不要使用】

【構建查詢語句,封裝到QueryWrapper】qryByCondition01()

@Service
public class UserAppService {@AutowiredUserMapper userMapper;public List<UserPO> qryByCondition01() {QueryWrapper<UserPO> userPOQueryWrapper = new QueryWrapper<UserPO>().select("id", "name", "addr").like("name", "6").ge("id", 100);// 查詢return userMapper.selectList(userPOQueryWrapper);}
}

【sql執行日志】

==>  Preparing: SELECT id,name,addr FROM user_tbl WHERE (name LIKE ? AND id >= ?)
==> Parameters: %6%(String), 100(Integer)
<==    Columns: id, name, addr
<==        Row: 106, tr106, 成都市天府大道106號
<==        Row: 116, tr116, 成都市天府大道116號
<==      Total: 2


【3.1.2】業務場景2-帶條件的更新-使用QueryWrapper

【業務場景】根據name等于user2的用戶的地址addr,手機號碼mobilePhone;

sql語句偽代碼: update table set addr=‘XXX’, mobile_phone=‘XXX’ where name=‘user2’;【說明:本sql僅供參考,生產環境不要使用】

【構建更新的where子句,封裝到QueryWrapper】updateByCondition02()

public void updateByCondition2() {QueryWrapper<UserPO> updateWrapper = new QueryWrapper<UserPO>().eq("name", "user2");UserPO userPO = new UserPO();userPO.setAddr("成都天府四街401號");userPO.setMobilePhone("110");userMapper.update(userPO, updateWrapper);
}

【sql執行日志】

JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@774e182c] will not be managed by Spring
==>  Preparing: UPDATE user_tbl SET mobile_phone=?, addr=? WHERE (name = ?)
==> Parameters: 110(String), 成都天府四街401號(String), user2(String)
<==    Updates: 1


【3.1.3】業務場景3-帶條件對字段做計算-使用UpdateWrapper

【業務場景】更新id為4,5,6的用戶的余額,都加500元(消費券);

sql語句偽代碼: update table set balance = balance + 500 where id in (4,5,6);【說明:本sql僅供參考,生產環境不要使用】

【構建更新的where子句,封裝到UpdateWrapper】updateByCondition03()

public void updateByCondition3() {UpdateWrapper<UserPO> updateWrapper = new UpdateWrapper<UserPO>().setSql("balance = balance + 500").in("id", Arrays.asList(4, 5, 6));userMapper.update(null, updateWrapper);}

【sql執行日志】

JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7d18e48f] will not be managed by Spring
==>  Preparing: UPDATE user_tbl SET balance = balance + 500 WHERE (id IN (?,?,?))
==> Parameters: 4(Integer), 5(Integer), 6(Integer)
<==    Updates: 3


【3.1.4】lambda語法的QueryWrapper-使用LambdaQueryWrapper

public List<UserPO> qryByLambdaCondition04() {LambdaQueryWrapper<UserPO> userPOQueryWrapper = new LambdaQueryWrapper<UserPO>().select(UserPO::getId, UserPO::getName, UserPO::getAddr).like(UserPO::getName, "6").ge(UserPO::getId, 100);// 查詢return userMapper.selectList(userPOQueryWrapper);
}

【sql日志】

==>  Preparing: SELECT id,name,addr FROM user_tbl WHERE (name LIKE ? AND id >= ?)
==> Parameters: %6%(String), 100(Integer)
<==    Columns: id, name, addr
<==        Row: 106, tr106, 成都市天府大道106號
<==        Row: 116, tr116, 成都市天府大道116號
<==      Total: 2


【4】自定義sql(MyBatisPlus的優缺點)

1)應用場景:使用mybatisPlus的Wrapper構建復雜的where條件,然后自定義sql語句中剩下的部分;

2)MyBatisPlus的優缺點:

  • 優點:能夠容易定義where子句的查詢條件;
  • 缺點:不容易定義where關鍵字之前的sql,如聚合函數count(),avg()等 (如sql= select user_state, count(1) from table where id in (1,2,3) group by user_state);

【4.1】MyBatisPlus使用自定義sql的場景

【業務場景】更新id為4,5,6的用戶的余額,都加500元。

【第1步】構建更新條件-使用LambdaQueryWrapper

public void updateBalanceByDiySql() {LambdaQueryWrapper<UserPO> userPOQueryWrapper = new LambdaQueryWrapper<UserPO>().in(UserPO::getId, List.of(4, 5, 6));// 更新userMapper.updateBalance(userPOQueryWrapper, new BigDecimal("500"));}

【第2步】mapper方法中使用@Param注解聲明wrapper實例名稱為ew(而且必須為ew)

public interface UserMapper extends BaseMapper<UserPO> {void updateBalance(@Param("ew")LambdaQueryWrapper<UserPO> wrapper, @Param("balance")BigDecimal balance);
}

補充:也可以使用常量Constants.WRAPPER獲取ew值;

【第3步】自定義sql,使用Wrapper條件

【UserMapper.xml】 UserMapper.xml與UserMapper.java 在同一個package下;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tom.study.mybatisplustest.infrastructure.dao.user.mapper.UserMapper"><update id="updateBalance">update user_tbl set balance = balance + #{balance} ${ew.customSqlSegment}</update>
</mapper>

【sql日志】

==>  Preparing: update user_tbl set balance = balance + ? WHERE (id IN (?,?,?))
==> Parameters: 500(BigDecimal), 4(Integer), 5(Integer), 6(Integer)
<==    Updates: 3


【5】MyBatisPlus提供的Service接口(IService)

1)MyBatisPlus提供的IService接口:自定義多個增刪改查方法api;

  • ServiceImpl 實現了 IService,業務邏輯可以不用實現IService,而繼承ServiceImpl ;因為實現IService,需要重寫其所有方法,非常麻煩;

【5.1】繼承ServiceImpl 類

【5.1.1】使用ServiceImpl接口更新用戶余額

public interface UserMapper extends BaseMapper<UserPO> {void updateBalance(@Param("ew") LambdaQueryWrapper<UserPO> wrapper, @Param("balance") BigDecimal balance);
}// 繼承MybatisPlus的ServiceImpl,ServiceImpl實現了MybatisPlus的IService接口
@Service
public class MyBatisPlusUserService extends ServiceImpl<UserMapper, UserPO> {}// 單元測試
@SpringBootTest
public class MyBatisPlusUserServiceTest {@Autowiredprivate MyBatisPlusUserService userService;@Testvoid testSaveUser() {UserPO userPO = new UserPO();userPO.setId(123001L);userPO.setName("張三001");userPO.setMobilePhone("19912340001");userPO.setAddr("成都天府五街001號");userService.save(userPO);}}

【代碼說明】

  • UserMapper 僅繼承BaseMapper,無需寫其他代碼;
  • MyBatisPlusUserService 繼承ServiceImpl,無需寫其他代碼;
  • 單元測試:調用MyBatisPlusUserService.save()方法,實際上調用的是ServiceImpl.save()方法;

【sql運行日志】

==>  Preparing: INSERT INTO user_tbl ( id, name, mobile_phone, addr ) VALUES ( ?, ?, ?, ? )
==> Parameters: 123001(Long), 張三001(String), 19912340001(String), 成都天府五街001號(String)
<==    Updates: 1

【補充】MyBatisPlus-ServiceImpl代碼結構;

// 業務service
@Service
public class MyBatisPlusUserService extends ServiceImpl<UserMapper, UserPO> {
}// MyBatisPlus的ServiceImpl定義,繼承CrudRepository,并實現IService
public class ServiceImpl<M extends BaseMapper<T>, T> extends CrudRepository<M, T> implements IService<T> {public ServiceImpl() {}
}// MybatisPlus-IService定義,繼承 IRepository 
public interface IService<T> extends IRepository<T> {@Transactional(rollbackFor = {Exception.class})default boolean saveBatch(Collection<T> entityList) {return this.saveBatch(entityList, 1000);}@Transactional(rollbackFor = {Exception.class})default boolean saveOrUpdateBatch(Collection<T> entityList) {return this.saveOrUpdateBatch(entityList, 1000);}@Transactional(rollbackFor = {Exception.class})default boolean removeBatchByIds(Collection<?> list) {return this.removeByIds(list);}@Transactional(rollbackFor = {Exception.class})default boolean updateBatchById(Collection<T> entityList) {return this.updateBatchById(entityList, 1000);}
}// IRepository 定義:
public interface IRepository<T> {int DEFAULT_BATCH_SIZE = 1000;default boolean save(T entity) {return SqlHelper.retBool(this.getBaseMapper().insert(entity));}boolean saveBatch(Collection<T> entityList, int batchSize);boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);// 增刪改查api... 
}


【5.1.2】使用ServiceImpl接口查詢用戶信息

【測試案例】

@Test
void testQuery() {List<UserPO> userPOS = userService.listByIds(List.of(1, 2, 3, 4));System.out.println(userPOS);
}

【sql日志】

==>  Preparing: SELECT id,name,mobile_phone,addr FROM user_tbl WHERE id IN ( ? , ? , ? , ? )
==> Parameters: 1(Integer), 2(Integer), 3(Integer), 4(Integer)
<==    Columns: id, name, mobile_phone, addr
<==        Row: 1, user1, 17612342701, 成都天府三街101號
<==        Row: 2, user2, 110, 成都天府四街401號
<==        Row: 3, user3, 17612342703, 成都天府三街103號
<==        Row: 4, user4, 17612342704, 成都天府三街104號
<==      Total: 4


【5.2】基于restful風格實現下列接口

1)需求: 基于restful實現下面接口:

在這里插入圖片描述



【5.2.1】restfulApi使用MyBatisPlus(無需編寫業務dao,自定義業務service繼承MyBatisPlus-ServiceImpl即可)

【RestfulUserController】restful風格的用戶控制器

@RestController
@RequestMapping("/restful/user")
@RequiredArgsConstructor
public class RestfulUserController {private final MyBatisPlusUserService myBatisPlusUserService;private final UserConverter userConverter;@PostMapping(path = "/saveUser", consumes = "application/json")public void saveUser(@RequestBody UserFormDTO userFormDTO) {myBatisPlusUserService.save(userConverter.toUserPO(userFormDTO));}@DeleteMapping(path = "/deleteUser/{id}", consumes = "application/json")public void deleteUser(@PathVariable("id") Long id) {myBatisPlusUserService.removeById(id);}@GetMapping(path = "/queryUserById/{id}", consumes = "application/json")public UserVO queryUserById(@PathVariable("id") Long id) {UserPO userPO = myBatisPlusUserService.getById(id);return userConverter.toUserVO(userPO);}@GetMapping(path = "/queryUserByIds", consumes = "application/json")public List<UserVO> queryUserByIds(@RequestParam("ids") List<Long> ids) {List<UserPO> userPOList = myBatisPlusUserService.listByIds(ids);return userConverter.toUserVOList(userPOList);}
}

【MyBatisPlusUserService】

自定義service繼承ServiceImpl,ServiceImpl由MyBatisPlus提供,其實現了IService的所有增刪改查接口;

@Service
public class MyBatisPlusUserService extends ServiceImpl<UserMapper, UserPO> {
}

【UserConverter】pojo轉換器(采用MapStruct工具)

@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserConverter {UserPO toUserPO(UserFormDTO userFormDTO);UserFormDTO toUserFormDTO(UserPO userPO);UserVO toUserVO(UserPO userPO);List<UserVO> toUserVOList(List<UserPO> userPOList);
}


【請求url】

根據id查詢:localhost:8081/restful/user/queryUserById/1

保存:localhost:8081/restful/user/saveUser

{"id": 100,"name": "user100","mobilePhone": "17712340100","addr": "成都天府三街100號"
}

刪除:localhost:8081/restful/user/deleteUser/100

根據id列表查詢:localhost:8081/restful/user/queryUserByIds?ids=110,111



【5.3】自定義用戶Mapper(ServiceImpl無法滿足復雜業務邏輯的情況)

【5.3.1】代碼實現

【RestfulUserController】 控制器層

@RestController
@RequestMapping("/restful/user")
@RequiredArgsConstructor
public class RestfulUserController {private final MyBatisPlusUserService myBatisPlusUserService;private final UserConverter userConverter;@PutMapping("/{id}/deductBalanceById/{money}")public void deductBalanceById(@PathVariable("id") long id, @PathVariable("money")BigDecimal money) {myBatisPlusUserService.deductBalance(id, money);}
}

【MyBatisPlusUserService】

@Service
public class MyBatisPlusUserService extends ServiceImpl<UserMapper, UserPO> {public void deductBalance(long id, BigDecimal money) {// 1 查詢用戶UserPO userPO = this.getById(id);// 2 校驗用戶狀態if (Objects.isNull(userPO) || "0".equals(userPO.getUserState())) {throw new RuntimeException("用戶狀態異常");}// 3 校驗余額是否充足if (userPO.getBalance().compareTo(money) < 0) {throw new RuntimeException("用戶余額不足");}// 4 扣減余額 update table set balance = balance - money where id = #{id}baseMapper.updateBalanceV2(id, money);//    ==>  Preparing: update user_tbl set balance = balance - ? where id = ?//            ==> Parameters: 150(BigDecimal), 1000(Long)//            <==    Updates: 1}
}

【UserMapper】自定義mapper方法

public interface UserMapper extends BaseMapper<UserPO> {void updateBalance(@Param(Constants.WRAPPER) LambdaQueryWrapper<UserPO> wrapper, @Param("balance") BigDecimal balance);@Update("update user_tbl set balance = balance - #{money} where id = #{id}")void updateBalanceV2(@Param("id") long id, @Param("money") BigDecimal money);
}


【5.3.2】測試效果

路徑:localhost:8081/restful/user/1000/deductBalanceById/150

方法:PUT



【6】IService的lambda方法

【6.1】IService-lambda方法實現多條件復雜查詢

業務場景:實現一個根據復雜條件查詢用戶的接口, 查詢條件如下:根據用戶名,用戶狀態,余額范圍查詢;上述3個查詢字段,為空則跳過,不為空才作為查詢條件;

【RestfulUserController】

@RestController
@RequestMapping("/restful/user")
@RequiredArgsConstructor
public class RestfulUserController {private final MyBatisPlusUserService myBatisPlusUserService;private final UserConverter userConverter;@PostMapping(path = "/queryUserByMultiCondition", consumes = "application/json")public List<UserVO> queryUserByMultiCondition(@RequestBody UserQueryDTO userQueryDTO) {List<UserPO> userPOList = myBatisPlusUserService.queryUserByMultiCondition(userQueryDTO);return userConverter.toUserVOList(userPOList);}
}

【MyBatisPlusUserService】

@Service
public class MyBatisPlusUserService extends ServiceImpl<UserMapper, UserPO> {public List<UserPO> queryUserByMultiCondition(UserQueryDTO userQueryDTO) {return lambdaQuery().like(userQueryDTO.getName() != null, UserPO::getName, userQueryDTO.getName()).eq(userQueryDTO.getUserState() != null, UserPO::getUserState, userQueryDTO.getUserState()).gt(userQueryDTO.getMinBalance() != null, UserPO::getBalance, userQueryDTO.getMinBalance()).lt(userQueryDTO.getMaxBalance() != null, UserPO::getBalance, userQueryDTO.getMaxBalance()).list();//        ==>  Preparing: SELECT id,name,mobile_phone,addr,balance,user_state FROM user_tbl WHERE (name LIKE ? AND user_state = ? AND balance > ? AND balance < ?)
//               ==> Parameters: %user10%(String), 1(String), 5(BigDecimal), 20000(BigDecimal)
//                <==    Columns: id, name, mobile_phone, addr, balance, user_state
//                <==        Row: 10, user10, 17712340010, 成都天府三街010號, 6.00, 1
//                <==        Row: 110, user101, 17612341010, 成都市天府大道110號, 16.00, 1
//                <==        Row: 1000, user1000, 17712341000, 成都天府三街1000號, 850.00, 1
//                <==      Total: 3}}


【6.1.1】測試用例

路徑:localhost:8081/restful/user/queryUserByMultiCondition

報文:

{"name": "user10","userState": "1","minBalance": "5","maxBalance": "20000"
}


【6.2】通過IService-Lambda方法改造根據id扣減用戶余額

1)業務場景如下:

  • 對用戶狀態校驗,僅修改user_state=1的用戶的余額;
  • 對用戶余額校驗,若余額小于扣減額,則不允許扣減;
  • 如果扣減后余額為0,則將用戶state修改為0(不可用狀態)

【RestfulUserController】控制器

@PutMapping("/{id}/usingLambdaDeductBalanceById/{money}")
public void usingLambdaDeductBalanceById(@PathVariable("id") long id, @PathVariable("money")BigDecimal money) {myBatisPlusUserService.usingLambdaDeductBalance(id, money);
}

【MyBatisPlusUserService】

@Service
public class MyBatisPlusUserService extends ServiceImpl<UserMapper, UserPO> {    public void usingLambdaDeductBalance(long id, BigDecimal money) {// 1 查詢用戶UserPO userPO = this.getById(id);// 2 校驗用戶狀態if (Objects.isNull(userPO) || "0".equals(userPO.getUserState())) {throw new RuntimeException("用戶狀態異常");}// 3 校驗余額是否充足if (userPO.getBalance().compareTo(money) < 0) {throw new RuntimeException("用戶余額不足");}// 4 使用lambda表達式扣減余額 update table set balance = balance - money where id = #{id}BigDecimal reducedBalance = userPO.getBalance().subtract(money);lambdaUpdate().set(UserPO::getBalance, reducedBalance).set(reducedBalance.equals(BigDecimal.ZERO), UserPO::getUserState, 0).eq(UserPO::getId, id).update();
//        ==>  Preparing: UPDATE user_tbl SET balance=? WHERE (id = ?)// ==> Parameters: 0.00(BigDecimal), 10000(Long)
//                <==    Updates: 1}
}

【6.2.1】測試用例

localhost:8081/restful/user/10000/usingLambdaDeductBalanceById/10000



【7】IService批量新增

1)需求: 批量插入1萬筆用戶數據,并做出對比:

  • 普通for循環插入;
  • IService的批量插入(數據庫連接設置rewriteBatchedStatements=true );
spring.datasource.url=jdbc:mysql://localhost:3306/mywarn?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&rewriteBatchedStatements=true

【7.1】多個循環插入用戶

private UserPO buildUserPO(int i) {UserPO userPO = new UserPO();userPO.setId(Integer.toUnsignedLong(i));userPO.setName("user0706_" + i);userPO.setMobilePhone("130" + String.format("08d", i));userPO.setAddr("成都市天府六街第" + i + "號");userPO.setBalance(new BigDecimal(i));return userPO;
}@Test
void testInsertUserOneByOne() {long start = System.currentTimeMillis();for (int i = 20000; i < 30000; i++) {userService.save(buildUserPO(i));}long end = System.currentTimeMillis();System.out.println("多個循環插入用戶,耗時(單位秒) = " + (end - start) / 1000);// 多個循環插入用戶,耗時(單位秒) = 45
}

【7.2】批量插入用戶

@Test
void testBatchInsertUser() {long start = System.currentTimeMillis();List<UserPO> userPOList = new ArrayList<>();int i = 30000;for (; i < 40000; i++) {userPOList.add(buildUserPO(i));// 每1000條作為一個批次插入if (i % 1000 == 0) {userService.saveBatch(userPOList);userPOList.clear();}}if (i % 1000 != 0) {userService.saveBatch(userPOList);}long end = System.currentTimeMillis();System.out.println("采用批量插入,耗時(單位秒) = " + (end - start) / 1000);// [數據庫連接設置rewriteBatchedStatements=true]采用批量插入,耗時(單位秒) = 3
}


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

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

相關文章

ZYNQ MPSOC GTH aurora8b10b IP的修改與仿真

1 ip設置好后的頂層模塊接口: 根據自己的開發板修改接口如下: odule gtwizard_ultrascale_0_example_top (// Differential reference clock inputsinput wire mgtrefclk0_x0y1_p,input wire mgtrefclk0_x0y1_n,// Serial data ports for transceiver channel 0input w…

機器學習之線性回歸

主要參考&#xff1a; 機器學習| 算法筆記-線性回歸&#xff08;Linear Regression&#xff09; - 知乎 (zhihu.com) 2-2 線性回歸_嗶哩嗶哩_bilibili Python機器學習實戰&#xff1a;線性回歸模型預測波士頓房價_嗶哩嗶哩_bilibili 回歸分析 在數學和統計學中&#xff0c;回歸…

Boost.Asio學習(2):同步讀寫

Asio 的 buffer 是什么&#xff1f; boost::asio::buffer(...) 是一個函數模板&#xff0c;用于創建一個通用的 buffer 對象&#xff0c;可傳遞給 I/O 函數&#xff08;如 read, write, read_some, write_some 等&#xff09;。 它返回的是 mutable_buffer 或 const_buffer 的…

Java中如何枚舉正則表達式捕獲組的名字

在使用正則表達式在匹配文本時&#xff0c;除了可以通過表達式捕獲命中的文本串外&#xff0c;還可以對捕獲的文本串進行命名。尤其是在解析日志的場景中&#xff0c;經常會被用到。表達式如下&#xff1a; \<(?<pri>\d)\>(?<time>.*) (?<host>\S)…

CentOS 系統高效部署 Dify 全攻略

系列文章目錄 CentOS系統高效部署fastGPT全攻略 文章目錄 系列文章目錄一、前言二、準備工作與系統要求三、安裝 Docker 與 Docker Compose四、部署 Dify 核心服務五、數據庫與存儲配置六、網絡與安全優化七、監控與運維八、升級與擴展九、附錄與資源關鍵命令速查表官方文檔…

xyctf2025第三屆京麒CTF

一.MISC 1.XGCTF 直接ai搜索一遍找到了出題人的博客LamentXU 2024-2025年終總結 - LamentXU - 博客園 知道了原題是ciscn中的 在LamentXU的博客亂逛Patriot CTF 2024 MISC 部分 wp - LamentXU - 博客園 找到了博客網站,讓后搜索ciscn扎到了博客 CISCN華東南WEB-Polluted |…

Python爬蟲 模擬登錄 requests版

前言 網站必須是登錄狀態才能查看網站信息,是最常見的反爬手段,下面我分享一下request模擬登錄狀態進行請求 目錄 模擬登錄的原理 直接復制網站Cookie模擬登錄狀態 通過登錄接口信息破解出Cookie模擬登錄狀態 模擬登錄的原理 網站是使用Cookie和session記錄網站的登錄狀態…

一些改進策略

1.要計算一個神經網絡模型的總參數量、可訓練參數量以及計算量&#xff08;FLOPs&#xff09;&#xff0c;可以使用以下步驟&#xff1a; ### 計算總參數量和可訓練參數量&#xff1a; 1. **逐層計算參數量**&#xff1a; - 對于每一層&#xff0c;確定該層的參數量。這通…

React Native響應式布局實戰:告別媒體查詢,擁抱跨屏適配新時代

前言:當設計師說"這個頁面要適配所有手機和平板…" “什么?React Native不支持CSS媒體查詢?那怎么實現響應式布局?”——這是很多剛接觸React Native的開發者會遇到的靈魂拷問。 但別慌,沒有@media,我們照樣能玩轉多端適配!想象一下:你的App在iPhone SE的小…

[Java惡補day39] 整理模板·考點六【反轉鏈表】

考點六【反轉鏈表】 【考點總結】 1. 206. 【題目】 【核心思路】 【復雜度】 時間復雜度&#xff1a; O ( ) O() O()。 空間復雜度&#xff1a; O ( ) O() O()。 【代碼】 92. 【題目】 【核心思路】 【復雜度】 時間復雜度&#xff1a; O ( ) O() O()。 空間復雜度&a…

7,TCP服務器

1,創建一個工程 文件目錄:

Modbus_TCP_V5 新功能

odbus TCP 服務器指令 MB_SERVER V5.0 新功能概述 如下圖1所示服務器指令 MB_SERVER 從 V5.0 以后增加了三個新功能&#xff0c;分別為&#xff1a; 訪問數據塊中的數據區域&#xff0c;而不是直接訪問 MODBUS 地址過程映像區的讀訪問限制統計變量 NDR_immediate 和 DR_immed…

2-RuoYi-UI管理平臺的啟動

RuoYi-UI是RuoYi后端框架的管理中心(基于 Vue.js 的前端項目)的詳細配置與啟動指南,結合官方文檔和常見實踐整理,涵蓋環境準備、配置修改、啟動流程及問題排查。 ?? 一、環境準備 Node.js 版本要求:≥12.0(推薦 ≥14.0 或 18.18+ 適配 Vue3) 安裝后驗證: node -v …

WPF學習筆記(21)ListBox、ListView與控件模板

ListBox與控件模板 一、 ListBox默認控件模板詳解二、ItemsPresenter集合數據呈現1. 概述2. 示例 三、 ListView默認控件模板詳解1. 概述2. 示例 一、 ListBox默認控件模板詳解 WPF 中的大多數控件都有默認的控件模板。 這些模板定義了控件的默認外觀和行為&#xff0c;包括控…

操作系統【2】【內存管理】【虛擬內存】【參考小林code】

本文完全參考 虛擬內存內存分段內存分頁段頁式內存管理Linux內存管理 一、虛擬內存 1. 單片機的絕對物理地址 以單片機作為引子&#xff0c;它沒有操作系統&#xff0c;每次寫完程序是借助工具將程序燒錄進單片機&#xff0c;程序才能運行。 單片機由于沒有操作系統&#…

【王樹森推薦系統】召回05:矩陣補充、最近鄰查找

概述 這節課和后面幾節課將詳細講述向量召回&#xff0c;矩陣補充是向量召回最簡單的一種方法&#xff0c;不過現在已經不太常用這種方法了本節課的矩陣補充是為了幫助理解下節課的雙塔模型上節課介紹了embedding&#xff0c;它可以把用戶ID和物品ID映射成向量 矩陣補充 模型…

C# 事件(訂閱事件和觸發事件)

訂閱事件 訂閱者向事件添加事件處理程序。對于一個要添加到事件的事件處理程序來說&#xff0c;它必須具有 與事件的委托相同的返回類型和簽名。 使用運算符來為事件添加事件處理程序&#xff0c;如下面的代碼所示。事件處理程序位于該運 算符的右邊。事件處理程序的規范可以…

64頁精品PPT | 基于DeepSeek的數據治理方案AI大數據治理解決方案數據治理大模型解決方案

這份PPT文檔是關于基于DeepSeek的大模型技術在數據治理方案中的應用介紹。強調數據作為新型生產要素與人工智能技術相結合的重要性&#xff0c;指出大模型憑借強大的文學理解、生成能力以及多模態數據處理能力&#xff0c;能為數據治理帶來新機遇。文檔詳細闡述了數據資產化的路…

【文獻筆記】Tree of Thoughts: Deliberate Problem Solving with Large Language Models

Tree of Thoughts: Deliberate Problem Solving with Large Language Models https://github.com/princeton-nlp/tree-of-thought-llm 標題翻譯&#xff1a;思維樹&#xff1a;利用大型語言模型問題求解 1. 內容介紹 1.1. 背景 決策過程有兩種模式&#xff1a; 快速、自動…

使用 Mathematical_Expression 從零開始實現數學題目的作答小游戲【可復制代碼】

從零開始實現數學題目的作答小游戲 開源技術欄 使用 Mathematical_Expression 讓計算機做出題人&#xff0c;讓代碼與數學碰撞出趣味火花。 目錄 文章目錄 從零開始實現數學題目的作答小游戲目錄 從零開始實現數學題目的作答小游戲&#xff1a;讓代碼與數學碰撞出趣味火花為…