最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中MyBatis-Flex的集成和使用實(shí)現(xiàn)

 更新時(shí)間:2023年12月13日 10:34:25   作者:小筱在線  
MyBatis-Flex是一個(gè)基于MyBatis的數(shù)據(jù)訪問(wèn)框架,MyBatis-Flex能夠極大地提高我們的開(kāi)發(fā)效率和開(kāi)發(fā)體驗(yàn),本文主要介紹了SpringBoot中MyBatis-Flex的集成和使用實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下

一、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)注于自己的事情。

官方文檔:MyBatis Flex官方網(wǎng)站

二、特征?

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-FlexMyBatis-PlusFluent-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ù)描述
mysqlMySQL 數(shù)據(jù)庫(kù)
mariadbMariaDB 數(shù)據(jù)庫(kù)
oracleOracle11g 及以下數(shù)據(jù)庫(kù)
oracle12cOracle12c 及以上數(shù)據(jù)庫(kù)
db2DB2 數(shù)據(jù)庫(kù)
H2H2 數(shù)據(jù)庫(kù)
hsqlHSQL 數(shù)據(jù)庫(kù)
sqliteSQLite 數(shù)據(jù)庫(kù)
postgresqlPostgreSQL 數(shù)據(jù)庫(kù)
sqlserver2005SQLServer2005 數(shù)據(jù)庫(kù)
sqlserverSQLServer 數(shù)據(jù)庫(kù)
dm達(dá)夢(mèng)數(shù)據(jù)庫(kù)
xugu虛谷數(shù)據(jù)庫(kù)
kingbasees人大金倉(cāng)數(shù)據(jù)庫(kù)
phoenixPhoenix HBase 數(shù)據(jù)庫(kù)
gaussGauss 數(shù)據(jù)庫(kù)
clickhouseClickHouse 數(shù)據(jù)庫(kù)
gbase南大通用(華庫(kù))數(shù)據(jù)庫(kù)
gbase-8s南大通用數(shù)據(jù)庫(kù) GBase 8s
oscar神通數(shù)據(jù)庫(kù)
sybaseSybase ASE 數(shù)據(jù)庫(kù)
OceanBaseOceanBase 數(shù)據(jù)庫(kù)
FirebirdFirebird 數(shù)據(jù)庫(kù)
derbyDerby 數(shù)據(jù)庫(kù)
highgo瀚高數(shù)據(jù)庫(kù)
cubridCUBRID 數(shù)據(jù)庫(kù)
goldilocksGOLDILOCKS 數(shù)據(jù)庫(kù)
csiidbCSIIDB 數(shù)據(jù)庫(kù)
hanaSAP_HANA 數(shù)據(jù)庫(kù)
impalaImpala 數(shù)據(jù)庫(kù)
verticaVertica 數(shù)據(jù)庫(kù)
xcloud行云數(shù)據(jù)庫(kù)
redshift亞馬遜 redshift 數(shù)據(jù)庫(kù)
openGauss華為 openGauss 數(shù)據(jù)庫(kù)
TDengineTDengine 數(shù)據(jù)庫(kù)
informixInformix 數(shù)據(jù)庫(kù)
greenplumGreenplum 數(shù)據(jù)庫(kù)
uxdb優(yōu)炫數(shù)據(jù)庫(kù)
DorisDoris數(shù)據(jù)庫(kù)
Hive SQLHive 數(shù)據(jù)庫(kù)
lealoneLealone 數(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)線程同步的示例代碼

    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
  • 深入學(xué)習(xí)Java 熱部署的知識(shí)

    深入學(xué)習(xí)Java 熱部署的知識(shí)

    對(duì)于Java應(yīng)用程序來(lái)說(shuō),熱部署就是在運(yùn)行時(shí)更新Java類(lèi)文件。在基于Java的應(yīng)用服務(wù)器實(shí)現(xiàn)熱部署的過(guò)程中,類(lèi)裝入器扮演著重要的角色。大多數(shù)基于Java的應(yīng)用服務(wù)器,包括EJB服務(wù)器和Servlet容器,都支持熱部署。,需要的朋友可以參考下
    2019-06-06
  • Java實(shí)現(xiàn)商城訂單超時(shí)取消功能

    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)求頭的方法

    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é)院整理

    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中的volatile關(guān)鍵字原理深入解析

    Java中的volatile關(guān)鍵字原理深入解析

    這篇文章主要介紹了Java中的volatile關(guān)鍵字原理深入解析,volatile是Java 編程語(yǔ)言允許線程訪問(wèn)共享變量,為了確保共享變量能被準(zhǔn)確和一致地更新,線程應(yīng)該確保通過(guò)排他鎖單獨(dú)獲得這個(gè)變量,需要的朋友可以參考下
    2023-12-12
  • Java 實(shí)現(xiàn)圖片壓縮的兩種方法

    Java 實(shí)現(xiàn)圖片壓縮的兩種方法

    這篇文章主要介紹了Java 實(shí)現(xiàn)圖片壓縮的兩種方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • Java中l(wèi)og4j注解詳解與實(shí)戰(zhàn)指南(附具體示例)

    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)景

    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的代碼示例

    這篇文章主要介紹了Java?springBoot初步使用websocket的相關(guān)資料,WebSocket是一種實(shí)現(xiàn)實(shí)時(shí)雙向通信的協(xié)議,適用于需要實(shí)時(shí)通信的應(yīng)用程序,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03

最新評(píng)論

华亭县| 鹤山市| 达日县| 赤壁市| 鄂托克前旗| 富锦市| 台中县| 锡林浩特市| 保山市| 陕西省| 安泽县| 昌图县| 福建省| 台东县| 漳平市| 曲麻莱县| 宁安市| 微山县| 沁水县| 南充市| 福鼎市| 桃园市| 赣榆县| 汕头市| 金坛市| 康定县| 武定县| 共和县| 尉氏县| 五华县| 睢宁县| 武夷山市| 诸城市| 普定县| 岑溪市| 泾阳县| 精河县| 邛崃市| 峡江县| 满城县| 海宁市|