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

SpringBoot過濾敏感詞的兩種實(shí)現(xiàn)方式

 更新時(shí)間:2024年06月11日 10:25:10   作者:甜鯨魚  
Spring Boot本身并不直接提供過濾敏感詞的功能,但你可以使用第三方庫或者自定義過濾器來實(shí)現(xiàn)這個(gè)需求,所以本文給大家介紹了SpringBoot過濾敏感詞的兩種實(shí)現(xiàn)方式,感興趣的朋友可以參考下

項(xiàng)目場(chǎng)景

基于 Spring Boot 的論壇系統(tǒng):用戶發(fā)布的內(nèi)容需進(jìn)行敏感詞過濾。

前置知識(shí)

前綴樹

  • Q:前綴樹和普通N叉樹的區(qū)別?
  • A:前綴樹(Trie,也稱字典樹、單詞查找樹或鍵樹)。
    • 設(shè)計(jì)目的:
      • 前綴樹:專門設(shè)計(jì)用于高效地存儲(chǔ)和檢索字符串集合中的鍵(字符串)。它的結(jié)構(gòu)允許快速的查找、插入和刪除操作,特別適合于字符串前綴匹配,如自動(dòng)補(bǔ)全、拼寫檢查、敏感詞過濾等場(chǎng)景。
      • 普通N叉樹:是一種更通用的樹形數(shù)據(jù)結(jié)構(gòu),其中每個(gè)節(jié)點(diǎn)可以有任意數(shù)量(包括零)的子節(jié)點(diǎn),最多可達(dá)N個(gè)。它沒有特定于字符串處理的特性,廣泛應(yīng)用于各種需要多路分支的數(shù)據(jù)結(jié)構(gòu)場(chǎng)景,如文件系統(tǒng)的目錄結(jié)構(gòu)、表達(dá)式樹等。
    • 節(jié)點(diǎn)結(jié)構(gòu):
      • 前綴樹:每個(gè)節(jié)點(diǎn)通常包含一個(gè)字符和一個(gè)映射到其子節(jié)點(diǎn)的字符到節(jié)點(diǎn)的映射(如HashMap或數(shù)組)。根節(jié)點(diǎn)通常不表示任何字符,而從根到任意葉節(jié)點(diǎn)的路徑上的字符序列組成一個(gè)字符串,葉節(jié)點(diǎn)或標(biāo)記為關(guān)鍵詞結(jié)束的節(jié)點(diǎn)代表一個(gè)完整的字符串。
      • 普通N叉樹:節(jié)點(diǎn)可能包含數(shù)據(jù)以及指向其子節(jié)點(diǎn)的指針數(shù)組或列表,但這些子節(jié)點(diǎn)之間的關(guān)系不一定有特定的字符關(guān)聯(lián),節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)和含義更多樣。
    • 查找效率:
      • 前綴樹:由于其特殊的結(jié)構(gòu)設(shè)計(jì),前綴樹支持高效的前綴匹配,可以在O(L)時(shí)間內(nèi)(L為關(guān)鍵詞長(zhǎng)度)查找到所有具有相同前綴的字符串,或者確定某個(gè)字符串是否在集合中。
      • 普通N叉樹:查找效率依賴于樹的具體形態(tài)和查找算法,一般情況下不如前綴樹在字符串前綴匹配上的效率高。
    • 空間利用率:
      • 前綴樹:可能會(huì)有較高的空間消耗,因?yàn)樗鎯?chǔ)了所有字符串的公共前綴,特別是當(dāng)存儲(chǔ)的字符串有很多相似前綴時(shí)。
      • 普通N叉樹:空間使用更加靈活,取決于樹的形狀,但通常不會(huì)為了存儲(chǔ)前綴信息而額外消耗空間。

總之,前綴樹是一種針對(duì)字符串處理優(yōu)化的特殊N叉樹,強(qiáng)調(diào)了字符串前綴的高效存儲(chǔ)和查詢,而普通N叉樹則是一種更為通用的結(jié)構(gòu),適用于多種類型的多路分支數(shù)據(jù)組織。

實(shí)現(xiàn)方式

解決方案一:讀取敏感詞文件生成前綴樹+構(gòu)建敏感詞過濾器

前綴樹

  • 名稱:Trie 、字典樹、查找樹
  • 特點(diǎn):查找效率高,消耗內(nèi)存大
  • 應(yīng)用:字符串檢索、詞頻統(tǒng)計(jì)、字符串排序等

敏感詞過濾器

  • 定義前綴樹
  • 根據(jù)敏感詞,初始化前綴樹
  • 編寫過濾敏感詞的方法

1. 導(dǎo)入敏感詞文件 src/main/resources/sensitive_words.txt

此處為示例文件內(nèi)容。

元
購物車
fuck
abc
bf
be

2. 構(gòu)建敏感詞過濾器 SensitiveFilter

package com.example.filter;

import com.example.constant.SensitiveConstant;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.CharUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

/**
 * 敏感詞過濾器
 */
@Slf4j
@Component
public class SensitiveFilter {

    // 創(chuàng)建前綴樹的根節(jié)點(diǎn)
    private final TrieNode rootNode = new TrieNode();

    /**
     * 初始化,讀取敏感詞
     */
    @PostConstruct  // 確保在Bean初始化后執(zhí)行
    public void init() {
        // 1. 從類路徑加載敏感詞文件: 使用文件存儲(chǔ)敏感詞庫可以直接進(jìn)行一次性讀取和處理,無需依賴數(shù)據(jù)庫系統(tǒng),并且保證離線可用。
        try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(SensitiveConstant.SENSITIVE_WORDS_FILE);
             InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
             // Java 7及以后的版本中,引入了一項(xiàng)稱為"try-with-resources"的新特性,它允許自動(dòng)管理資源,確保在try語句塊執(zhí)行完畢后,不論是否發(fā)生異常,都會(huì)正確關(guān)閉或釋放資源
        ) {
            // 2. 逐行讀取敏感詞并加入到前綴樹中
            String keyword;
            while ((keyword = bufferedReader.readLine()) != null) {
                this.addKeyWord(keyword);
            }
        } catch (IOException ex) {
            log.error("敏感詞文件讀取失敗: " + ex.getMessage());
        }
    }

    /**
     * 將敏感詞添加到前綴樹中
     * @param keyword 待添加的敏感詞
     */
    private void addKeyWord(String keyword) {
        // 1. 初始化操作,將當(dāng)前處理節(jié)點(diǎn)設(shè)為根節(jié)點(diǎn)
        TrieNode tempNode = rootNode;

        // 2. 將待添加的敏感詞字符串轉(zhuǎn)換為字符數(shù)組以便遍歷
        char[] chars = keyword.toCharArray();

        // 3. 遍歷字符數(shù)組,逐個(gè)字符構(gòu)建前綴樹
        for (int i = 0; i < chars.length; i++) {
            // 3.1. 從當(dāng)前處理節(jié)點(diǎn)的子節(jié)點(diǎn)Map中獲取當(dāng)前字符對(duì)應(yīng)的節(jié)點(diǎn)
            TrieNode childrenNode = tempNode.getChildrenNode(chars[i]);
            // 3.1.1 若當(dāng)前字符沒有對(duì)應(yīng)的節(jié)點(diǎn),則創(chuàng)建一個(gè)新節(jié)點(diǎn),并放入當(dāng)前處理節(jié)點(diǎn)的子節(jié)點(diǎn)Map中
            if (childrenNode == null) {
                childrenNode = new TrieNode();
                tempNode.setChildrenNode(chars[i], childrenNode);
            }

            // 3.2. 若當(dāng)前字符為敏感詞字符串的最后一個(gè)字符,則標(biāo)記當(dāng)前字符的對(duì)應(yīng)節(jié)點(diǎn)為敏感詞的結(jié)尾節(jié)點(diǎn)
            if (i == chars.length - 1) {
                childrenNode.setKeywordEnd(true);
            }

            // 3.3. 移動(dòng)到下一層,使當(dāng)前字符對(duì)應(yīng)的節(jié)點(diǎn)成為新的當(dāng)前處理節(jié)點(diǎn),繼續(xù)構(gòu)建或遍歷過程
            tempNode = childrenNode;
        }
    }

    /**
     * 過濾文本,移除或替換其中的敏感詞,并返回處理后的文本
     * @param text 待過濾的文本
     * @return 過濾后的文本
     */
    public String filter(String text) {
        // 1. 檢查輸入文本是否為空或僅包含空白字符,如果是,則直接返回null,表示無內(nèi)容無需過濾
        if (StringUtils.isBlank(text)) {
            return null;
        }

        // 2. 初始化變量
        TrieNode tempNode = rootNode;   // 2.1. 初始化為前綴樹的根節(jié)點(diǎn),用于遍歷查找。
        int begin = 0, end = 0;         // 2.2. 分別用于標(biāo)記待檢查文本區(qū)間的起始和結(jié)束位置
        StringBuilder result = new StringBuilder(); // 2.3. 累積過濾后的文本

        // 3. 遍歷整個(gè)文本進(jìn)行過濾處理
        while (begin < text.length()) {
            char c = text.charAt(end);
            // 3.1. 遇到符號(hào)字符
            if (isSymbol(c)) {
                // 3.1.1. 如果當(dāng)前處于根節(jié)點(diǎn),即沒有匹配到任何敏感詞的開始,直接保留符號(hào),并移動(dòng)begin
                if (tempNode == rootNode) {
                    result.append(c);
                    begin++;
                }
                // 3.1.2. 跳過當(dāng)前符號(hào),并繼續(xù)檢查下一個(gè)字符
                end++;
                continue;
            }

            // 3.2. 檢查當(dāng)前字符區(qū)間text[begin...end]是否是某個(gè)敏感詞的一部分
            tempNode = tempNode.getChildrenNode(c);

            // 3.2.1. 如果當(dāng)前字符沒有對(duì)應(yīng)的子節(jié)點(diǎn),即text[begin...end]不是敏感詞的組成部分
            if (tempNode == null) {
                result.append(text.charAt(begin));  // 3.2.1.1. 保存begin位置的字符到結(jié)果
                end = ++begin;          // 3.2.1.2. 移動(dòng)begin和end指針,準(zhǔn)備檢查下一個(gè)可能的敏感詞 begin++; end = begin;
                tempNode = rootNode;    // 3.2.1.3. 重置tempNode為根節(jié)點(diǎn)準(zhǔn)備下一輪匹配
            }

            // 3.2.2. 如果當(dāng)前字符路徑已到達(dá)一個(gè)敏感詞的結(jié)尾,即text[begin...end]是敏感詞
            else if (tempNode.isKeywordEnd()) {
                result.append(StringUtils.repeat(SensitiveConstant.REPLACEMENT, end - begin + 1));  // 3.2.2.1. 替換敏感詞區(qū)間
                begin = ++end;          // 3.2.2.2. 移動(dòng)begin和end指針,準(zhǔn)備檢查下一個(gè)可能的敏感詞 end++; begin = end;
                tempNode = rootNode;    // 3.2.2.3. 重置tempNode為根節(jié)點(diǎn)準(zhǔn)備下一輪匹配
            }

            // 3.2.3. 如果當(dāng)前字符區(qū)間text[begin...end]是潛在敏感詞的一部分但不是結(jié)尾,繼續(xù)匹配下一個(gè)字符
            else {
                // 3.2.3.1. 檢查下一個(gè)字符是否存在,存在則移動(dòng)end指針;否則,回退begin到當(dāng)前位置,準(zhǔn)備重新匹配
                if (end < text.length() - 1) {
                    end++;
                } else {
                    end = begin;
                }
            }
        }

        // 4. 將剩余未檢查的文本(若有)添加到結(jié)果中
        result.append(text.substring(begin));

        // 5. 返回過濾后的文本
        return result.toString();
    }

    /**
     * 判斷字符是否為符號(hào)字符
     * @param character 待判斷的字符
     * @return true表示是符號(hào)字符,需要跳過;false表示不是符號(hào)字符,不跳過
     */
    private boolean isSymbol(Character character) {
        // 0x2E80~0x9FFF是東亞文字: 判斷字符是否不屬于ASCII字母數(shù)字且不在東亞文字范圍內(nèi)
        return !CharUtils.isAsciiAlphanumeric(character) && (character < 0x2E80 || character > 0x9FFF);
    }

    /**
     * 內(nèi)部類,定義前綴樹的節(jié)點(diǎn)
     */
    private static class TrieNode {

        private boolean isKeywordEnd = false;   // 當(dāng)前節(jié)點(diǎn)是否為敏感詞的末尾節(jié)點(diǎn)

        private final Map<Character, TrieNode> childrenNode = new HashMap<>();  // 當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)

        // Getter和Setter方法
        public boolean isKeywordEnd() {
            return isKeywordEnd;
        }

        public void setKeywordEnd(boolean keywordEnd) {
            isKeywordEnd = keywordEnd;
        }

        public TrieNode getChildrenNode(Character c) {
            return childrenNode.get(c);
        }

        public void setChildrenNode(Character c, TrieNode node) {
            childrenNode.put(c, node);
        }

    }

}

這里我把敏感詞過濾器的相關(guān)常量都寫到一個(gè)常量類里了,也可以直接寫在過濾器里。

package com.example.constant;

/**
 * 敏感詞過濾器的相關(guān)常量
 */
public class SensitiveConstant {
    /**
     * 敏感詞文件名稱
     */
    public static final String SENSITIVE_WORDS_FILE = "sensitive_words.txt";
    /**
     * 用于替換敏感詞的字符
     */
    public static final Character REPLACEMENT = '*';
}

3. 測(cè)試與使用

創(chuàng)建一個(gè)測(cè)試類測(cè)一下就行。

package com.example.filter;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
class SensitiveFilterTest {

    @Autowired
    private SensitiveFilter sensitiveFilter;

    @Test
    void filter() {
        String result = sensitiveFilter.filter("accfuckxx元bitch購物車bitchjwbc");
        System.out.println(result);
    }
}

運(yùn)行結(jié)果:

acc****xx*bitch***bitchjwbc

可以實(shí)現(xiàn)過濾,但是完全基于敏感詞文件內(nèi)容,需要自行完善文件。也許可以結(jié)合正則表達(dá)式擴(kuò)展?不是很靈活,沒研究過了。

解決方案二:使用第三方插件 houbb/sensitive-word(推薦)

houbb/sensitive-word項(xiàng)目源碼:https://github.com/houbb/sensitive-word

1. 添加依賴

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>sensitive-word</artifactId>
    <version>0.17.0</version>
</dependency>

2. 測(cè)試與使用(使用默認(rèn)過濾策略)

package com.example.filter;

import com.github.houbb.sensitive.word.core.SensitiveWordHelper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
class SensitiveFilterTest {

    @Autowired
    private SensitiveFilter sensitiveFilter;

    @Test
    void filter() {
        String result = sensitiveFilter.filter("accfuckxx元bitch購物車bitchjwbc");
        System.out.println(result);

        System.out.println("-------------------------------");

        result = SensitiveWordHelper.replace("accfuckxx元bitch購物車bitchjwbc");
        System.out.println(result);

        result = SensitiveWordHelper.replace("??c? the bad words");
        System.out.println(result);

        result = SensitiveWordHelper.replace("???f?u??c?? the bad words");
        System.out.println(result);

        result = SensitiveWordHelper.replace("fffuuck the bad words");
        System.out.println(result);
    }
}

運(yùn)行結(jié)果:

acc****xx*bitch***bitchjwbc
-------------------------------
acc****xx元bitch購物車bitchjwbc
**** the bad words
???f?u??c?? the bad words
fffuuck the bad words

可以實(shí)現(xiàn)基礎(chǔ)過濾。比讀取文件更方便。
(忽略掉這里的“元”和“購物車”。只是為了文章過審把一些很offensive的詞換成了隨便寫的詞嗯。)

如果要設(shè)置更多需要過濾的內(nèi)容,可以參考以下步驟。

3. 構(gòu)建配置類SensitiveWordConfig(使用自定義過濾策略)

自己按照需求調(diào)一下就好。

package com.example.config;

import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import com.github.houbb.sensitive.word.support.ignore.SensitiveWordCharIgnores;
import com.github.houbb.sensitive.word.support.resultcondition.WordResultConditions;
import com.github.houbb.sensitive.word.support.tag.WordTags;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置類,用于設(shè)置敏感詞過濾器的自定義過濾策略
 * 更多配置見 https://github.com/houbb/sensitive-word
 */
@Configuration
public class SensitiveWordConfig {

    /**
     * 初始化引導(dǎo)類
     * @return 初始化引導(dǎo)類
     * @since 1.0.0
     */
    @Bean
    public SensitiveWordBs sensitiveWordBs() {
        SensitiveWordBs wordBs = SensitiveWordBs.newInstance()
                .ignoreCase(true)           // 忽略大小寫,默認(rèn)值為true
                .ignoreWidth(true)          // 忽略半角圓角,默認(rèn)值為true
                .ignoreNumStyle(true)       // 忽略數(shù)字的寫法,默認(rèn)值為true
                .ignoreChineseStyle(true)   // 忽略中文的書寫格式,默認(rèn)值為true
                .ignoreEnglishStyle(true)   // 忽略英文的書寫格式,默認(rèn)值為true
                .ignoreRepeat(false)        // 忽略重復(fù)詞,默認(rèn)值為false
                .enableNumCheck(false)      // 是否啟用數(shù)字檢測(cè),默認(rèn)值為false
                .enableEmailCheck(false)    // 是有啟用郵箱檢測(cè),默認(rèn)值為false
                .enableUrlCheck(false)      // 是否啟用鏈接檢測(cè),默認(rèn)值為false
                .enableIpv4Check(false)     // 是否啟用IPv4檢測(cè),默認(rèn)值為false
                .enableWordCheck(true)      // 是否啟用敏感單詞檢測(cè),默認(rèn)值為true
                .numCheckLen(8)             // 數(shù)字檢測(cè),自定義指定長(zhǎng)度,默認(rèn)值為8
                .wordTag(WordTags.none())   // 詞對(duì)應(yīng)的標(biāo)簽,默認(rèn)值為none
                .charIgnore(SensitiveWordCharIgnores.defaults())            // 忽略的字符,默認(rèn)值為none
                .wordResultCondition(WordResultConditions.alwaysTrue())     // 針對(duì)匹配的敏感詞額外加工,比如可以限制英文單詞必須全匹配,默認(rèn)恒為真
                .init();

        return wordBs;
    }
}

4. 測(cè)試與使用(使用自定義過濾策略)

在剛剛的配置類中已經(jīng)啟用了數(shù)字檢測(cè)。

.enableNumCheck(true)      // 是否啟用數(shù)字檢測(cè),默認(rèn)值為false

測(cè)一下。

package com.example.filter;

import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import com.github.houbb.sensitive.word.core.SensitiveWordHelper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
class SensitiveFilterTest {

	...

    @Autowired
    private SensitiveWordBs sensitiveWordBs;

	...
	
    @Test
    void test() {
        String result = sensitiveWordBs.replace("accfuckxx元bitch購物車bitchjwbc");
        System.out.println(result);

        result = sensitiveWordBs.replace("??c? the bad words");
        System.out.println(result);

        result = sensitiveWordBs.replace("???f?u??c?? the bad words");
        System.out.println(result);

        result = sensitiveWordBs.replace("fffuuck the bad words");
        System.out.println(result);

        result = sensitiveWordBs.replace("12345678dwnoxcw");
        System.out.println(result);

        result = sensitiveWordBs.replace("123456789dwnoxcw");
        System.out.println(result);

        result = sensitiveWordBs.replace("一二三四五六七八九dwnoxcw");
        System.out.println(result);

        result = sensitiveWordBs.replace("這個(gè)是我的微信:9?二肆??③⑸⒋?㈤五");
        System.out.println(result);
    }
}

運(yùn)行結(jié)果:

acc****xx元bitch購物車bitchjwbc
**** the bad words
*********** the bad words
******* the bad words
********dwnoxcw
*********dwnoxcw
*********dwnoxcw
這個(gè)是我的微信:************

就很好用了。
(忽略掉這里的“元”和“購物車”。只是為了文章過審把一些很offensive的詞換成了隨便寫的詞嗯。)

兩種實(shí)現(xiàn)方式的對(duì)比

  • 自行構(gòu)建前綴樹過濾器:
    • 優(yōu)勢(shì):高度定制,易于理解與維護(hù),無外部依賴。
    • 劣勢(shì):開發(fā)耗時(shí),需優(yōu)化性能,學(xué)習(xí)成本。
  • 使用第三方開源項(xiàng)目:
    • 優(yōu)勢(shì):快速集成,功能成熟,社區(qū)支持。
    • 劣勢(shì):依賴管理,安全風(fēng)險(xiǎn),定制受限。

根據(jù)項(xiàng)目需求緊迫性、定制化需求及團(tuán)隊(duì)技術(shù)背景綜合選擇。簡(jiǎn)單需求或有定制化要求傾向自建;追求快速、功能全面則推薦使用現(xiàn)成開源方案。

以上就是SpringBoot過濾敏感詞的兩種實(shí)現(xiàn)方式的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot過濾敏感詞的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot統(tǒng)計(jì)一個(gè)Bean中方法的調(diào)用次數(shù)的實(shí)現(xiàn)步驟

    SpringBoot統(tǒng)計(jì)一個(gè)Bean中方法的調(diào)用次數(shù)的實(shí)現(xiàn)步驟

    這篇文章主要給大家介紹了SpringBoot統(tǒng)計(jì)一個(gè)Bean中方法的調(diào)用次數(shù)的實(shí)現(xiàn)步驟,文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)具有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • Java 抽象類定義與方法實(shí)例詳解

    Java 抽象類定義與方法實(shí)例詳解

    這篇文章主要介紹了java 抽象類與接口的區(qū)別介紹的相關(guān)資料,需要的朋友可以參考下...
    2017-04-04
  • 詳解springboot通過Async注解實(shí)現(xiàn)異步任務(wù)及回調(diào)的方法

    詳解springboot通過Async注解實(shí)現(xiàn)異步任務(wù)及回調(diào)的方法

    這篇文章主要介紹了springboot通過Async注解實(shí)現(xiàn)異步任務(wù)及回調(diào),文中通過一個(gè)簡(jiǎn)單示例來直觀的理解什么是同步調(diào)用,在單元測(cè)試用例中,注入?SyncTask?對(duì)象,并在測(cè)試用例中執(zhí)行?doTaskOne(),doTaskTwo(),doTaskThree()?三個(gè)方法,具體實(shí)現(xiàn)方式跟隨小編一起看看吧
    2022-05-05
  • MyBatis實(shí)戰(zhàn)之Mapper注解的示例

    MyBatis實(shí)戰(zhàn)之Mapper注解的示例

    本文主要介紹了MyBatis實(shí)戰(zhàn)之Mapper注解的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • 簡(jiǎn)單易懂Java反射的setAccessible()方法

    簡(jiǎn)單易懂Java反射的setAccessible()方法

    本文主要介紹了簡(jiǎn)單易懂Java反射的setAccessible()方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 詳解Java異常處理最佳實(shí)踐及陷阱防范

    詳解Java異常處理最佳實(shí)踐及陷阱防范

    這篇文章主要介紹了Java異常處理最佳實(shí)踐及陷阱防范,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • spring boot動(dòng)態(tài)加載Echart餅狀圖

    spring boot動(dòng)態(tài)加載Echart餅狀圖

    這篇文章主要為大家詳細(xì)介紹了spring boot動(dòng)態(tài)加載Echart餅狀圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 利用?SpringBoot?在?ES?中實(shí)現(xiàn)類似連表查詢功能

    利用?SpringBoot?在?ES?中實(shí)現(xiàn)類似連表查詢功能

    這篇文章主要介紹了如何利用?SpringBoot?在?ES?中實(shí)現(xiàn)類似連表的查詢功能,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • 基于maven的ssm框架整合的示例代碼

    基于maven的ssm框架整合的示例代碼

    本篇文章主要介紹了基于maven的ssm框架整合的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • Java Swing實(shí)現(xiàn)自定義日期時(shí)間選擇器組件

    Java Swing實(shí)現(xiàn)自定義日期時(shí)間選擇器組件

    Swing 原生沒有好用的日期時(shí)間選擇器組件,如果想讓用戶選擇日期,通常只能用手寫文本框加格式校驗(yàn),代碼繁瑣且體驗(yàn)一般,下面小編就和大家分享一下Java Swing實(shí)現(xiàn)自定義日期時(shí)間選擇器的相關(guān)方法吧
    2026-05-05

最新評(píng)論

双城市| 黔西县| 西藏| 枞阳县| 禄丰县| 项城市| 图们市| 三穗县| 福鼎市| 巴彦县| 诏安县| 微山县| 崇文区| 荣昌县| 慈利县| 成安县| 黎川县| 井研县| 竹山县| 微博| 靖远县| 子洲县| 呼玛县| 温州市| 团风县| 榆中县| 安宁市| 仁化县| 延庆县| 浮梁县| 巧家县| 晋中市| 泸西县| 红桥区| 富锦市| 枣强县| 云梦县| 绥棱县| 永城市| 依兰县| 宝丰县|