SpringBoot中MyBatis-Flex的集成和使用實(shí)現(xiàn)
一、MyBatis-Flex 是什么?
MyBatis-Flex是一個(gè)基于MyBatis的數(shù)據(jù)訪問(wèn)框架,專(zhuān)門(mén)為Flex應(yīng)用程序而設(shè)計(jì)的。它提供了一種靈活而高效的方式來(lái)處理Flex應(yīng)用程序中的數(shù)據(jù)訪問(wèn),可以輕松地連接到各種數(shù)據(jù)源,并提供了一些方便的工具和功能,包括對(duì)象關(guān)系映射(ORM)、動(dòng)態(tài)查詢、分頁(yè)、事務(wù)處理等等。它的主要目的是簡(jiǎn)化數(shù)據(jù)訪問(wèn)的過(guò)程,使得開(kāi)發(fā)人員可以更加專(zhuān)注于業(yè)務(wù)邏輯的開(kāi)發(fā),而不是一些瑣碎的數(shù)據(jù)訪問(wèn)細(xì)節(jié)。
總而言之,MyBatis-Flex 能夠極大地提高我們的開(kāi)發(fā)效率和開(kāi)發(fā)體驗(yàn),讓我們有更多的時(shí)間專(zhuān)注于自己的事情。
二、特征?
1、輕量型
- 輕依賴:除了 MyBatis,沒(méi)有任何第三方依賴輕依賴、沒(méi)有任何攔截器
- 輕實(shí)現(xiàn):原理是通過(guò) SqlProvider 的方式實(shí)現(xiàn)
- 輕運(yùn)行:沒(méi)有任何的 Sql 解析,帶來(lái)了這么幾個(gè)好處:1、極高的性能;2、方便對(duì)代碼進(jìn)行跟蹤和調(diào)試; 3、更高的把控性
2、使用靈活
- 支持 Entity 的增刪改查、以及分頁(yè)查詢
- MyBatis-Flex 提供了 Db + Row^靈活 工具,可以無(wú)需實(shí)體類(lèi)對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查以及分頁(yè)查詢
- MyBatis-Flex 內(nèi)置的 QueryWrapper^靈活 可以輕易的幫助我們實(shí)現(xiàn)多表查詢、子查詢和鏈接查詢等常見(jiàn)的 SQL 查詢場(chǎng)景
3、功能強(qiáng)大
- 支持任意關(guān)系型數(shù)據(jù)庫(kù),還可以通過(guò)方言持續(xù)擴(kuò)展
- 支持多主鍵,邏輯刪除、數(shù)據(jù)脫敏、數(shù)據(jù)填充和樂(lè)觀鎖配置等
三、MyBatis Flex的使用
1、創(chuàng)建數(shù)據(jù)庫(kù)表
創(chuàng)建sql如下:
CREATE TABLE IF NOT EXISTS `tb_account`
(
`id` INTEGER PRIMARY KEY auto_increment,
`user_name` VARCHAR(100),
`age` INTEGER,
`birthday` DATETIME
);
INSERT INTO tb_account(id, user_name, age, birthday)
VALUES (1, '張三', 18, '2020-01-11'),
(2, '李四', 19, '2021-03-21');2、創(chuàng)建 Spring Boot 項(xiàng)目,添加 依賴
可以使用 Spring Initializer 快速初始化一個(gè) Spring Boot 工程。
需要添加的 Maven 主要依賴示例:
pom.xml配置如下:
<dependencies>
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot-starter</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
<!-- for test only -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>3、對(duì) Spring Boot 項(xiàng)目進(jìn)行配置
在 application.yml 中配置數(shù)據(jù)源:
# DataSource Config
spring:
datasource:
url: jdbc:mysql://localhost:3306/flex_test
username: root
password: 12345678在 Spring Boot 啟動(dòng)類(lèi)中添加 @MapperScan 注解,掃描 Mapper 文件夾:
@SpringBootApplication
@MapperScan("com.mybatisflex.test.mapper")
public class MybatisFlexTestApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisFlexTestApplication.class, args);
}
}4、編寫(xiě)實(shí)體類(lèi)和 Mapper 接口
這里使用了 Lombok 注解來(lái)簡(jiǎn)化代碼,類(lèi)代碼如下:
@Data
@Table("tb_account")
public class Account {
@Id(keyType = KeyType.Auto)
private Long id;
private String userName;
private Integer age;
private Date birthday;
}- 使用
@Table("tb_account")設(shè)置實(shí)體類(lèi)與表名的映射關(guān)系 - 使用
@Id(keyType = KeyType.Auto)標(biāo)識(shí)主鍵為自增
Mapper 接口繼承 BaseMapper 接口:
public interface AccountMapper extends BaseMapper<Account> {
}這部分也可以使用 MyBatis-Flex 的代碼生成器來(lái)生,功能非常強(qiáng)大的。詳情進(jìn)入:代碼生成器章節(jié) 了解。
5、開(kāi)始使用
添加測(cè)試類(lèi),進(jìn)行功能測(cè)試:
import static com.mybatisflex.test.entity.table.AccountTableDef.ACCOUNT;
@SpringBootTest
class MybatisFlexTestApplicationTests {
@Autowired
private AccountMapper accountMapper;
@Test
void contextLoads() {
QueryWrapper queryWrapper = QueryWrapper.create()
.select()
.where(ACCOUNT.AGE.eq(18));
Account account = accountMapper.selectOneByQuery(queryWrapper);
System.out.println(account);
}
}控制臺(tái)輸出:
Account(id=1, userName=張三, age=18, birthday=Sat Jan 11 00:00:00 CST 2020)
以上的 示例 中, ACCOUNT 為 MyBatis-Flex 通過(guò) APT 自動(dòng)生成,只需通過(guò)靜態(tài)導(dǎo)入即可,無(wú)需手動(dòng)編碼。
點(diǎn)擊查看更多APT文檔 APT 文檔。
若覺(jué)得 APT 使用不習(xí)慣,也可以使用代碼生成器來(lái)生成。點(diǎn)擊 代碼生成器文檔 了解。
四、同類(lèi)框架「功能」對(duì)比
MyBatis-Flex 主要是和 MyBatis-Plus 與 Fluent-MyBatis 對(duì)比,內(nèi)容來(lái)源其官網(wǎng)、git 或者 網(wǎng)絡(luò)文章,若有錯(cuò)誤歡迎糾正。
- MyBatis-Plus:老牌的 MyBatis 增強(qiáng)框架,開(kāi)源于 2016 年。
- Fluent-MyBatis:阿里云開(kāi)發(fā)的 MyBatis 增強(qiáng)框架(來(lái)自于阿里云·云效產(chǎn)品團(tuán)隊(duì))
功能對(duì)比:
| 功能或特點(diǎn) | MyBatis-Flex | MyBatis-Plus | Fluent-MyBatis |
|---|---|---|---|
| 對(duì) entity 的基本增刪改查 | ? | ? | ? |
| 分頁(yè)查詢 | ? | ? | ? |
| 分頁(yè)查詢之總量緩存 | ? | ? | ? |
| 分頁(yè)查詢無(wú) SQL 解析設(shè)計(jì)(更輕量,及更高性能) | ? | ? | ? |
| 多表查詢: from 多張表 | ? | ? | ? |
| 多表查詢: left join、inner join 等等 | ? | ? | ? |
| 多表查詢: union,union all | ? | ? | ? |
| 單主鍵配置 | ? | ? | ? |
| 多種 id 生成策略 | ? | ? | ? |
| 支持多主鍵、復(fù)合主鍵 | ? | ? | ? |
| 字段的 typeHandler 配置 | ? | ? | ? |
| 除了 MyBatis,無(wú)其他第三方依賴(更輕量) | ? | ? | ? |
| QueryWrapper 是否支持在微服務(wù)項(xiàng)目下進(jìn)行 RPC 傳輸 | ? | ? | 未知 |
| 邏輯刪除 | ? | ? | ? |
| 樂(lè)觀鎖 | ? | ? | ? |
| SQL 審計(jì) | ? | ? | ? |
| 數(shù)據(jù)填充 | ? | ? | ? |
| 數(shù)據(jù)脫敏 | ? | ?? (收費(fèi)) | ? |
| 字段權(quán)限 | ? | ?? (收費(fèi)) | ? |
| 字段加密 | ? | ?? (收費(fèi)) | ? |
| 字典回寫(xiě) | ? | ?? (收費(fèi)) | ? |
| Db + Row | ? | ? | ? |
| Entity 監(jiān)聽(tīng) | ? | ? | ? |
| 多數(shù)據(jù)源支持 | ? | 借助其他框架或收費(fèi) | ? |
多數(shù)據(jù)源是否支持 Spring 的事務(wù)管理,比如 @Transactional 和 TransactionTemplate 等 | ? | ? | ? |
| 多數(shù)據(jù)源是否支持 "非Spring" 項(xiàng)目 | ? | ? | ? |
| 多租戶 | ? | ? | ? |
| 動(dòng)態(tài)表名 | ? | ? | ? |
| 動(dòng)態(tài) Schema | ? | ? | ? |
以上內(nèi)容來(lái)自第三方相關(guān)產(chǎn)品的官方文檔或第三方平臺(tái),若有錯(cuò)誤,歡迎糾正。
五、同類(lèi)框架「性能」對(duì)比
本文主要是展示了 MyBatis-Flex 和 Mybaits-Plus 的「性能」對(duì)比。Mybaits-Plus 是一個(gè)非常優(yōu)秀 Mybaits 增強(qiáng)框架, 其開(kāi)源于 2016 年,有很多的成功案例。
測(cè)試方法:
使用 h2 數(shù)據(jù)庫(kù),在初始化的時(shí)候分別為 mybatis-flex 和 mybatis-plus 創(chuàng)建兩個(gè)不同的數(shù)據(jù)庫(kù), 但是完全一樣的數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)內(nèi)容和數(shù)據(jù)量(每個(gè)庫(kù) 2w 條數(shù)據(jù))。
開(kāi)始之前先進(jìn)行預(yù)熱,之后通過(guò)打印時(shí)間戳的方式進(jìn)行對(duì)比,誰(shuí)消耗的時(shí)間越少,則性能越高(每次測(cè)試 10 輪)。
1、測(cè)試單條數(shù)據(jù)查詢?
MyBatis-Flex 的代碼如下:
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.where(FLEX_ACCOUNT.ID.ge(100)
.or(FLEX_ACCOUNT.USER_NAME.eq("admin" + ThreadLocalRandom.current().nextInt(10000))));
mapper.selectOneByQuery(queryWrapper);MyBatis-Plus 的代碼如下:
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.ge("id", 100);
queryWrapper.or();
queryWrapper.eq("user_name", "admin" + ThreadLocalRandom.current().nextInt(10000));
queryWrapper.last("limit 1");
mapper.selectOne(queryWrapper);10 輪的測(cè)試結(jié)果:
---------------
>>>>>>>testFlexSelectOne:134
>>>>>>>testPlusSelectOneWithLambda:989
>>>>>>>testPlusSelectOne:830
---------------
>>>>>>>testFlexSelectOne:75
>>>>>>>testPlusSelectOneWithLambda:732
>>>>>>>testPlusSelectOne:795
---------------
>>>>>>>testFlexSelectOne:65
>>>>>>>testPlusSelectOneWithLambda:938
>>>>>>>testPlusSelectOne:714
---------------
>>>>>>>testFlexSelectOne:105
>>>>>>>testPlusSelectOneWithLambda:740
>>>>>>>testPlusSelectOne:669
---------------
>>>>>>>testFlexSelectOne:57
>>>>>>>testPlusSelectOneWithLambda:691
>>>>>>>testPlusSelectOne:773
---------------
>>>>>>>testFlexSelectOne:65
>>>>>>>testPlusSelectOneWithLambda:693
>>>>>>>testPlusSelectOne:695
---------------
>>>>>>>testFlexSelectOne:56
>>>>>>>testPlusSelectOneWithLambda:754
>>>>>>>testPlusSelectOne:665
---------------
>>>>>>>testFlexSelectOne:56
>>>>>>>testPlusSelectOneWithLambda:714
>>>>>>>testPlusSelectOne:717
---------------
>>>>>>>testFlexSelectOne:57
>>>>>>>testPlusSelectOneWithLambda:696
>>>>>>>testPlusSelectOne:671
---------------
>>>>>>>testFlexSelectOne:59
>>>>>>>testPlusSelectOneWithLambda:739
>>>>>>>testPlusSelectOne:659
測(cè)試結(jié)論
MyBatis-Flex 的查詢單條數(shù)據(jù)的速度,大概是 MyBatis-Plus 的 5 ~ 10+ 倍。
2、測(cè)試列表(List)數(shù)據(jù)查詢?
要求返回的數(shù)據(jù)為 10 條數(shù)據(jù)。
MyBatis-Flex 的代碼如下:
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.where(FLEX_ACCOUNT.ID.ge(100).or(FLEX_ACCOUNT.USER_NAME
.eq("admin" + ThreadLocalRandom.current().nextInt(10000))))
.limit(10);
mapper.selectListByQuery(queryWrapper);MyBatis-Plus 的代碼如下:
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.ge("id", 100);
queryWrapper.or();
queryWrapper.eq("user_name", "admin" + ThreadLocalRandom.current().nextInt(10000));
queryWrapper.last("limit 10");
mapper.selectList(queryWrapper);10 輪的測(cè)試結(jié)果:
---------------
>>>>>>>testFlexSelectTop10:90
>>>>>>>testPlusSelectTop10WithLambda:743
>>>>>>>testPlusSelectTop10:678
---------------
>>>>>>>testFlexSelectTop10:85
>>>>>>>testPlusSelectTop10WithLambda:692
>>>>>>>testPlusSelectTop10:684
---------------
>>>>>>>testFlexSelectTop10:84
>>>>>>>testPlusSelectTop10WithLambda:692
>>>>>>>testPlusSelectTop10:670
---------------
>>>>>>>testFlexSelectTop10:85
>>>>>>>testPlusSelectTop10WithLambda:737
>>>>>>>testPlusSelectTop10:667
---------------
>>>>>>>testFlexSelectTop10:85
>>>>>>>testPlusSelectTop10WithLambda:691
>>>>>>>testPlusSelectTop10:684
---------------
>>>>>>>testFlexSelectTop10:97
>>>>>>>testPlusSelectTop10WithLambda:760
>>>>>>>testPlusSelectTop10:666
---------------
>>>>>>>testFlexSelectTop10:80
>>>>>>>testPlusSelectTop10WithLambda:673
>>>>>>>testPlusSelectTop10:637
---------------
>>>>>>>testFlexSelectTop10:81
>>>>>>>testPlusSelectTop10WithLambda:653
>>>>>>>testPlusSelectTop10:639
---------------
>>>>>>>testFlexSelectTop10:82
>>>>>>>testPlusSelectTop10WithLambda:659
>>>>>>>testPlusSelectTop10:636
---------------
>>>>>>>testFlexSelectTop10:81
>>>>>>>testPlusSelectTop10WithLambda:654
>>>>>>>testPlusSelectTop10:656
測(cè)試結(jié)論
MyBatis-Flex 的查詢 10 條數(shù)據(jù)的速度,大概是 MyBatis-Plus 的 5~10 倍左右。
3、分頁(yè)查詢?
MyBatis-Flex 的代碼如下:
QueryWrapper queryWrapper = new QueryWrapper()
.where(FLEX_ACCOUNT.ID.ge(100));
mapper.paginate(page, pageSize, 20000, queryWrapper);MyBatis-Plus 的代碼如下:
LambdaQueryWrapper<PlusAccount> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.ge(PlusAccount::getId, 100);
queryWrapper.eq(PlusAccount::getEmail, "michael@gmail.com");
Page<PlusAccount> p = Page.of(page, pageSize, 20000, false);
mapper.selectPage(p, queryWrapper);10 輪的測(cè)試結(jié)果:
---------------
>>>>>>>testFlexPaginate:90
>>>>>>>testPlusPaginate:671
---------------
>>>>>>>testFlexPaginate:78
>>>>>>>testPlusPaginate:643
---------------
>>>>>>>testFlexPaginate:80
>>>>>>>testPlusPaginate:638
---------------
>>>>>>>testFlexPaginate:79
>>>>>>>testPlusPaginate:613
---------------
>>>>>>>testFlexPaginate:75
>>>>>>>testPlusPaginate:627
---------------
>>>>>>>testFlexPaginate:72
>>>>>>>testPlusPaginate:606
---------------
>>>>>>>testFlexPaginate:69
>>>>>>>testPlusPaginate:585
---------------
>>>>>>>testFlexPaginate:70
>>>>>>>testPlusPaginate:589
---------------
>>>>>>>testFlexPaginate:69
>>>>>>>testPlusPaginate:586
---------------
>>>>>>>testFlexPaginate:68
>>>>>>>testPlusPaginate:585
測(cè)試結(jié)論
Mybatis-Flex 的分頁(yè)查詢速度,大概是 Mybatis-Plus 的 5~10 倍左右。
4、數(shù)據(jù)更新?
Mybatis-Flex 的代碼如下:
FlexAccount flexAccount = new FlexAccount();
flexAccount.setUserName("testInsert" + i);
flexAccount.setNickname("testInsert" + i);
flexAccount.addOption("key1", "value1");
flexAccount.addOption("key2", "value2");
flexAccount.addOption("key3", "value3");
flexAccount.addOption("key4", "value4");
flexAccount.addOption("key5", "value5");
QueryWrapper queryWrapper = QueryWrapper.create()
.where(FLEX_ACCOUNT.ID.ge(9200))
.and(FLEX_ACCOUNT.ID.le(9300))
.and(FLEX_ACCOUNT.USER_NAME.like("admin"))
.and(FLEX_ACCOUNT.NICKNAME.like("admin"));
mapper.updateByQuery(flexAccount, queryWrapper);Mybatis-Plus 的代碼如下:
PlusAccount plusAccount = new PlusAccount();
plusAccount.setUserName("testInsert" + i);
plusAccount.setNickname("testInsert" + i);
plusAccount.addOption("key1", "value1");
plusAccount.addOption("key2", "value2");
plusAccount.addOption("key3", "value3");
plusAccount.addOption("key4", "value4");
plusAccount.addOption("key5", "value5");
LambdaUpdateWrapper<PlusAccount> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.ge(PlusAccount::getId, 9000);
updateWrapper.le(PlusAccount::getId, 9100);
updateWrapper.like(PlusAccount::getUserName, "admin");
updateWrapper.like(PlusAccount::getNickname, "admin");
mapper.update(plusAccount, lambdaUpdateWrapper);10 輪的測(cè)試結(jié)果:
---------------
>>>>>>>testFlexUpdate:58
>>>>>>>testPlusUpdate:524
---------------
>>>>>>>testFlexUpdate:51
>>>>>>>testPlusUpdate:503
---------------
>>>>>>>testFlexUpdate:49
>>>>>>>testPlusUpdate:490
---------------
>>>>>>>testFlexUpdate:45
>>>>>>>testPlusUpdate:472
---------------
>>>>>>>testFlexUpdate:48
>>>>>>>testPlusUpdate:470
---------------
>>>>>>>testFlexUpdate:44
>>>>>>>testPlusUpdate:460
---------------
>>>>>>>testFlexUpdate:43
>>>>>>>testPlusUpdate:459
---------------
>>>>>>>testFlexUpdate:44
>>>>>>>testPlusUpdate:461
---------------
>>>>>>>testFlexUpdate:40
>>>>>>>testPlusUpdate:444
---------------
>>>>>>>testFlexUpdate:41
>>>>>>>testPlusUpdate:444
測(cè)試結(jié)論
Mybatis-Flex 的數(shù)據(jù)更新速度,大概是 Mybatis-Plus 的 5~10+ 倍。
總之性能測(cè)試結(jié)果:
不論是MyBatis-Flex 單條查詢分頁(yè)查詢還是數(shù)據(jù)更新,速度均是 MyBatis-Plus 的 5~10 倍左右!??!
六、MyBatis-Flex 支持的數(shù)據(jù)庫(kù)
MyBatis-Flex 支持的數(shù)據(jù)庫(kù)類(lèi)型,如下表格所示,我們還可以通過(guò)自定義方言的方式,持續(xù)添加更多的數(shù)據(jù)庫(kù)支持。
| 數(shù)據(jù)庫(kù) | 描述 |
|---|---|
| mysql | MySQL 數(shù)據(jù)庫(kù) |
| mariadb | MariaDB 數(shù)據(jù)庫(kù) |
| oracle | Oracle11g 及以下數(shù)據(jù)庫(kù) |
| oracle12c | Oracle12c 及以上數(shù)據(jù)庫(kù) |
| db2 | DB2 數(shù)據(jù)庫(kù) |
| H2 | H2 數(shù)據(jù)庫(kù) |
| hsql | HSQL 數(shù)據(jù)庫(kù) |
| sqlite | SQLite 數(shù)據(jù)庫(kù) |
| postgresql | PostgreSQL 數(shù)據(jù)庫(kù) |
| sqlserver2005 | SQLServer2005 數(shù)據(jù)庫(kù) |
| sqlserver | SQLServer 數(shù)據(jù)庫(kù) |
| dm | 達(dá)夢(mèng)數(shù)據(jù)庫(kù) |
| xugu | 虛谷數(shù)據(jù)庫(kù) |
| kingbasees | 人大金倉(cāng)數(shù)據(jù)庫(kù) |
| phoenix | Phoenix HBase 數(shù)據(jù)庫(kù) |
| gauss | Gauss 數(shù)據(jù)庫(kù) |
| clickhouse | ClickHouse 數(shù)據(jù)庫(kù) |
| gbase | 南大通用(華庫(kù))數(shù)據(jù)庫(kù) |
| gbase-8s | 南大通用數(shù)據(jù)庫(kù) GBase 8s |
| oscar | 神通數(shù)據(jù)庫(kù) |
| sybase | Sybase ASE 數(shù)據(jù)庫(kù) |
| OceanBase | OceanBase 數(shù)據(jù)庫(kù) |
| Firebird | Firebird 數(shù)據(jù)庫(kù) |
| derby | Derby 數(shù)據(jù)庫(kù) |
| highgo | 瀚高數(shù)據(jù)庫(kù) |
| cubrid | CUBRID 數(shù)據(jù)庫(kù) |
| goldilocks | GOLDILOCKS 數(shù)據(jù)庫(kù) |
| csiidb | CSIIDB 數(shù)據(jù)庫(kù) |
| hana | SAP_HANA 數(shù)據(jù)庫(kù) |
| impala | Impala 數(shù)據(jù)庫(kù) |
| vertica | Vertica 數(shù)據(jù)庫(kù) |
| xcloud | 行云數(shù)據(jù)庫(kù) |
| redshift | 亞馬遜 redshift 數(shù)據(jù)庫(kù) |
| openGauss | 華為 openGauss 數(shù)據(jù)庫(kù) |
| TDengine | TDengine 數(shù)據(jù)庫(kù) |
| informix | Informix 數(shù)據(jù)庫(kù) |
| greenplum | Greenplum 數(shù)據(jù)庫(kù) |
| uxdb | 優(yōu)炫數(shù)據(jù)庫(kù) |
| Doris | Doris數(shù)據(jù)庫(kù) |
| Hive SQL | Hive 數(shù)據(jù)庫(kù) |
| lealone | Lealone 數(shù)據(jù)庫(kù) |
| sinodb | 星瑞格數(shù)據(jù)庫(kù) |
到此這篇關(guān)于SpringBoot中MyBatis-Flex的集成和使用實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot MyBatis-Flex集成內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用重入鎖實(shí)現(xiàn)線程同步的示例代碼
在多線程環(huán)境中,為保證對(duì)共享資源的安全訪問(wèn),常用的同步手段是 synchronized 關(guān)鍵字,但 synchronized 存在局限,本項(xiàng)目旨在通過(guò)示例演示如何使用 ReentrantLock 實(shí)現(xiàn)線程同步,替代 synchronized,并展示其高級(jí)功能,需要的朋友可以參考下2025-07-07
Java實(shí)現(xiàn)商城訂單超時(shí)取消功能
大多數(shù)的B2C商城項(xiàng)目都會(huì)有限時(shí)活動(dòng),當(dāng)用戶下單后都會(huì)有支付超時(shí)時(shí)間,當(dāng)訂單超時(shí)后訂單的狀態(tài)就會(huì)自動(dòng)變成已取消 ,這個(gè)功能的實(shí)現(xiàn)有很多種方法,本文的實(shí)現(xiàn)方法適合大多數(shù)比較小的商城使用。具體實(shí)現(xiàn)方式可以跟隨小編一起看看吧2019-12-12
SpringBoot2中使用@RequestHeader獲取請(qǐng)求頭的方法
springMVC/SpringBoot中提供了@RequestHeader注解用來(lái)獲取請(qǐng)求頭。本文就詳細(xì)的來(lái)介紹一下如何使用,感興趣的可以了解下2021-10-10
Java中HashTable和HashMap的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
HashTable和HashMap主要的區(qū)別有:線程安全性,同步(synchronization),以及速度。接下來(lái)通過(guò)本文給大家簡(jiǎn)單介紹下HashTable和HashMap的區(qū)別,需要的的朋友參考下吧2017-04-04
Java中l(wèi)og4j注解詳解與實(shí)戰(zhàn)指南(附具體示例)
日志是軟件開(kāi)發(fā)中不可或缺的一部分,它能夠幫助開(kāi)發(fā)者追蹤程序的運(yùn)行狀態(tài),診斷問(wèn)題,以及監(jiān)控系統(tǒng)性能,這篇文章主要介紹了Java中l(wèi)og4j注解詳解與實(shí)戰(zhàn)的相關(guān)資料,需要的朋友可以參考下2025-07-07
Java中System.setProperty()用法與實(shí)際應(yīng)用場(chǎng)景
System.setProperty是Java中用于設(shè)置系統(tǒng)屬性的方法,它允許我們?cè)谶\(yùn)行時(shí)為Java虛擬機(jī)(JVM)或應(yīng)用程序設(shè)置一些全局的系統(tǒng)屬性,下面這篇文章主要給大家介紹了關(guān)于Java中System.setProperty()用法與實(shí)際應(yīng)用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下2024-04-04
Java?springBoot初步使用websocket的代碼示例
這篇文章主要介紹了Java?springBoot初步使用websocket的相關(guān)資料,WebSocket是一種實(shí)現(xiàn)實(shí)時(shí)雙向通信的協(xié)議,適用于需要實(shí)時(shí)通信的應(yīng)用程序,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03

