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

java中JSqlParser的使用

 更新時(shí)間:2024年07月01日 11:20:45   作者:昱宸星光  
JSqlParse是一款很精簡(jiǎn)的sql解析工具,它可以將常用的sql文本解析成具有層級(jí)結(jié)構(gòu)的語(yǔ)法樹(shù),本文主要介紹了java中JSqlParser的使用,具有一定的參考價(jià)值,感興趣的可以了解一下

簡(jiǎn)介

JSqlParse是一款很精簡(jiǎn)的sql解析工具,它可以將常用的sql文本解析成具有層級(jí)結(jié)構(gòu)的語(yǔ)法樹(shù),我們可以針對(duì)解析后的節(jié)點(diǎn)進(jìn)行處理(增加、移除、修改等操作),從而生成符合我們業(yè)務(wù)要求的sql,比如添加過(guò)濾條件等等

JSqlParse采用訪問(wèn)者模式

項(xiàng)目簡(jiǎn)介

項(xiàng)目結(jié)構(gòu)非常簡(jiǎn)單,從截圖上看就5個(gè)包。如果對(duì)源碼感興趣的可以直接從github上下載源碼包調(diào)試。其中expression包包含了所有的sql表達(dá)式的抽象對(duì)象:

statement包含了所有sql語(yǔ)句的類型,比如:增刪改查,ddl語(yǔ)句,rollback語(yǔ)句等等

schema包是對(duì)數(shù)據(jù)庫(kù)基本單元的抽象:服務(wù)器、數(shù)據(jù)庫(kù)、表、列等等

parser包是整個(gè)解析的核心邏輯,感興趣的可以自行源碼調(diào)試

使用示例

上面已經(jīng)做了關(guān)于該解析工具的簡(jiǎn)單介紹,對(duì)于工具類,最重要的使用。以下舉例關(guān)于增、刪、改、查的sql語(yǔ)句中,均增加一列為例介紹該工具的簡(jiǎn)單使用

依賴引入

<dependency>
    <groupId>com.github.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>4.5</version>
</dependency>

新增add

原始sql:insert into t_user_info(id,user_name,address) values('123','zhangsan','龍華')

期望在執(zhí)行該sql時(shí),能增加一列STATUS作為插入

都是一些api的運(yùn)用,相關(guān)代碼如下:

package com.lyc.boot.client.test.insert;

import com.lyc.boot.client.test.insert.visitor.InsertStatementVisitor;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.RowConstructor;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;
import net.sf.jsqlparser.statement.select.SetOperationList;
import net.sf.jsqlparser.statement.values.ValuesStatement;

import java.util.List;

import static com.lyc.boot.client.test.CommonUtil.printStatement;
import static com.lyc.boot.client.test.CommonUtil.printTableName;

@Slf4j
public class InsertCommonTest {

    private static final String INSERT_COMMON = "insert into t_user_info(id,user_name,address) values('123','zhangsan','龍華')";

    public static void main(String[] args) throws JSQLParserException {
        useCommonAddColumn();
//        useVisitorAddColumn();
    }

    private static void useCommonAddColumn() throws JSQLParserException {
        Statement statement = CCJSqlParserUtil.parse(INSERT_COMMON);
        printStatement(statement);
        if (statement instanceof Insert) {
            Insert insert = (Insert)statement;
            printTableName(insert.getTable());
            List<Column> columns = insert.getColumns();
            columns.add(new Column("STATUS"));

            Select select = insert.getSelect();
            SelectBody selectBody = select.getSelectBody();
            if (selectBody instanceof SetOperationList) {
                SetOperationList operationList = (SetOperationList)selectBody;
                List<SelectBody> selects = operationList.getSelects();
                for (SelectBody body : selects) {
                    if (body instanceof ValuesStatement) {
                        ValuesStatement valuesStatement = (ValuesStatement)body;
                        ItemsList itemsList = valuesStatement.getExpressions();
                        if(itemsList instanceof ExpressionList) {
                            ExpressionList expressionList = (ExpressionList)itemsList;
                            List<Expression> expressions = expressionList.getExpressions();
                            for (Expression expression : expressions) {
                                if(expression instanceof RowConstructor) {
                                    RowConstructor rowConstructor = (RowConstructor)expression;
                                    ExpressionList exprList = rowConstructor.getExprList();
                                    List<Expression> rowConstructorExList = exprList.getExpressions();
                                    rowConstructorExList.add(new StringValue("0"));
                                }
                            }
                        }
                    }
                }
            }
        }
        printStatement(statement);
    }

    /**
     * 使用訪問(wèn)者方式增加insert的column
     *
     * @throws JSQLParserException
     */
    private static void useVisitorAddColumn() throws JSQLParserException {
        Statement statement = CCJSqlParserUtil.parse(INSERT_COMMON);
        printStatement(statement);

        statement.accept(new InsertStatementVisitor());
        printStatement(statement);
    }


}
package com.lyc.boot.client.test.insert.visitor;

import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.StatementVisitorAdapter;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;

import java.util.List;

import static com.lyc.boot.client.test.CommonUtil.printTableName;

public class InsertStatementVisitor extends StatementVisitorAdapter {

    @Override
    public void visit(Insert insert) {
        printTableName(insert.getTable());
        List<Column> columns = insert.getColumns();
        columns.add(new Column("status"));

        Select select = insert.getSelect();
        SelectBody selectBody = select.getSelectBody();
        selectBody.accept(new InsertSelectVisitor());
    }
}
package com.lyc.boot.client.test.insert.visitor;

import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.statement.select.SelectBody;
import net.sf.jsqlparser.statement.select.SelectVisitorAdapter;
import net.sf.jsqlparser.statement.select.SetOperationList;
import net.sf.jsqlparser.statement.values.ValuesStatement;

import java.util.List;

public class InsertSelectVisitor extends SelectVisitorAdapter {
    @Override
    public void visit(SetOperationList setOpList) {
        List<SelectBody> selects = setOpList.getSelects();
        for (SelectBody body : selects) {
            body.accept(this);
        }
    }

    @Override
    public void visit(ValuesStatement valuesStatement) {
        ItemsList itemsList = valuesStatement.getExpressions();
        itemsList.accept(new InsertItemsListVisitor());
    }
}
package com.lyc.boot.client.test.insert.visitor;

import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.util.validation.validator.ItemsListValidator;

import java.util.List;

public class InsertItemsListVisitor extends ItemsListValidator {

    @Override
    public void visit(ExpressionList expressionList) {
        List<Expression> expressions = expressionList.getExpressions();
        for (Expression expression : expressions) {
            expression.accept(new InsertExpressionVisitor());
        }
    }
}
package com.lyc.boot.client.test.insert.visitor;

import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
import net.sf.jsqlparser.expression.RowConstructor;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;

import java.util.List;

public class InsertExpressionVisitor extends ExpressionVisitorAdapter {
    @Override
    public void visit(RowConstructor rowConstructor) {
        ExpressionList exprList = rowConstructor.getExprList();
        List<Expression> expressions = exprList.getExpressions();
        expressions.add(new StringValue("0"));
    }
}

以上是關(guān)于新增sql增加一列作為插入的簡(jiǎn)單運(yùn)用,其中有通過(guò)類型判斷處理和通過(guò)訪問(wèn)者模式處理(基于java多態(tài)實(shí)現(xiàn)),最終打印的結(jié)果如下:

刪除delete

原sql:delete from t_user_info where user_name = ? and addres = ?

期望在刪除時(shí)增加過(guò)濾條件STATUS='0'

相關(guān)代碼如下:

package com.lyc.boot.client.test.delete;

import com.lyc.boot.client.test.delete.visitor.DeleteStatementVisitor;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.delete.Delete;

import static com.lyc.boot.client.test.CommonUtil.printStatement;

@Slf4j
public class DeleteCommonTest {

    private static final String DELETE_COMMON = "delete from t_user_info where user_name = ? and addres = ?";

    public static void main(String[] args) throws JSQLParserException {
//        commonAddColumn();
        visitorAddColumn();
    }

    private static void visitorAddColumn() throws JSQLParserException{
        Statement statement = CCJSqlParserUtil.parse(DELETE_COMMON);
        printStatement(statement);
        statement.accept(new DeleteStatementVisitor());
        printStatement(statement);
    }

    private static void commonAddColumn() throws JSQLParserException {
        Statement statement = CCJSqlParserUtil.parse(DELETE_COMMON);
        printStatement(statement);
        if(statement instanceof Delete) {
            Delete delete = (Delete)statement;
            DeleteStatementVisitor.addColumn(delete);
        }
        printStatement(statement);
    }
}
package com.lyc.boot.client.test.delete.visitor;

import com.lyc.boot.client.test.CommonUtil;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.StatementVisitorAdapter;
import net.sf.jsqlparser.statement.delete.Delete;

import java.util.Objects;

@Slf4j
public class DeleteStatementVisitor extends StatementVisitorAdapter {

    @Override
    public void visit(Delete delete) {
        addColumn(delete);
    }

    public static void addColumn(Delete delete) {
        CommonUtil.printTableName(delete.getTable());
        Expression where = delete.getWhere();
        Parenthesis parenthesis = new Parenthesis(new EqualsTo(new Column("STATUS"), new StringValue("1")));
        if (Objects.isNull(where)) {
            delete.setWhere(parenthesis);
        } else {
            delete.setWhere(new AndExpression(where,parenthesis));
        }
    }
}

執(zhí)行結(jié)果如下圖:

修改update

原sql為:update t_user_info set user_name = ?,address = ? where id = ? and score = ?

期望在修改時(shí)set增加STATUS = ? where條件增加STATUS = '1'

package com.lyc.boot.client.test.update;

import com.lyc.boot.client.test.update.visitor.UpdateStatementVisitor;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.JdbcParameter;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.update.Update;
import net.sf.jsqlparser.statement.update.UpdateSet;

import java.util.ArrayList;
import java.util.Objects;

import static com.lyc.boot.client.test.CommonUtil.printStatement;

/**
 * update語(yǔ)句修改
 *
 *
 */
@Slf4j
public class UpdateCommonTest {

    private static final String COMMON_UPDATE = "update t_user_info set user_name = ?,address = ? where id = ? and score = ?";

    public static void main(String[] args) throws JSQLParserException {
//        commonUpdateAddColumn();
        visitorAddColumn();
    }

    private static void visitorAddColumn() throws JSQLParserException{
        Statement statement = CCJSqlParserUtil.parse(COMMON_UPDATE);
        printStatement(statement);

        statement.accept(new UpdateStatementVisitor());
        printStatement(statement);
    }

    private static void commonUpdateAddColumn() throws JSQLParserException {
        Statement statement = CCJSqlParserUtil.parse(COMMON_UPDATE);
        printStatement(statement);
        if(statement instanceof Update) {
            Update update = (Update)statement;
            Table table = update.getTable();
            ArrayList<UpdateSet> updateSets = update.getUpdateSets();
            Column column = new Column("STATUS");
            StringValue stringValue = new StringValue("?");
            JdbcParameter jdbcParameter = new JdbcParameter();
            UpdateSet updateSet = new UpdateSet(column,jdbcParameter);
            updateSets.add(updateSet);

            Expression whereExpression = update.getWhere();
            EqualsTo equalsTo = new EqualsTo(new Column("STATUS"), new StringValue("1"));
            Parenthesis parenthesis = new Parenthesis(equalsTo);

            if (Objects.isNull(whereExpression)) {
                update.setWhere(parenthesis);
            } else {
                update.setWhere(new AndExpression(whereExpression,parenthesis));
            }
        }
        printStatement(statement);
    }

}
package com.lyc.boot.client.test.update.visitor;

import com.lyc.boot.client.test.CommonUtil;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.JdbcParameter;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.StatementVisitorAdapter;
import net.sf.jsqlparser.statement.update.Update;
import net.sf.jsqlparser.statement.update.UpdateSet;

import java.util.ArrayList;
import java.util.Objects;

@Slf4j
public class UpdateStatementVisitor extends StatementVisitorAdapter {

    @Override
    public void visit(Update update) {
        CommonUtil.printTableName(update.getTable());

        ArrayList<UpdateSet> updateSets = update.getUpdateSets();
        UpdateSet statusUpdateSet = new UpdateSet(new Column("STATUS"), new JdbcParameter());
        updateSets.add(statusUpdateSet);

        Expression where = update.getWhere();
        Parenthesis parenthesis = new Parenthesis(new EqualsTo(new Column("STATUS"), new StringValue("1")));

        if (Objects.isNull(where)) {
            update.setWhere(parenthesis);
        } else {
            update.setWhere(new AndExpression(where,parenthesis));
        }
    }
}

執(zhí)行結(jié)果如下圖所示:

查詢select

原sql如下:select id as id,user_name as userName,address as address from t_user_info where id = ? and user_name = ? order by create_time desc

期望在查詢時(shí)增加where的過(guò)濾條件STATUS = '1'

package com.lyc.boot.client.test.select;

import com.lyc.boot.client.test.select.visitor.SelectSelectVisitor;
import com.lyc.boot.client.test.select.visitor.SelectStatementVisitor;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.*;

import static com.lyc.boot.client.test.CommonUtil.printStatement;

@Slf4j
/**
 * 給查詢條件添加更多的過(guò)濾條件
 *
 * and status = '1'
 */
public class SelectCommonTest {

    private static final String SELECT_COMMON = "select id as id,user_name as userName,address as address from t_user_info where id = ? and user_name = ? order by create_time desc";

    public static void main(String[] args) throws JSQLParserException {
//        commonSelectAddWhere();
        visitorSelectAddWhere();
    }

    private static void visitorSelectAddWhere() throws JSQLParserException{
        Statement statement = CCJSqlParserUtil.parse(SELECT_COMMON);
        printStatement(statement);
        statement.accept(new SelectStatementVisitor());
        printStatement(statement);
    }

    private static void commonSelectAddWhere() throws JSQLParserException {
        Statement statement = CCJSqlParserUtil.parse(SELECT_COMMON);
        printStatement(statement);
        if (statement instanceof Select) {
            Select select = (Select)statement;
            SelectBody selectBody = select.getSelectBody();
            if (selectBody instanceof PlainSelect) {
                PlainSelect plainSelect = (PlainSelect)selectBody;
                SelectSelectVisitor.setWhereExpression(plainSelect);
            }
        }
        printStatement(statement);
    }

}
package com.lyc.boot.client.test.select.visitor;

import net.sf.jsqlparser.statement.StatementVisitorAdapter;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;

public class SelectStatementVisitor extends StatementVisitorAdapter {

    @Override
    public void visit(Select select) {
        SelectBody selectBody = select.getSelectBody();
        selectBody.accept(new SelectSelectVisitor());
    }
}
package com.lyc.boot.client.test.select.visitor;

import com.lyc.boot.client.test.CommonUtil;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.SelectVisitorAdapter;

import java.util.List;
import java.util.Objects;

@Slf4j
public class SelectSelectVisitor extends SelectVisitorAdapter {

    @Override
    public void visit(PlainSelect plainSelect) {
        setWhereExpression(plainSelect);
    }

    public static void setWhereExpression(PlainSelect plainSelect) {
        Expression where = plainSelect.getWhere();
        EqualsTo equalsTo = new EqualsTo(new Column("STATUS"), new StringValue("1"));
        Parenthesis parenthesis = new Parenthesis(equalsTo);

        if (Objects.isNull(where)) {
            plainSelect.setWhere(parenthesis);
        } else {
            AndExpression andExpression = new AndExpression(where, parenthesis);
            plainSelect.setWhere(andExpression);
        }
    }
}

執(zhí)行結(jié)果如下圖:

擴(kuò)展簡(jiǎn)析

jsqlParser的實(shí)際之一就是在mybaits-plus中的各種插件,比如:多租戶插件com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor

該插件的作用是:在執(zhí)行sql時(shí)在where條件處增加了過(guò)濾條件(默認(rèn)是tenant_id = ?,具體的字段可以自己配置實(shí)現(xiàn))

當(dāng)配置了MybatisPlusInterceptor,并且添加了TenantLineInnerInterceptor時(shí),在執(zhí)行sql時(shí)會(huì)被該攔截器攔截,具體的源碼流程如下:

當(dāng)執(zhí)行查詢語(yǔ)句時(shí),sql會(huì)被MybatisPlusInterceptor插件攔截,插件調(diào)TenantLineInnerInterceptor的beforeQuery方法觸發(fā)

其中BaseMultiTableInnerInterceptor是JsqlParserSupport的子類,提供了模板方法用于修改sql

圖上,生成的sql由com.baomidou.mybatisplus.extension.parser.JsqlParserSupport#parserSingle方法決定

最終執(zhí)行sql解析完成添加過(guò)濾條件的操作:

在TenantLineInnerInterceptor插件中,最終是在where結(jié)尾出添加了(默認(rèn))tenant_id = xxxx的過(guò)濾條件,完成多租戶數(shù)據(jù)隔離處理的。具體的源碼邏輯可以調(diào)試根據(jù)

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

相關(guān)文章

  • SpringBoot上傳圖片到指定位置并返回URL的實(shí)現(xiàn)

    SpringBoot上傳圖片到指定位置并返回URL的實(shí)現(xiàn)

    本文主要介紹了SpringBoot上傳圖片到指定位置并返回URL,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>
    2022-03-03
  • 實(shí)例分析java中重載與重寫(xiě)的區(qū)別

    實(shí)例分析java中重載與重寫(xiě)的區(qū)別

    這篇文章主要介紹了實(shí)例分析java中重載與重寫(xiě)的區(qū)別,需要的朋友可以參考下
    2014-07-07
  • Spring?boot讀取外部化配置的方法

    Spring?boot讀取外部化配置的方法

    大家好,本篇文章主要講的是Spring?boot讀取外部化配置的方法,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • SpringBoot三種方法接口返回日期格式化小結(jié)

    SpringBoot三種方法接口返回日期格式化小結(jié)

    本文介紹了三種在Spring Boot中格式化接口返回日期的方法,包含使用@JsonFormat注解、全局配置JsonConfig、以及在yml文件中配置時(shí)區(qū),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-01-01
  • Java8處理集合的優(yōu)雅姿勢(shì)之Stream

    Java8處理集合的優(yōu)雅姿勢(shì)之Stream

    這篇文章主要給大家介紹了關(guān)于Java8優(yōu)雅處理集合之Stream的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用java8具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • SpringBoot加載外部Jar實(shí)現(xiàn)功能按需擴(kuò)展

    SpringBoot加載外部Jar實(shí)現(xiàn)功能按需擴(kuò)展

    這篇文章主要為大家詳細(xì)介紹了SpringBoot加載外部Jar實(shí)現(xiàn)功能按需擴(kuò)展的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-06-06
  • 基于SpringBoot實(shí)現(xiàn)簡(jiǎn)單的ELK日志搜索系統(tǒng)

    基于SpringBoot實(shí)現(xiàn)簡(jiǎn)單的ELK日志搜索系統(tǒng)

    要使用 Spring Boot 實(shí)現(xiàn)簡(jiǎn)單的 ELK(Elasticsearch、Logstash、Kibana)系統(tǒng),需要滿足一系列前提條件,涵蓋環(huán)境準(zhǔn)備、技術(shù)基礎(chǔ)、組件認(rèn)知等多個(gè)方面,以下是詳細(xì)的前提說(shuō)明,需要的朋友可以參考下
    2025-08-08
  • SpringBoot中配置多數(shù)據(jù)源的方法詳解

    SpringBoot中配置多數(shù)據(jù)源的方法詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot中配置多數(shù)據(jù)源的方法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • 玩轉(zhuǎn)SpringBoot中的那些連接池(小結(jié))

    玩轉(zhuǎn)SpringBoot中的那些連接池(小結(jié))

    這篇文章主要介紹了玩轉(zhuǎn)SpringBoot中的那些連接池(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 快速定位Java 內(nèi)存OOM的問(wèn)題

    快速定位Java 內(nèi)存OOM的問(wèn)題

    這篇文章主要介紹了快速定位Java 內(nèi)存OOM的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03

最新評(píng)論

旬邑县| 微山县| 平潭县| 肇州县| 许昌县| 定陶县| 石台县| 崇明县| 榆树市| 泾源县| 三台县| 万载县| 龙南县| 珲春市| 临汾市| 长宁县| 句容市| 尖扎县| 梁平县| 东阿县| 台南市| 巫溪县| 定州市| 泌阳县| 玉树县| 安溪县| 盐边县| 乌海市| 五莲县| 阿瓦提县| 奉节县| 黑龙江省| 都匀市| 玉山县| 成都市| 大厂| 凤阳县| 毕节市| 静海县| 卢湾区| 广饶县|