MyBatis-Plus里面的增刪改查詳解(化繁為簡(jiǎn))
一. MP 里面的增刪改查
在當(dāng)前盛行的 SpringBoot 項(xiàng)目中,整合持久層這一塊,目前主流的有兩種:JPA 和 MyBatis-Plus。至于哪個(gè)用的更多一些,這個(gè)主要還是看每個(gè)公司的技術(shù)架構(gòu),但硬是要說(shuō)一個(gè)最為常用的,我認(rèn)為是 MyBatis-Plus,而在這里也是對(duì) MyBatis-Plus 的一個(gè)使用進(jìn)行演示
好了,廢話不多說(shuō),直接開(kāi)始吧。為了減少冗余,下面所有 MyBatis-Plus 都使用 MP 來(lái)代替
1.1 項(xiàng)目搭建
項(xiàng)目的創(chuàng)建就直接跳過(guò)了,直接從依賴(lài)開(kāi)始吧。開(kāi)始之前得先弄個(gè)表,表怎么弄都行,下面這個(gè)是我測(cè)試建的,可以參考一下
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(0) NOT NULL AUTO_INCREMENT COMMENT 'id', `name` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用戶(hù)名', `age` int(0) NOT NULL COMMENT '年齡', `mobile` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '手機(jī)號(hào)', `email` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '郵箱', `create_time` datetime(0) NULL DEFAULT NULL COMMENT '創(chuàng)建時(shí)間', `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '創(chuàng)建人', `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更改時(shí)間', `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更改人', `is_delete` int(0) NULL DEFAULT NULL COMMENT '是否刪除 0-未刪除 1-已刪除', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 3554031 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用戶(hù)表' ROW_FORMAT = Dynamic;
依賴(lài)
(1) 目前 MP 的最新版本
<!-- Mybatis-plus 依賴(lài) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>(2) 當(dāng)然,如果你想使用 MP 中的快速生成實(shí)體類(lèi),需要添加 MP 中的一個(gè)工具依賴(lài)且需導(dǎo)入一個(gè)模板引擎的依賴(lài) (模板可以自定義,具體看 MP 官網(wǎng)的例子,這里直接使用 Freemark)
<!-- Mybatis-plus 逆向自動(dòng)生成實(shí)體類(lèi)所需依賴(lài) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>(3) 以上的都是 MP 中所需的依賴(lài),除此之外,當(dāng)然還少不了 SpringWeb 的依賴(lài)了;我們還需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,MySQL 的依賴(lài)也必不可缺
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>逆向工程創(chuàng)建實(shí)體類(lèi)
(1) 其實(shí)這個(gè)有好幾種方法,自己手動(dòng)創(chuàng)建也行;使用 IDEA 中的一些插件也行;或者使用 MP 官網(wǎng)提供的代碼生成模板也行。不管用哪種方法,最終要做的都是一樣的,就是把項(xiàng)目搭起來(lái),實(shí)體類(lèi)弄起來(lái)。
(2) 在這里,就直接使用 MP 官網(wǎng)提供的代碼模板吧。直接在 MP官網(wǎng) —— 指南 —— 代碼生成器 (新) 就能找到

(3) copy 這段代碼到 maven 工程自帶的單元測(cè)試中,然后根據(jù)注釋去修改一下,直接運(yùn)行即可。
(4) 稍微解釋一下怎么使用這個(gè),其實(shí)很簡(jiǎn)單:
- url 、username 、password :即你數(shù)據(jù)庫(kù)連接的地址、用戶(hù)名、密碼
- outputDir :這個(gè)就是注釋的意思,輸出目錄嘛~但注意一下,這個(gè)寫(xiě)到 java 目錄即可。(可參考:“D:\code\test\test-demo\ts-mybatis\src\main\java”)
- parent :父包名 (一般是 com.xxx)
- moduleName :父包名下的模塊名 (即 com.xxx.yyy 這個(gè) yyy 即是這個(gè)模塊名了)
- pathInfo :后面的那個(gè)地址即是 mapperxml 的路徑了 (可參考:“D:\code\test\test-demo\ts-mybatis\src\main\resources\mapper”)
- addInclude :這個(gè)就更簡(jiǎn)單了,你要它幫你生成什么實(shí)體類(lèi),你就把表名往這這里填,注意的是,名字可別寫(xiě)錯(cuò),不然識(shí)別不出來(lái)
- addTablePrefix :這個(gè)就是一些表的前綴在生成到 Java 代碼中的類(lèi)名時(shí),給你去掉前綴,沒(méi)有可以不管他
/**
* mp 逆向工程生成實(shí)體類(lèi)
*/
@Test
void contextLoads() {
FastAutoGenerator.create("jdbc:mysql://localhost:3306/ts_mybatis_db?useUnicode=true&characterEncoding=utf8&useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai", "root", "root")
.globalConfig(builder -> {
builder.author("Peng") // 設(shè)置作者
.enableSwagger() // 開(kāi)啟 swagger 模式
.fileOverride() // 覆蓋已生成文件
.outputDir("D:\\code\\test\\test-demo\\ts-mybatis\\src\\main\\java"); // 指定輸出目錄
})
.packageConfig(builder -> {
builder.parent("com.peng") // 設(shè)置父包名
.moduleName("tsmybatis") // 設(shè)置父包模塊名
.pathInfo(Collections.singletonMap(OutputFile.xml, "D:\\code\\test\\test-demo\\ts-mybatis\\src\\main\\resources\\mapper")); // 設(shè)置mapperXml生成路徑
})
.strategyConfig(builder -> {
builder.addInclude("user") // 設(shè)置需要生成的表名
.addTablePrefix("t_", "c_"); // 設(shè)置過(guò)濾表前綴
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默認(rèn)的是Velocity引擎模板
.execute();
}(5) 注意,這個(gè)如果沒(méi)有加 模板引擎 運(yùn)行的時(shí)候會(huì)報(bào)錯(cuò),加上 Freemarker 依賴(lài)即可
大功告成之后,在你的項(xiàng)目中 MP 就會(huì)把整個(gè)項(xiàng)目基礎(chǔ)模塊都給搭好了,如下圖:

注意,mapper 里面的掃描在 MP 中并不會(huì)幫你生成,所以這個(gè) MapperScan 還需要自己去加上,在啟動(dòng)類(lèi)上面加上一個(gè) @MapperScan 這個(gè)注解,去掃描你的 mapper 文件
@MapperScan(value = {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->"com.peng.tsmybatis.mapper"})1.2 極其便利的單表操作
以下的測(cè)試都是,都是使用 Postman 進(jìn)行測(cè)試的,在這里為了方便測(cè)試,全都是使用 GetMapping 去調(diào)用
1.2.1 增
@Resource
IUserService userService;
@GetMapping("/add")
public boolean add() {
User user = new User();
user.setName("李四");
user.setAge(18);
return userService.save(user);
}
(1) 很簡(jiǎn)單,其實(shí)就是 new 了一個(gè)對(duì)象扔到 MP 的方法里面而已,通過(guò)觀察 IUserService 這個(gè)接口可以發(fā)現(xiàn),它繼承了 IService<User> 且泛型里面放的就是你對(duì)應(yīng)的實(shí)體類(lèi) User,因此在此 service 下的一切 MP 相關(guān)的方法都是針對(duì) User 這個(gè)實(shí)體類(lèi)的操作
(2) 因?yàn)?User 這個(gè)實(shí)體類(lèi)是對(duì)應(yīng)數(shù)據(jù)庫(kù)中的 User 表的,所以需要注意的是當(dāng)前的這個(gè)表設(shè)計(jì)中是否有哪些必填的字段,如果遺漏了(即沒(méi)有 set 那個(gè)值到這個(gè) User 對(duì)象中),那么就會(huì)報(bào)錯(cuò)
(3) 其他就沒(méi)什么需要注意的,你想添加什么內(nèi)容,就往這個(gè) User 對(duì)象中 set 什么進(jìn)去就可以了。成功即返回 true 了,反之則 false 了。另外如果你想查看 MP 幫你執(zhí)行的 SQL 可以在 yaml 或者 properties 中加上以下這段。我這里使用的是 yaml 文件配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印 mybatis-plus 的執(zhí)行日志添加之后訪問(wèn)接口時(shí)便會(huì)有以下日志打印:

(4) 我這里使用的是 Postman 來(lái)測(cè)試這個(gè)接口,返回 true 則表示成功了,此時(shí)去數(shù)據(jù)庫(kù)查看便可發(fā)現(xiàn),多了一條 name = 李四;age = 18 的記錄

1.2.2 批增
(1) 當(dāng)我們有當(dāng)量添加的需求時(shí),不停的去 new 對(duì)象太麻煩了,因此 MP 為我們提供了批量添加的方法。
(2) 還是很簡(jiǎn)單,只是由原來(lái)的一個(gè)對(duì)象變成了集合而已。我們只需要把需要添加的信息,收集成一個(gè)集合即可,然后把這個(gè)集合丟給 MP ,剩下的事情 MP 就會(huì)幫我們?nèi)プ隽?,像這樣:
@GetMapping("/addBatch")
public boolean addBatch() {
List<User> entityList = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
User user = new User();
user.setName("張三" + i);
user.setAge(20 + i);
entityList.add(user);
}
return userService.saveBatch(entityList);
}(3) 通過(guò) Postman 訪問(wèn) http://localhost:8082/addBatch 這個(gè)接口后返回 true,表示成功了,此時(shí)查看數(shù)據(jù)庫(kù)就多了10條數(shù)據(jù):

(4) 玩法很簡(jiǎn)單,只是從一個(gè)對(duì)象,變成了一個(gè)集合而已。所以 MP 還是很方便的,它在原來(lái)的 MyBatis 上增加了很多對(duì)數(shù)據(jù)庫(kù)的操作方法,這些都只是它最基礎(chǔ)的一些操作。
1.2.3 改、批改
(1) 這個(gè)與增其實(shí)是一樣的,唯一的區(qū)別是需要傳一個(gè) ID,不然 MP 不知道你需要對(duì)哪條記錄進(jìn)行修改。所以只需要在上面的基礎(chǔ)上多去 set 一個(gè) id 就可以了,像這樣:
@GetMapping("/update")
public boolean update() {
User entity = new User();
entity.setId(1);
entity.setName("靈兒");
entity.setAge(16);
return userService.updateById(entity);
}
@GetMapping("/updateBatch")
public boolean updateBatch() {
List<User> entityList = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
User user = new User();
user.setId(i + 1);
user.setName("拜月" + i);
user.setAge(30 + i);
entityList.add(user);
}
return userService.updateBatchById(entityList);
}(2) 增和改其實(shí)本質(zhì)上是差不多的,運(yùn)行成功之后,查看數(shù)據(jù)庫(kù)的結(jié)果就變成了這樣:

1.2.4 查
(1) 在 MP 中,查就更簡(jiǎn)單了,因?yàn)樵谖覀儗?shí)際項(xiàng)目中用的最多的就是查詢(xún)了。當(dāng)然往往我們的查詢(xún)會(huì)伴隨著很多條件,在 MP 中給我們提供了條件構(gòu)造器,也是能夠滿(mǎn)足到我們不寫(xiě) SQL 的場(chǎng)景的,這個(gè)后續(xù)再細(xì)聊。
(2) 對(duì)于單表的操作,在 MP 中就一個(gè) list() 的方法就完成了
@GetMapping("/list")
public List<User> list() {
return userService.list();
}(3) 通過(guò) Postman 訪問(wèn)接口后,在 IDEA 中可以看到 MP 中打印出來(lái)的日志

(4) 可能你會(huì)說(shuō),后面那些字段都沒(méi)有數(shù)據(jù),你不想去查出來(lái),浪費(fèi)資源,那應(yīng)該怎么辦呢?這時(shí)就需要我們使用條件構(gòu)造器了,通過(guò)條件構(gòu)造器去進(jìn)行操作
@GetMapping("/list")
public List<User> list() {
QueryWrapper<User> qw = new QueryWrapper<>();
qw.select("id","name","age");
// qw.lambda().select(User::getId, User::getName, User::getAge); JDK8的方法
return userService.list(qw);
}
(5) 注意,括號(hào)里面的字符串需要與你數(shù)據(jù)庫(kù)上能夠?qū)?yīng)上,否者查不出來(lái)的,很好理解,就和自己寫(xiě) SQL 一樣,如果查詢(xún)的字段表中沒(méi)有,顯然也是查不出來(lái)的,MP 只是幫我們把 SQL 給寫(xiě)了而已
12.5 刪、批刪
(1) 這個(gè)其實(shí)和修改類(lèi)似的,也是需要傳一個(gè) ID ,不然 MP 不知道你要?jiǎng)h除的是哪一條數(shù)據(jù)。
(2) 還是一樣,刪除單條記錄,只需要 new 一個(gè)對(duì)象然后傳一個(gè)你要?jiǎng)h除的 ID 進(jìn)去,MP 就會(huì)幫你處理了;而批刪的話則是一個(gè)集合了,也是需要傳 ID 的
@GetMapping("/delete")
public Boolean delete() {
User entity = new User();
entity.setId(1);
return userService.removeById(entity);
}
@GetMapping("/deleteBatch")
public boolean deleteBatch() {
List<User> entityList = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
User user = new User();
user.setId(i + 1);
entityList.add(user);
}
return userService.removeBatchByIds(entityList);
}(3) 與修改稍微有點(diǎn)不一樣的是,你不需要傳修改的值過(guò)去了,只需要傳你要?jiǎng)h除的 ID 即可。
(4) 需要注意的是,MP 的這個(gè)方法是物理刪除的。而在我們實(shí)際開(kāi)發(fā)中,有些業(yè)務(wù)場(chǎng)景是邏輯刪除的,也就是說(shuō)我們的表中有一個(gè)類(lèi)似 is_delete 的字段,刪除時(shí)只需要修改這個(gè)字段由 0 變 1或是由 1 變 0 即可,具體看實(shí)際需求。
(5) 在 MP 中同樣也封裝了邏輯刪除的一些配置,當(dāng)你業(yè)務(wù)是邏輯刪除時(shí),可以在 IDEA 中這樣去配置,告訴 MP 我這里使用的是邏輯刪除,別真把我的記錄給刪除掉了~很簡(jiǎn)單,只需要在邏輯刪除的字段上加一個(gè)注解就可以搞定
@TableLogic(value = "0",delval = "1")
private Integer isDelete;(6) @TableLogic() 就是這個(gè)注解,可以去下載 MP 源碼查看:第一個(gè)參數(shù)是未刪除的值,第二個(gè)參數(shù)是已刪除的值,這里就不放圖片了,感興趣的朋友可以點(diǎn)進(jìn)去瞅瞅。
(7) 除了這種配置方式外,還可以在 application.yaml 或者 application.properties 那些配置文件中進(jìn)行配置,就是說(shuō),當(dāng)你有好多個(gè)實(shí)體類(lèi),而好多個(gè)實(shí)體類(lèi)都是邏輯刪除,那么也就意味著每一個(gè)注解里面的參數(shù)都要寫(xiě)上 value = “0”,delval = “1” 這樣一段,顯然過(guò)于冗余。所以我們可以在配置文件中進(jìn)行一個(gè)全局配置,像這樣:
mybatis-plus:
global-config:
db-config:
logic-delete-field: 1 #刪除
logic-not-delete-value: 0 #未刪除(8) 加了這個(gè)之后,MP 就會(huì)對(duì)你當(dāng)前的實(shí)體類(lèi)所對(duì)應(yīng)的表的 CRUD 操作都是帶上邏輯刪除的一個(gè)邏輯,也就是 is_delete=0 ,就是當(dāng)前記錄是未刪除的。
(9) 如果在前面開(kāi)啟了 MP 的執(zhí)行日志就會(huì)發(fā)現(xiàn),MP 在執(zhí)行 CRUD 的時(shí)候,最后都加上了一個(gè) WHERE is_delete=0 的一個(gè)判斷
1.3 一些小擴(kuò)展
(1) 一般而言,我們?cè)O(shè)計(jì)表的時(shí)候,有一些字段是往往都是亙古不變的,像類(lèi)似 create_time、update_time 那些,像我們當(dāng)前的這個(gè)表:

(2) 像剛剛提到的兩個(gè)字段,在我們每一次添加或者修改的時(shí)候都需要去更新一下時(shí)間,一個(gè)兩個(gè)還好,如果多起來(lái)的話就會(huì)發(fā)現(xiàn)好多代碼都是重復(fù)的,特別冗余。對(duì)此 MP 給我提供了解決方案,可以在進(jìn)行插入、修改的時(shí)候就自動(dòng)幫我們進(jìn)行一個(gè)處理了
(3) 也和上面處理邏輯刪除一樣,一個(gè)注解就完事了,但這個(gè)需要去配置一下,創(chuàng)建一個(gè)配置類(lèi),實(shí)現(xiàn) MetaObjectHandler 這個(gè)接口,重寫(xiě)他的兩個(gè)方法就可以了,如下
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
/*
參數(shù)一: 屬性的名稱(chēng)
參數(shù)二: 你想給這個(gè)屬性設(shè)置的值
參數(shù)三: 元對(duì)象,所有入?yún)⒌?MetaObject 必定是 entity 或其子類(lèi)的 MetaObject
*/
this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("isDelete", 0, metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
}(4) 寫(xiě)好配置類(lèi)之后,在實(shí)體類(lèi)上使用 @TableField() 這個(gè)注解和這個(gè)配置類(lèi)呼應(yīng)上就可以了,像這樣
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Integer isDelete;
(5) 這里的意思就是說(shuō):當(dāng)進(jìn)行 INSERT 操作的時(shí)候,自動(dòng)幫我 createTime、updateTime 字段都設(shè)置成當(dāng)前時(shí)間,而 isDelete 則默認(rèn)設(shè)置成 0;當(dāng) UPDATE 的時(shí)候,只更改 updateTime 的時(shí)候改成當(dāng)前更改的時(shí)間
(6) 實(shí)踐才是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),咱們來(lái)試一下。我這里為了省事,就不用 Postman 去發(fā)請(qǐng)求訪問(wèn)接口了,直接在單元測(cè)試中進(jìn)行
@Resource
private UserMapper userMapper;
@Test
public void test08() {
User user = new User();
user.setName("伏羲");
user.setAge(131);
int result = userMapper.insert(user);
System.out.println(result == 1 ? "添加成功" : "添加失敗");
}從控制臺(tái)打印的日志可以看到,create_time, update_time, is_delete 這三個(gè)值 MP 默認(rèn)幫我去添加了數(shù)據(jù),而添加的數(shù)據(jù)正是我們?cè)谂渲梦募显O(shè)置的

(7) UPDATE 也是一樣的,這里就不演示了
1.4 小結(jié)
在 MP 中對(duì)單表的操作是非常方便的,如果對(duì)于需要連表的一對(duì)多或多對(duì)多,需要在對(duì)應(yīng)的實(shí)體類(lèi)上加一些注解啥的,具體還沒(méi)去研究過(guò);因?yàn)閭€(gè)人覺(jué)得,在一些較為復(fù)雜的表結(jié)構(gòu)中,還不如自己寫(xiě) SQL 來(lái)的快。但是如果是對(duì)單表操作,強(qiáng)烈建議用 MP 自帶的方法,誰(shuí)還寫(xiě) SQL 呢~
當(dāng)然目前為止演示的都是很簡(jiǎn)單的 CRUD,實(shí)際操作上肯定是不一樣的。因?yàn)樵谖覀儗?shí)際操作中,可能會(huì)頻繁的使用 MP 中的條件構(gòu)造器去根據(jù)業(yè)務(wù)不同來(lái)返回?cái)?shù)據(jù)。這個(gè)會(huì)在后面繼續(xù)深入去演示一些 MP 中常用到的方法
另外需要說(shuō)明一下的是,上述演示的代碼中,都是在 Controller層中進(jìn)行的。我這里是為了方便,MP 中的 IService 中已經(jīng)有 CRUD 的方法了,就沒(méi)去到 service 層去操作。按照代碼的規(guī)范,還是更建議去到 service 層中處理業(yè)務(wù)邏輯的。
可能第三點(diǎn)會(huì)有些繞口,基礎(chǔ)好的可能明白我說(shuō)的意思了,而至于基礎(chǔ)稍微沒(méi)那么好的,既然都看到這里了,我還是在簡(jiǎn)單的演示一下標(biāo)準(zhǔn)版吧…比如要返回一個(gè)“用戶(hù)菜單”
(1) Controller
@Resource
private IUserService userService;
@GetMapping("/userMenus")
public List<User> userMenus() {
List<User> result = userService.userMenus();
//如果結(jié)果不為空,返回結(jié)果;否之返回 null
return ObjectUtils.isNotEmpty(result) ? result : null;
}(2) Service,注入一個(gè) Mapper,其中也有 MP 自帶的方法。正常來(lái)說(shuō),上面演示的都應(yīng)該在這里,也就是 Service 層進(jìn)行處理,再返回到 Controller 中
@Autowired
private UserMapper userMapper;
@Override
public List<User> userMenus() {
QueryWrapper<User> qw = new QueryWrapper<>();
qw.lambda().select(User::getId, User::getName, User::getAge);
return userMapper.selectList(qw);
}(3) 如果需要寫(xiě) SQL ,那么也是一樣的,只是跳到 Mapper 這個(gè)接口,然后再跳到 MapperXML 中去寫(xiě)而已,當(dāng)然你也可以在 Mapper 時(shí)使用一些 MyBatis 的注解(@Select、@Update…之類(lèi)的),我這里直接放個(gè)圖片了,就不一步步演示了

或者類(lèi)似這樣

總結(jié)
到此這篇關(guān)于MyBatis-Plus增刪改查的文章就介紹到這了,更多相關(guān)MyBatis-Plus增刪改查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Idea如何使用System.getenv()獲取環(huán)境變量的值
文章介紹了如何在Java中使用`System.getenv()`方法讀取環(huán)境變量的值,并提供了兩種配置環(huán)境變量的方法:?jiǎn)?dòng)項(xiàng)配置和系統(tǒng)環(huán)境變量配置,對(duì)于系統(tǒng)環(huán)境變量,文章特別指出需要重啟電腦或程序才能使其生效2024-11-11
hibernate-validator如何使用校驗(yàn)框架
高效、合理的使用hibernate-validator校驗(yàn)框架可以提高程序的可讀性,以及減少不必要的代碼邏輯,本文主要介紹了hibernate-validator如何使用校驗(yàn)框架,感興趣的可以了解一下2022-04-04
java保證一個(gè)方法只能執(zhí)行一次的問(wèn)題
這篇文章主要介紹了java保證一個(gè)方法只能執(zhí)行一次的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Java數(shù)據(jù)結(jié)構(gòu)之簡(jiǎn)單的連接點(diǎn)(link)實(shí)現(xiàn)方法示例
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之簡(jiǎn)單的連接點(diǎn)(link)實(shí)現(xiàn)方法,涉及java指針指向節(jié)點(diǎn)的相關(guān)使用技巧,需要的朋友可以參考下2017-10-10
Spring擴(kuò)展之基于HandlerMapping實(shí)現(xiàn)接口灰度發(fā)布實(shí)例
這篇文章主要介紹了Spring擴(kuò)展之基于HandlerMapping實(shí)現(xiàn)接口灰度發(fā)布實(shí)例,灰度發(fā)布是指在黑與白之間,能夠平滑過(guò)渡的一種發(fā)布方式,灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時(shí)候就可以發(fā)現(xiàn)、調(diào)整問(wèn)題,以保證其影響度,需要的朋友可以參考下2023-08-08
Mybatis-Plus處理Mysql?Json類(lèi)型字段的詳細(xì)教程

