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

一文搞懂MyBatis中TypeHandler機(jī)制

 更新時(shí)間:2025年08月27日 10:53:44   作者:獨(dú)淚了無(wú)痕  
本文介紹了MyBatis中的TypeHandler機(jī)制,用于處理Java類(lèi)型與數(shù)據(jù)庫(kù)類(lèi)型之間的轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

在進(jìn)行項(xiàng)目開(kāi)發(fā)時(shí),我們經(jīng)常需要處理各種類(lèi)型的數(shù)據(jù)轉(zhuǎn)換問(wèn)題。特別是在使用數(shù)據(jù)庫(kù)時(shí),常常會(huì)遇到需要將數(shù)據(jù)庫(kù)中的字符串字段與 Java 對(duì)象之間的復(fù)雜轉(zhuǎn)換。MyBatis 是一種流行的持久層框架,它提供了強(qiáng)大的數(shù)據(jù)訪問(wèn)功能,同時(shí)與 Spring Boot 等微服務(wù)技術(shù)棧無(wú)縫集成。為了解決這一問(wèn)題,MyBatis 提供了一個(gè)強(qiáng)大的機(jī)制——TypeHandler,其是 MyBatis 中一個(gè)用于處理 Java 類(lèi)型和數(shù)據(jù)庫(kù)類(lèi)型轉(zhuǎn)換的組件,它在 MyBatis 進(jìn)行參數(shù)設(shè)置和結(jié)果映射時(shí)起著至關(guān)重要的作用。本文將詳細(xì)介紹TypeHandler 的使用方法,包括自定義 TypeHandler 的創(chuàng)建和注冊(cè),以及在實(shí)際項(xiàng)目中的應(yīng)用示例。

一、TypeHandler基礎(chǔ)

1.1 什么是 TypeHandler

在 MyBatis 中,TypeHandler (類(lèi)型處理器)用于處理 Java 類(lèi)型和 JDBC 類(lèi)型之間的映射和轉(zhuǎn)換。例如,當(dāng)數(shù)據(jù)庫(kù)中的字段是 JSON 字符串時(shí),可以將其轉(zhuǎn)化為 Java 對(duì)象。每當(dāng) MyBatis 在執(zhí)行 SQL 操作時(shí),都會(huì)使用 TypeHandler 來(lái)確保數(shù)據(jù)類(lèi)型的正確轉(zhuǎn)換。在執(zhí)行 SQL 語(yǔ)句時(shí),TypeHandler 將 Java 類(lèi)型轉(zhuǎn)換為數(shù)據(jù)庫(kù)可以理解的類(lèi)型。在讀取數(shù)據(jù)庫(kù)結(jié)果時(shí),TypeHandler 將數(shù)據(jù)庫(kù)類(lèi)型轉(zhuǎn)換回 Java 類(lèi)型。這一過(guò)程對(duì)于開(kāi)發(fā)者是透明的,由 MyBatis 框架內(nèi)部自動(dòng)完成。

在 Mybatis 中給我們內(nèi)置提供了多種常用的類(lèi)型處理器,這也就是為什么我們?cè)谌粘i_(kāi)發(fā)過(guò)程中,不需要關(guān)心 Java 和數(shù)據(jù)庫(kù)之間的類(lèi)型問(wèn)題,Java 代碼和 MySQL 等數(shù)據(jù)庫(kù)之間卻能自動(dòng)進(jìn)行轉(zhuǎn)化的原因。

1.2 TypeHandler的工作原理

TypeHandler 在 MyBatis 中是一個(gè)核心概念,其工作原理主要涉及Java類(lèi)型和JDBC類(lèi)型之間的映射和轉(zhuǎn)換。

  • 當(dāng)MyBatis執(zhí)行一個(gè)預(yù)編譯的SQL語(yǔ)句(如INSERT、UPDATE等)時(shí),它需要將Java對(duì)象中的屬性值設(shè)置到SQL語(yǔ)句中對(duì)應(yīng)的占位符上。
    1. MyBatis會(huì)根據(jù)映射配置找到對(duì)應(yīng)的TypeHandler實(shí)例,這個(gè)映射配置可以在MyBatis的配置文件或者M(jìn)apper的XML文件中定義。
    2. TypeHandler實(shí)例會(huì)接收到Java對(duì)象中的屬性值,并將其轉(zhuǎn)換為JDBC能夠識(shí)別的類(lèi)型,這個(gè)轉(zhuǎn)換過(guò)程是根據(jù)Java類(lèi)型和JDBC類(lèi)型之間的映射關(guān)系來(lái)實(shí)現(xiàn)的。
    3. 轉(zhuǎn)換后的值會(huì)被設(shè)置到PreparedStatement對(duì)象中對(duì)應(yīng)的占位符上,以便數(shù)據(jù)庫(kù)能夠正確解析和執(zhí)行SQL語(yǔ)句。
  • 當(dāng)數(shù)據(jù)庫(kù)執(zhí)行查詢(xún)操作并返回結(jié)果集時(shí),MyBatis需要將結(jié)果集中的數(shù)據(jù)提取出來(lái),并轉(zhuǎn)換為Java對(duì)象中的對(duì)應(yīng)屬性類(lèi)型。
    1. MyBatis會(huì)根據(jù)映射配置找到對(duì)應(yīng)的TypeHandler實(shí)例。
    2. TypeHandler實(shí)例會(huì)從ResultSet對(duì)象中提取數(shù)據(jù),這個(gè)提取過(guò)程是根據(jù)數(shù)據(jù)庫(kù)字段和Java屬性之間的映射關(guān)系來(lái)實(shí)現(xiàn)的。
    3. 提取出的數(shù)據(jù)會(huì)被轉(zhuǎn)換為Java對(duì)象中的對(duì)應(yīng)屬性類(lèi)型,這個(gè)轉(zhuǎn)換過(guò)程同樣是根據(jù)Java類(lèi)型和JDBC類(lèi)型之間的映射關(guān)系來(lái)實(shí)現(xiàn)的。
    4. 轉(zhuǎn)換后的值會(huì)被設(shè)置到Java對(duì)象中對(duì)應(yīng)的屬性上,以便應(yīng)用程序能夠正確處理和使用這些數(shù)據(jù)。

二、TypeHandler 的應(yīng)用

2.1 TypeHandler 接口

TypeHandler 是類(lèi)型轉(zhuǎn)換器的頂層接口,其定義了類(lèi)型轉(zhuǎn)換器應(yīng)該具有的功能,通常用于 MyBatis 在設(shè)置預(yù)處理語(yǔ)句(PreparedStatement)中的參數(shù)時(shí),完成 JAVA 類(lèi)型到 JDBC 類(lèi)型的轉(zhuǎn)換(通常用在#{}參數(shù)占位符中),以及在將查詢(xún)到的結(jié)果記錄映射到 JAVA 實(shí)體對(duì)象時(shí),完成 JDBC 類(lèi)型到 JAVA 類(lèi)型的轉(zhuǎn)換(通常用在<result>標(biāo)簽中)。以下是 TypeHandler 接口的一個(gè)基本概述:

public interface TypeHandler<T> {
  /**
   * 用于設(shè)置PreparedStatement對(duì)象的指定參數(shù)。
   *
   * @param ps 當(dāng)前的PreparedStatement對(duì)象 
   * @param i 當(dāng)前參數(shù)的位置 
   * @param parameter 當(dāng)前參數(shù)的Java對(duì)象 
   * @param jdbcType 當(dāng)前參數(shù)的數(shù)據(jù)庫(kù)類(lèi)型 
   */
	void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
  
  /**
   * 從結(jié)果集中根據(jù)列名獲取數(shù)據(jù)并轉(zhuǎn)換為 java 對(duì)象
   *
   * @param rs 當(dāng)前的結(jié)果集 
   * @param columnName 當(dāng)前的字段名稱(chēng) 
   */
	T getResult(ResultSet rs, String columnName) throws SQLException;
  
  /**
   * 從結(jié)果集中根據(jù)列索引獲取數(shù)據(jù)并轉(zhuǎn)換為 java 對(duì)象
   *
   * @param rs 當(dāng)前的結(jié)果集 
   * @param columnIndex 當(dāng)前字段的位置
   */
	T getResult(ResultSet rs, int columnIndex) throws SQLException;

  /**
   * 從存儲(chǔ)過(guò)程的結(jié)果集中根據(jù)列索引獲取數(shù)據(jù)并轉(zhuǎn)換為對(duì)應(yīng)的Java類(lèi)型
   *
   * @param cs 當(dāng)前的CallableStatement執(zhí)行后的CallableStatement 
   * @param columnIndex 當(dāng)前輸出參數(shù)的位置 
   */
	T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}

對(duì)于基本數(shù)據(jù)類(lèi)型(如int、long、float等),MyBatis提供了內(nèi)置的 TypeHandler 實(shí)現(xiàn),這些實(shí)現(xiàn)能夠直接將 Java 基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換為對(duì)應(yīng)的 JDBC 基本數(shù)據(jù)類(lèi)型,反之亦然。在 MyBatis 的 TypeHandlerRegistry 類(lèi)型中,可以看到內(nèi)置的類(lèi)型處理器,這里整理常見(jiàn)的一些。

TypeHandler描述
BaseTypeHandler基礎(chǔ)類(lèi)型處理器,用于處理Java基礎(chǔ)類(lèi)型和JDBC類(lèi)型之間的轉(zhuǎn)換,如Integer、String等。
BooleanTypeHandler用于 java 類(lèi)型 boolean,jdbc 類(lèi)型 bit、boolean
ByteTypeHandler用于 java 類(lèi)型 byte,jdbc 類(lèi)型 TINYINT
ShortTypeHandler用于 java 類(lèi)型 short,jdbc 類(lèi)型 SMALLINT
IntegerTypeHandler用于 INTEGER 類(lèi)型
LongTypeHandler用于 long 類(lèi)型
FloatTypeHandler用于 FLOAT 類(lèi)型
DoubleTypeHandler用于 double 類(lèi)型
StringTypeHandler用于 java 類(lèi)型 string,jdbc 類(lèi)型 CHAR、VARCHAR
ArrayTypeHandler數(shù)組類(lèi)型處理器,用于處理Java數(shù)組類(lèi)型和JDBC數(shù)組類(lèi)型之間的轉(zhuǎn)換。
CollectionTypeHandler集合類(lèi)型處理器,用于處理Java集合類(lèi)型和JDBC集合類(lèi)型之間的轉(zhuǎn)換。

以上只是 MyBatis 內(nèi)置 TypeHandler 的一部分示例,實(shí)際上 MyBatis 提供了更多的內(nèi)置 TypeHandler 以支持各種不同類(lèi)型的數(shù)據(jù)轉(zhuǎn)換需求。在使用 MyBatis 時(shí),可以根據(jù)具體的數(shù)據(jù)庫(kù)類(lèi)型和 Java 類(lèi)型選擇合適的內(nèi)置 TypeHandler,或者根據(jù)需要自定義 TypeHandler 來(lái)處理特殊的數(shù)據(jù)類(lèi)型轉(zhuǎn)換場(chǎng)景。

2.2 BaseTypeHandler 抽象類(lèi)

實(shí)際開(kāi)發(fā)中,我們可以繼承 org.apache.ibatis.type.BaseTypeHandler 類(lèi)型來(lái)實(shí)現(xiàn)自定義類(lèi)型處理器。這個(gè)類(lèi)型是抽象類(lèi)型,實(shí)現(xiàn)了 TypeHandler 的方法進(jìn)行通用流程的封裝,做了異常處理,并定義了幾個(gè)類(lèi)似的抽象方法,使得創(chuàng)建自定義類(lèi)型處理器時(shí)只需要覆蓋必要的方法。通常,如果不需要處理所有的JDBC類(lèi)型,可以選擇繼承 BaseTypeHandler,可以極大地降低開(kāi)發(fā)難度。BaseTypeHandler 提供了對(duì) null 值的處理以及部分 TypeHandler 接口方法的默認(rèn)實(shí)現(xiàn)。當(dāng)繼承 BaseTypeHandler 時(shí),通常需要實(shí)現(xiàn)或覆蓋以下方法:

// 設(shè)置非空的參數(shù)值,實(shí)現(xiàn)類(lèi)需要覆蓋這個(gè)方法來(lái)設(shè)置非空參數(shù)。
void setNonNullParameter(PreparedStatement var1, int var2, T var3, JdbcType var4) throws SQLException;

// 根據(jù)列名獲取可能為null的結(jié)果,實(shí)現(xiàn)類(lèi)需要覆蓋這個(gè)方法來(lái)獲取可能為空的結(jié)果。
T getNullableResult(ResultSet var1, String var2) throws SQLException;

// 根據(jù)列索引獲取可能為null的結(jié)果,實(shí)現(xiàn)類(lèi)需要覆蓋這個(gè)方法來(lái)獲取可能為空的結(jié)果。
T getNullableResult(ResultSet var1, int var2) throws SQLException;

// 從存儲(chǔ)過(guò)程的結(jié)果集中根據(jù)列索引獲取可能為null的結(jié)果,實(shí)現(xiàn)類(lèi)需要覆蓋這個(gè)方法來(lái)獲取可能為空的結(jié)果。
T getNullableResult(CallableStatement var1, int var2) throws SQLException;

這些方法專(zhuān)注于處理非空值的轉(zhuǎn)換以及處理從數(shù)據(jù)庫(kù)中檢索的可能為null的值,總的來(lái)說(shuō),TypeHandler 接口提供了完整的 JDBC 類(lèi)型和 Java 類(lèi)型轉(zhuǎn)換的契約,而 BaseTypeHandler 則是一個(gè)便利的基類(lèi),提供了一些基本的和通用的實(shí)現(xiàn),以減少自定義類(lèi)型處理器時(shí)的代碼量。在創(chuàng)建自定義類(lèi)型處理器時(shí),可以根據(jù)具體需求選擇直接實(shí)現(xiàn) TypeHandler 接口還是繼承 BaseTypeHandler 類(lèi)。

三、自定義類(lèi)型處理器

盡管 MyBatis 提供了一系列內(nèi)置的 TypeHandler,用于處理常見(jiàn)的 Java 類(lèi)型與數(shù)據(jù)庫(kù)類(lèi)型之間的轉(zhuǎn)換。但在某些特殊情況下,可能需要自定義 TypeHandler 來(lái)實(shí)現(xiàn)任意復(fù)雜的類(lèi)型轉(zhuǎn)換邏輯??梢酝ㄟ^(guò)實(shí)現(xiàn) TypeHandler 接口或繼承 BaseTypeHandler 類(lèi)來(lái)創(chuàng)建自定義的TypeHandler實(shí)現(xiàn),以滿(mǎn)足特定業(yè)務(wù)需求。

3.1 創(chuàng)建自定義 TypeHandler

我們可以創(chuàng)建一個(gè)來(lái)自動(dòng)轉(zhuǎn)義字符串內(nèi)容,現(xiàn)在我們創(chuàng)建一個(gè) EscapedStringTypeHandler 來(lái)處理類(lèi)型的轉(zhuǎn)義、反轉(zhuǎn)義,需要實(shí)現(xiàn) org.apache.ibatis.type.TypeHandler 接口或者繼承一個(gè)很便利的類(lèi) org.apache.ibatis.type.BaseTypeHandler。

import cn.hutool.http.HtmlUtil;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import static org.apache.ibatis.type.JdbcType.*;

@MappedTypes(String.class)// 指定該Handler對(duì)應(yīng)的Java類(lèi)型
@MappedJdbcTypes(value = {CLOB,CLOB,VARCHAR,LONGVARCHAR,NVARCHAR,NCHAR,NCLOB}, includeNullJdbcType = true) // 指定對(duì)應(yīng)的JDBC類(lèi)型
public class EscapedStringTypeHandler extends BaseTypeHandler<String> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i,
                                    String parameter, JdbcType jdbcType) throws SQLException {
        // 對(duì)原數(shù)據(jù)不做處理
        ps.setString(i, parameter);
    }

    @Override
    public String getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
        String data = resultSet.getString(columnName);
        return StrUtil.isNotBlank(data) ? HtmlUtil.unescape(data) : null;
    }

    @Override
    public String getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
        String data = resultSet.getString(columnIndex);
        return StrUtil.isNotBlank(data) ? HtmlUtil.unescape(data) : null;
    }

    @Override
    public String getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
        String data = callableStatement.getString(columnIndex);
        return StrUtil.isNotBlank(data) ? HtmlUtil.unescape(data) : null;
    }
}

??使用上述的類(lèi)型處理器將會(huì)覆蓋已經(jīng)存在的處理 Java 的 String 類(lèi)型屬性和 VARCHAR 參數(shù)及結(jié)果的類(lèi)型處理器。 要注意 MyBatis 不會(huì)通過(guò)窺探數(shù)據(jù)庫(kù)元信息來(lái)決定使用哪種類(lèi)型,所以你必須在參數(shù)和結(jié)果映射中指明那是 VARCHAR 類(lèi)型的字段, 以使其能夠綁定到正確的類(lèi)型處理器上。這是因?yàn)?MyBatis 直到語(yǔ)句被執(zhí)行時(shí)才清楚數(shù)據(jù)類(lèi)型。

3.2 注冊(cè)自定義 TypeHandler

此外,MyBatis 還提供了豐富的 API 和擴(kuò)展點(diǎn)來(lái)支持開(kāi)發(fā)者自定義 TypeHandler 的注冊(cè)和使用方式。我們可以通過(guò)配置文件、注解或編程方式將自定義的 TypeHandler 注冊(cè)到MyBatis 中,如果是在 Spring Boot 環(huán)境中使用 MyBatis,可以在 application.yml 文件中,配置屬性來(lái)指定 TypeHandler 所在的包路徑,MyBatis 會(huì)自動(dòng)掃描并注冊(cè)該包下的所有TypeHandler。以下是配置示例:

mybatis:
  type-handlers-package: com.dllwh.handler # 指定自定義TypeHandler的包位置

3.3 使用自定義 TypeHandler

接下來(lái),我們?cè)?Mapper 的 XML 映射文件中,通過(guò) result 或 parameterType 屬性引用它們來(lái)處理特定的數(shù)據(jù)類(lèi)型轉(zhuǎn)換需求。以下是配置示例:

<!-- Mapper XML中使用 -->
<resultMap id="personMap" type="person">
  <id property="id" column="id" />
  <!-- 指定typeHandler屬性為全類(lèi)名-->
  <result property="name" column="name" typeHandler="org.dllwh.handler.EscapedStringTypeHandler"/>/>
</resultMap>

<!-- Mapper XML中使用 -->
<select id="selectByExample" resultType="CustomJavaType">
    SELECT * FROM table WHERE user_name = #{value, typeHandler=org.dllwh.handler.EscapedStringTypeHandler}
</select>

四、小結(jié)

TypeHandler 在 MyBatis 中扮演著非常重要的角色,它負(fù)責(zé)處理數(shù)據(jù)庫(kù)數(shù)據(jù)結(jié)構(gòu)和bean對(duì)象數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換。通過(guò)創(chuàng)建自定義的 TypeHandler,我們能夠靈活地處理 MyBatis 中復(fù)雜數(shù)據(jù)類(lèi)型的轉(zhuǎn)換問(wèn)題,提高開(kāi)發(fā)效率和代碼可維護(hù)性。無(wú)論是 JSON、XML 還是其他復(fù)雜類(lèi)型,自定義 TypeHandler 都能提供統(tǒng)一且方便的方式來(lái)實(shí)現(xiàn)這一目標(biāo)。在實(shí)際項(xiàng)目中,合理使用 TypeHandler 能夠使數(shù)據(jù)映射更加清晰與高效,尤其是 Spring Boot 項(xiàng)目中,更是簡(jiǎn)化了配置和注冊(cè)過(guò)程,使得開(kāi)發(fā)者能夠更專(zhuān)注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。

到此這篇關(guān)于一文搞懂MyBatis中TypeHandler機(jī)制的文章就介紹到這了,更多相關(guān)MyBatis TypeHandler內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 手把手教你k8s部署springboot服務(wù)

    手把手教你k8s部署springboot服務(wù)

    本文主要介紹了手把手教你k8s部署springboot服務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 一篇文章弄懂JVM類(lèi)加載機(jī)制過(guò)程以及原理

    一篇文章弄懂JVM類(lèi)加載機(jī)制過(guò)程以及原理

    JVM原理對(duì)于初學(xué)者而言,比較晦澀難以理解,概念繁多又比較抽象,很多時(shí)候感覺(jué)看不見(jiàn)摸不著,還不好驗(yàn)證,下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)一篇文章弄懂JVM類(lèi)加載機(jī)制過(guò)程及原理的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(3)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(3)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • java性能優(yōu)化之分代回收

    java性能優(yōu)化之分代回收

    這篇文章主要介紹了java性能優(yōu)化之分代回收,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Java gRPC攔截器簡(jiǎn)單實(shí)現(xiàn)分布式日志鏈路追蹤器過(guò)程詳解

    Java gRPC攔截器簡(jiǎn)單實(shí)現(xiàn)分布式日志鏈路追蹤器過(guò)程詳解

    有請(qǐng)求的發(fā)送、處理,當(dāng)然就會(huì)有攔截器的需求,例如在服務(wù)端通過(guò)攔截器統(tǒng)一進(jìn)行請(qǐng)求認(rèn)證等操作,這些就需要攔截器來(lái)完成,今天松哥先和小伙伴們來(lái)聊一聊gRPC中攔截器的基本用法,后面我再整一篇文章和小伙伴們做一個(gè)基于攔截器實(shí)現(xiàn)的JWT認(rèn)證的gRPC
    2023-03-03
  • 深入淺出Spring中的@Autowired自動(dòng)注入的工作原理及實(shí)踐應(yīng)用

    深入淺出Spring中的@Autowired自動(dòng)注入的工作原理及實(shí)踐應(yīng)用

    在Spring框架的學(xué)習(xí)旅程中,@Autowired無(wú)疑是一個(gè)高頻出現(xiàn)卻又讓初學(xué)者頭疼的注解,它看似簡(jiǎn)單,卻蘊(yùn)含著Spring核心思想的精髓,本文將帶你揭開(kāi)@Autowired的神秘面紗,理解其工作原理與實(shí)踐應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2025-08-08
  • Java多線程局域網(wǎng)聊天室的實(shí)現(xiàn)

    Java多線程局域網(wǎng)聊天室的實(shí)現(xiàn)

    在學(xué)習(xí)了一個(gè)學(xué)期的java以后,搞了一個(gè)多線程的聊天室,熟悉了一下服務(wù)器和客戶(hù)機(jī)的操作。感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock詳解

    Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock詳解

    這篇文章主要介紹了Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock詳解,讀寫(xiě)鎖:一個(gè)資源能夠被多個(gè)讀線程訪問(wèn),或者被一個(gè)寫(xiě)線程訪問(wèn)但是不能同時(shí)存在讀寫(xiě)線程,需要的朋友可以參考下
    2024-01-01
  • 關(guān)于gradle多模塊項(xiàng)目依賴(lài)管理方式

    關(guān)于gradle多模塊項(xiàng)目依賴(lài)管理方式

    這篇文章主要介紹了關(guān)于gradle多模塊項(xiàng)目依賴(lài)管理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 解決spring boot創(chuàng)建項(xiàng)目遇到配置的問(wèn)題

    解決spring boot創(chuàng)建項(xiàng)目遇到配置的問(wèn)題

    這篇文章主要介紹了解決spring boot創(chuàng)建項(xiàng)目遇到配置的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論

扶风县| 泰顺县| 福安市| 右玉县| 高雄县| 宣威市| 宁武县| 怀集县| 侯马市| 苍山县| 宁南县| 库尔勒市| 泽州县| 邢台县| 河曲县| 金华市| 镇平县| 尼木县| 甘孜| 阜新市| 无极县| 杭锦后旗| 杂多县| 金秀| 余姚市| 泽库县| 西华县| 青田县| 视频| 南召县| 宁河县| 广元市| 海宁市| 九江县| 德昌县| 海淀区| 双辽市| 泉州市| 邹城市| 娄烦县| 桐乡市|