MyBatisPlus入門教程

MyBatisPlus

image.png

MyBatis-Plus (opens new window)(簡稱 MP)是一個 MyBatis (opens new window) 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。

官網地址:https://baomidou.com/

一、入門案例

1.準備表結構和數據

??準備如下的表結構和相關數據

DROP TABLE IF EXISTS user;CREATE TABLE user
(id BIGINT(20) NOT NULL COMMENT '主鍵ID',name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',age INT(11) NULL DEFAULT NULL COMMENT '年齡',email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',PRIMARY KEY (id)
);

插入對應的相關數據

DELETE FROM user;INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

2. 創建項目

??創建一個SpringBoot項目,然后引入相關的依賴,首先是父依賴

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.6</version><relativePath/> <!-- lookup parent from repository --></parent>

具體的其他的依賴

<!-- spring-boot-starter-web 的依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 引入MyBatisPlus的依賴 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><!-- 數據庫使用MySQL數據庫 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- 數據庫連接池 Druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.14</version></dependency><!-- lombok依賴 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

3.配置信息

??然后我們需要在application.properties中配置數據源的相關信息

spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mp?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=123456spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

然后我們需要在SpringBoot項目的啟動類上配置Mapper接口的掃描路徑

image.png

4.添加User實體

??添加user的實體類

@ToString
@Data
public class User {private Long id;private String name;private Integer age;private String email;
}

5.創建Mapper接口

??在MyBatisPlus中的Mapper接口需要繼承BaseMapper.

/*** MyBatisPlus中的Mapper接口繼承自BaseMapper*/
public interface UserMapper extends BaseMapper<User> {
}

6.測試操作

??然后來完成對User表中數據的查詢操作

@SpringBootTest
class MpDemo01ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testvoid queryUser() {List<User> users = userMapper.selectList(null);for (User user : users) {System.out.println(user);}}}

image.png

7.日志輸出

??為了便于學習我們可以指定日志的實現StdOutImpl來處理

# 指定日志輸出
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

image.png

然后操作數據庫的時候就可以看到對應的日志信息了:

image.png

二、CRUD操作

1.插入用戶

??先來看看插入用戶的操作,在MyBatisPlus中給我們提供一個insert()方法來實現。

    /*** 添加用戶信息*/@Testvoid addUser() {User user = new User(null, "zs", 18, "123@qq.com");int i = userMapper.insert(user);System.out.println("i = " + i);}

插入成功后生成的id是一長串數字:

image.png

注意:在MyBatisPlus中插入數據的時候,如果id為空,默認會通過雪花算法來生成id

2.更新用戶

??然后來看看MyBatisPlus中的更新操作。

    /*** 更新用戶信息*/@Testvoid updateUser() {User user = new User(6l, "zs", 20, "123@qq.com");int i = userMapper.updateById(user);}

3.刪除用戶

??刪除用戶的方法在MyBatisPLUS中提供的有多個

3.1 根據id刪除

    @Testvoid deleteUser() {User user = new User(6l, "zs", 20, "123@qq.com");userMapper.deleteById(6l);}

3.2 批量刪除

??MyBatisPlus中也支持批量刪除的操作

    /*** 批量刪除*/@Testvoid deleteBathUser() {int i = userMapper.deleteBatchIds(Arrays.asList(1l, 2l, 3l, 4l));System.out.println("受影響的行數:" + i);}

3.3 通過Map刪除

根據 columnMap 條件,刪除記錄

    /*** 根據 columnMap 條件,刪除記錄*/@Testvoid deleteMapUser() {Map<String,Object> map = new HashMap<>();map.put("age",18);map.put("name","tom");int i = userMapper.deleteByMap(map);System.out.println("受影響的行數:" + i);}

4.查詢操作

4.1 根據id查詢

??首先我們可以根據id來查詢單條記錄

    @Testvoid queryUserById() {User user = userMapper.selectById(1l);System.out.println(user);}

4.2 根據id批量查詢

??然后也可以通過類似于SQL語句中的in關鍵字來實現多id的查詢

    @Testvoid queryUserByBatchId() {List<User> users = userMapper.selectBatchIds(Arrays.asList(1l, 2l, 3l));users.forEach(System.out::println);}

4.3 通過Map查詢

??也可以把需要查詢的字段條件封裝到一個Map中來查詢

    @Testvoid queryUserByMap() {Map<String,Object> map = new HashMap<>();map.put("age",18);map.put("name","tom");List<User> users = userMapper.selectByMap(map);users.forEach(System.out::println);}

4.4 查詢所有數據

??也可以通過selectList方法來查詢所有的數據

    /*** 查詢用戶信息*/@Testvoid queryUser() {List<User> users = userMapper.selectList(null);for (User user : users) {System.out.println(user);}}

當然在selectList中需要我們傳遞進去一個Wrapper對象,這個是一個條件構造器,這個在后面會詳細的講解。

三、CRUD接口

官網地址:https://baomidou.com/pages/49cc81/#service-crud-%E6%8E%A5%E5%8F%A3

官網說明:

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

在MyBatis-Plus中有一個接口 IService和其實現類 ServiceImpl,封裝了常見的業務層邏輯

1.Service的使用

??要使用CRUD的接口,那么我們自定義的Service接口需要繼承IService接口。

/*** User對應的Service接口* 要使用MyBatisPlus的Service完成CRUD操作,得繼承IService*/
public interface IUserService extends IService<User> {
}

對應的Service實現得繼承ServiceImpl同時指定mapper和實體對象。

/*** Service的實現類* 必須繼承ServiceImpl 并且在泛型中指定 對應的Mapper和實體對象*/
@Service
public class UserService extends ServiceImpl<UserMapper, User> implements IUserService {
}

2.查詢操作

??通過Service中提供的count方法可以查詢總的記錄數。get方法,List方法等

    @Autowiredprivate IUserService userService;@Testvoid getUserCount() {long count = userService.count();System.out.println("count = " + count);}

3.批量插入

??在service中給我們提供了批量插入的方法

    @Testvoid saveBatchUser() {List<User> list = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User(null,"a"+i,10+i,"aaa@163.com");list.add(user);}// 批量插入userService.saveBatch(list);// batchSize:50// userService.saveBatch(list,50);}

還有saveOrUpdate等方法,可自行應用。

四、常用注解

1.@TableName

經過以上的測試,在使用MyBatis-Plus實現基本的CRUD時,我們并沒有指定要操作的表,只是在
Mapper接口繼承BaseMapper時,設置了泛型User,而操作的表為user表
由此得出結論,MyBatis-Plus在確定操作的表時,由BaseMapper的泛型決定,即實體類型決
定,且默認操作的表名和實體類型的類名一致

如果表名和我們的實體類的名稱不一致的話,在執行相關操作的時候會拋出對應的異常,比如數據庫的表我們該為T_USER,然后執行查詢操作。

image.png

這時我們就可以通過@TableName來解決這個問題。

/*** @TableName 標識實體類對應的表名*/
@TableName("t_user")
@AllArgsConstructor
@ToString
@Data
public class User {private Long id;private String name;private Integer age;private String email;
}

??在開發的過程中,我們經常遇到以上的問題,即實體類所對應的表都有固定的前綴,例如t_或tbl_ 此時,可以使用MyBatis-Plus提供的全局配置,為實體類所對應的表名設置默認的前綴,那么就不需要在每個實體類上通過@TableName標識實體類對應的表.

# 指定日志輸出
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 配置MyBatis-Plus操作表的默認前綴
mybatis-plus.global-config.db-config.table-prefix=t_

2.@TableId

??我們可以通過@TableId注解來顯示的指定哪個屬性為主鍵對應的屬性,在前面的例子中默認id就是,如果我們的主鍵字段不是id,比如uid的話,把實體user中的id改為uid,同時表結構中的id字段也修改為uid字段。我們來看看效果。執行插入操作。

image.png

??可以看到拋出了一個 Field 'uid' doesn't 的異常,這時我們可以在User實體的uid屬性上添加@TableId即可。

image.png

??@TableId中的value值在實體類中的字段和表結構的字段一致的情況下我們不用添加,但如果不一致,@TableId中的value我們需要設置表結構中的主鍵字段。

image.png

@TableId中還有一個比較重要的屬性是Type。Type是用來定義主鍵的生成策略的。以下是官網截圖

image.png

這個可以在@TableId中配置,也可以在配置文件中統一配置全局的生成策略。

image.png

當然配置主鍵自增得在表結構中的字段要設置自動增長才行

image.png

3.@TableField

??@TableField注解的作用是當實體類中的屬性和表結構中的字段名稱不一致的情況下來設置對應關系的,當然,在MyBatis-Plus中針對實體中是userName而表結構中是user_name這種情況會自動幫助我們完成駝峰命名法的轉換。

@AllArgsConstructor
@ToString
@Data
public class User {@TableId(value = "uid",type = IdType.ASSIGN_ID)private Long uid; // 表明uid就是主鍵字段對應的屬性@TableField("name") // 表結構中的name屬性和name屬性對應private String name;private Integer age;private String email;
}

4.@TableLogic

??@TableLogic是用來完成 邏輯刪除操作的

刪除類型描述
邏輯刪除假刪除,將對應數據中代表是否被刪除字段的狀態修改為“被刪除狀態”,<br />之后在數據庫中仍舊能看到此條數據記錄
物理刪除真實刪除,將對應數據從數據庫中刪除,之后查詢不到此條被刪除的數據

效果演示:先在表中創建一個is_deleted字段

image.png

對應的在實體類中添加一個isDeleted屬性

image.png

然后我們調用刪除功能

image.png

可以看到我們調用了deleteById方法,但是真實執行的是Update方法,實現了邏輯刪除的場景。

當然也可以在屬性文件中配置全局的

# 配置邏輯刪除
mybatis-plus.global-config.db-config.logic-delete-field=is_deleted
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

五、條件構造器

??當我們需要對單表的CURD做復雜條件處理的時候我們就需要借助Wrapper接口來處理,也就是通過條件構造器來處理。

1.Wrapper接口

??Wrapper接口是條件構造的抽象類,是最頂級的類

image.png

對應的作用描述

image.png

2.QueryWrapper

??首先來看看QueryWrapper的使用,針對where后的條件封裝。

2.1 查詢條件

    /*** 查詢用戶姓名中包含 o 的年齡大于20歲,且郵箱不為null的記錄*/@Testvoid queryUser() {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.like("name","o").gt("age",20).isNotNull("email");List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}

2.2 排序條件

??QueryWrapper也可以封裝排序的條件

    /*** 根據年齡升序然后根據id降序*/@Testvoid queryUser() {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.orderByAsc("age").orderByDesc("uid");List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}

2.3 刪除條件

??QueryWrapper也可以封裝刪除操作的條件

    /*** 刪除所有年齡小于18歲的用戶*/@Testvoid deleteUser() {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.le("age",18);int i = userMapper.delete(wrapper);System.out.println(i);}

2.4 組合條件

??在封裝條件的時候我們可以同時有多個條件組合,類似于 and 和 or的操作,這時QueryWrapper也能很輕松的處理。

    /*** 查詢出年齡大于20并且姓名中包含的有'o'或者郵箱地址為空的記錄*/@Testvoid queryUser() {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.gt("age",20).like("name","o").or() // 默認是通過and連接 顯示加上 or()方法表示or連接.isNotNull("email");List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}@Testvoid queryUser1() {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.and((i)->{i.gt("age",20).like("name","o");}).or((i)->{i.isNotNull("email");});List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}

2.5 查詢特定的字段

??特殊情況我們需要查詢特定的字段,這時可以通過select方法來處理

    /*** 查詢出年齡大于20并且姓名中包含的有'o'或者郵箱地址為空的記錄*/@Testvoid queryUser() {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.gt("age",20).like("name","o").or() // 默認是通過and連接 顯示加上 or()方法表示or連接.isNotNull("email").select("uid","name","age") // 指定特定的字段;//selectMaps()返回Map集合列表,通常配合select()使用,避免User對象中沒有被查詢到的列值為nullList<Map<String, Object>> maps = userMapper.selectMaps(wrapper);maps.forEach(System.out::println);}

2.6 實現子查詢

??單表查詢中對子查詢的需求也是有的,我們來看看如何實現。

    /*** 子查詢* SELECT uid,name,age,email,is_deleted * FROM t_user * WHERE ( *          uid IN (select uid from t_user where uid < 5)*      )*/@Testvoid queryUser() {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.inSql("uid","select uid from t_user where uid < 5");List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);maps.forEach(System.out::println);}

3.UpdateWrapper

??當我們需要組裝更新的字段數據的時候,可以通過UpdateWrapper來實現。

    /*** 更新用戶Tom的age和郵箱信息* UPDATE t_user SET age=?,email=? WHERE (name = ?)*/@Testvoid updateUser() {UpdateWrapper<User> wrapper = new UpdateWrapper<>();wrapper.set("age",25).set("email","bobo@qq.com").eq("name","Tom");int update = userMapper.update(null, wrapper);System.out.println("update = " + update);}

4.動態SQL

??實際開發中,用戶的查詢條件都是動態的,我們需要根據不同的輸入條件來動態的生成對應的SQL語句,這時我們來看看在MyBatisPlus中是如何處理的。

    @Testvoid queryUser1() {String  name = "Tom";Integer age = null;String email = null;QueryWrapper<User> wrapper = new QueryWrapper<>();if(!StringUtils.isEmpty(name)){wrapper.eq("name",name);}if(age != null && age > 0){wrapper.eq("age",age);}if(!StringUtils.isEmpty(email)){wrapper.eq("email",email);}List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}

上面的代碼是通過if來一個個判斷的,看起來代碼比較復雜,其實大家在前面看相關的API的時候會注意到都會有一個Condition參數

image.png

我們可以用這個參數來實現對應的動態SQL處理

    @Testvoid queryUser2() {String  name = "Tom";Integer age = null;String email = null;QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq(StringUtils.isNotBlank(name),"name",name).eq(age!=null && age > 0 ,"age" ,age).eq(StringUtils.isNotBlank(email),"email",email);List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}

六、分頁插件

??在MyBatisPlus中集成了分頁插件,我們不需要單獨的引入,只需要添加對應的配置類

@Configuration
@MapperScan("com.bobo.mpdemo01.mapper")
public class MyBatisPlusConfig {/*** 新的分頁插件,一緩和二緩遵循mybatis的規則,* 需要設置 MybatisConfiguration#useDeprecatedExecutor = false 避免緩存出現問題(該屬性會在舊插件移除后一同移除)*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}}

然后就可以測試操作了

    @Testvoid queryPage() {Page<User> page = new Page<>(1,5);Page<User> userPage = userMapper.selectPage(page, null);System.out.println("userPage.getCurrent() = " + userPage.getCurrent());System.out.println("userPage.getSize() = " + userPage.getSize());System.out.println("userPage.getTotal() = " + userPage.getTotal());System.out.println("userPage.getPages() = " + userPage.getPages());System.out.println("userPage.hasPrevious() = " + userPage.hasPrevious());System.out.println("userPage.hasNext() = " + userPage.hasNext());}

七、代碼生成器

添加依賴

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.2</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId></dependency>

快速生成:

/*** 代碼生成器*/
public class MyFastAutoGenerator {public static void main(String[] args) {FastAutoGenerator.create("jdbc:mysql://localhost:3306/mp?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true", "root", "123456").globalConfig(builder -> {builder.author("boge") // 設置作者//.enableSwagger() // 開啟 swagger 模式.fileOverride() // 覆蓋已生成文件.outputDir("D://MyBatisPlus"); // 指定輸出目錄}).packageConfig(builder -> {builder.parent("com.bobo.mp") // 設置父包名.moduleName("system") // 設置父包模塊名.pathInfo(Collections.singletonMap(OutputFile.xml, "D://")); // 設置mapperXml生成路徑}).strategyConfig(builder -> {builder.addInclude("t_user") // 設置需要生成的表名.addTablePrefix("t_", "c_"); // 設置過濾表前綴}).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默認的是Velocity引擎模板.execute();}
}

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

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

相關文章

sql注入之sqli-labs-less-1 錯誤注入

輸入?id1 得到登錄頁面&#xff1a; 通過order by 函數試探&#xff1a; 5的時候報錯 試探到3 的時候返回正確的值&#xff1a; 然后繼續注入&#xff1a;?id -1 union select 1,2,3 -- 查看回顯點&#xff1a; 開始查看數據庫內容&#xff1a;id-1 union select 1,databa…

OpenXR 超詳細的spec--API初始化介紹

3.API 初始化 3.2 Function Pointers XrResult xrGetInstanceProcAddr(XrInstance instance,const char* name,PFN_xrVoidFunction* function); instance: XrInstance類型&#…

open-spider開源爬蟲工具:抖音數據采集

在當今信息爆炸的時代&#xff0c;網絡爬蟲作為一種自動化的數據收集工具&#xff0c;其重要性不言而喻。它能夠幫助我們從互聯網上高效地提取和處理數據&#xff0c;為數據分析、市場研究、內容監控等領域提供支持。抖音作為一個全球性的短視頻平臺&#xff0c;擁有海量的用戶…

CKA考生注意:這些Deployment要點能助你一臂之力!

往期精彩文章 : 提升CKA考試勝算&#xff1a;一文帶你全面了解RBAC權限控制&#xff01;揭秘高效運維&#xff1a;如何用kubectl top命令實時監控K8s資源使用情況&#xff1f;CKA認證必備&#xff1a;掌握k8s網絡策略的關鍵要點提高CKA認證成功率&#xff0c;CKA真題中的節點維…

68-解構賦值,迭代器,生成器函數

1.解構賦值(針對數組array&#xff0c;字符串String及對象object以) 結構賦值是一種特殊的語法&#xff0c;通過將各種結構中的元素復制到變量中達到"解構"的目的&#xff0c;但是數組本身沒有改變 1.1解構單層數組 <script>let arr [1,2,3,4,5];//獲取數組…

c++ primer學習筆記(一)

目錄 第一章、c快速入門 重點&#xff1a;類的簡介 第二章 1、基本內置類型 2、字面值常量 1、整型字面值規則 2、浮點字面值規則 3、布爾字面值 4、字符字面值 5、非打印字符的轉義序列 ?編輯 6、字符串字面值 3、變量 1、變量標識符 2、定義和初始化對象 3、…

leetcode 1328.破壞回文串

題目鏈接LeetCode1328 1.題目 給你一個由小寫英文字母組成的回文字符串 palindrome &#xff0c;請你將其中 一個 字符用任意小寫英文字母替換&#xff0c;使得結果字符串的 字典序最小 &#xff0c;且 不是 回文串。 請你返回結果字符串。如果無法做到&#xff0c;則返回一個…

java: 無法訪問org.springframework.web.bind.annotation.RequestMapping......類文件具有錯誤的版本 61.0, 應為 52.0

文章目錄 一、報錯問題二、問題背景三、原因分析四、解決方案 一、報錯問題 java: 無法訪問org.springframework.web.bind.annotation.RequestMapping 錯誤的類文件: /D:/SoftwareInstall/Maven/repository/org/springframework/spring-web/6.0.9/spring-web-6.0.9.jar!/org/s…

latex報錯Repeated entry解決辦法

報錯原因——重復了兩個參考文獻&#xff0c;刪掉一個即可 總結 "Repeated entry"這個錯誤通常出現在你嘗試在LaTeX中多次使用同一個標簽&#xff08;label&#xff09;或者多次插入相同的圖像/表格等時。例如&#xff0c;在LaTeX中&#xff0c;我們可能會為每一個章…

Modern C++ std::any為何要求Tp可拷貝構造?

小問題也會影響設計的思路&#xff0c;某個問題或某種case的探討有助于理解設計的初衷。 聲明&#xff1a;以下_Tp/Tp都是指要放入std::any的對象的類型。 它要求_Tp is_copy_constructible, 僅僅是因為有很多函數的實現調用了Tp的拷貝構造函數嗎&#xff1f;比如說上節提到的初…

動態SQL的處理

學習視頻&#xff1a;3001 動態SQL中的元素_嗶哩嗶哩_bilibili 目錄 1.1為什么學 1.2動態SQL中的元素 條件查詢操作 if 元素 choose、when、otherwise元素 where、trim元素 更新操作 set元素使用場景 復雜查詢操作 foreach 元素中的屬性 ?編輯 迭代數組 迭代List 迭代Map 1…

代碼隨想錄算法訓練營第二十七天|LeetCode93 復原IP地址、LeetCode78 子集、LeetCode90 子集II

93.復原IP地址 思路&#xff1a;要建立一個判斷子字符串是否合法的函數&#xff0c;判斷多種不合法的情況。在回溯函數中&#xff0c;參數除了s,和startindex還需要一個pointNum來記錄句點的數量&#xff0c;當句點的數量等于3時&#xff0c;判斷最后一個子串是否合法&#xf…

第3部分 原理篇2去中心化數字身份標識符(DID)(4)

3.2.3. DID解析 3.2.3.1. DID解析參與方 圖3-5 DID 解析過程 本聰老師&#xff1a;我們之前提到過&#xff0c;DID 解析過程是將 DID 轉換為對應的 DID 文檔。這樣做的目的是驗證 DID 所代表的主體的身份。那么解析過程會涉及哪些概念呢&#xff1f;我們看圖3-&#xff0c;DI…

端智能:面向手機計算環境的端云協同AI技術創新

近年來&#xff0c;隨著移動端設備軟硬件能力的進步&#xff0c;移動端的算力有了很大提升&#xff0c;同時面向移動端的機器學習框架和模型輕量化技術越來越成熟&#xff0c;端上的AI能力逐漸進入大眾視野&#xff0c;端智能在電商領域也開始逐步走向規模化應用。通過持續探索…

leetcode日記(35)跳躍游戲Ⅱ

想了一個晚上&#xff0c;第一個思路是用動態規劃&#xff0c;記錄走到每一個節點需要跳動的最小步數&#xff0c;大致方法是每走到一個節點就遍歷一下前面的全部節點&#xff0c;看看哪個節點可以一部跳到該節點&#xff0c;然后從中選取跳躍步數最小的節點&#xff0c;最后輸…

完美解決多個Echarts圖表自適應窗口、父容器寬高,并進行性能優化

場景 很多時候我們會在繪制echarts圖表時&#xff0c;使用以下方法監聽瀏覽器尺寸變化&#xff0c;讓圖表resize()完成自適應 window.addEventListener(resize, ()>{wordCloudChart.resize() })然后&#xff0c;這種自適應真的足夠周全嘛&#xff1f;有些時候&#xff0c;…

多元正態分布(Multivariate Normal Distribution)

多元正態分布&#xff08;Multivariate Normal Distribution&#xff09;&#xff0c;也稱為多變量高斯分布&#xff0c;是單變量正態分布&#xff08;高斯分布&#xff09;在多維空間中的推廣。它是描述位于多維空間中的隨機向量的分布情況的一種概率分布。多元正態分布在統計…

基于springboot+vue的城鎮保障性住房管理系統(前后端分離)

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

練習 3 Web [ACTF2020 新生賽]Upload

[ACTF2020 新生賽]Upload1 中間有上傳文件的地方&#xff0c;試一下一句話木馬 txt 不讓傳txt 另存為tlyjpg&#xff0c;木馬文件上傳成功 給出了存放目錄&#xff1a; Upload Success! Look here~ ./uplo4d/06a9d80f64fded1e542a95e6d530c70a.jpg 下一步嘗試改木馬文件后綴…

云片 3.1(日常實習)面經

1、什么時候開始學習的前端 2、平常通過哪些方式學習 3、遇到bug怎么解決的 4、元素水平居中 5、display有哪些屬性 6、align-items除了center還有哪些屬性 7、display:none和visibility:hidden區別 8、常用的計量單位有哪些 9、rem和em是相對什么的 10、vw和vh有了解…