Java使用JSqlParser解析复杂的SQL语句的详细步骤

 更新时间:2025年01月14日 08:56:23   作者:威哥爱编程  
这篇文章介绍了在Java代码中使用 JSqlParser解析复杂SQL语句的相关内容,包括JSqlParser是什么及安装步骤,其使用场景如分析、转换、生成和验证SQL语句,处理SQL注入攻击的方法,以及解析复杂SQL语句的步骤、示例代码和对不同类型语句的处理,需要的朋友可以参考下

一、JSqlParser 是什么

JSqlParser 是一个用于解析 SQL 语句的 Java 库。它可以将 SQL 语句解析为一个 Java 对象树,允许你以编程的方式对 SQL 语句进行分析、修改和操作。它支持多种 SQL 语句类型,包括但不限于 SELECTINSERTUPDATEDELETECREATEALTER 等。

例如,对于 SQL 语句 "SELECT column1, column2 FROM table1 WHERE column1 = 'value'",JSqlParser 可以将其解析为一个 Java 对象,你可以方便地访问该对象的各个部分,如 SELECT 子句中的列名(column1column2)、表名(table1)以及 WHERE 子句中的条件(column1 = 'value')等。

以下是 JSqlParser 的安装步骤:

一、使用 Maven 进行安装

  • 打开你的项目的 pom.xml 文件。
  • <dependencies> 标签内添加以下依赖:
<dependency>
    <groupId>com.github.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>4.4</version>
</dependency>
  • 保存 pom.xml 文件。Maven 会自动下载 JSqlParser 及其依赖,并将它们添加到你的项目中。

二、手动下载安装(不推荐,略)

三、使用 Gradle 进行安装

  • 打开你的项目的 build.gradle 文件。
  • dependencies 部分添加以下内容:
implementation 'com.github.jsqlparser:jsqlparser:4.4'
  • 保存 build.gradle 文件。Gradle 会自动下载 JSqlParser 及其依赖,并将它们添加到你的项目中。

无论你使用哪种方式,安装完成后,你就可以在 Java 代码中导入并使用 JSqlParser 了。例如:

import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;

public class JSqlParserExample {
    public static void main(String[] args) throws Exception {
        String sql = "SELECT * FROM users WHERE id = 1";
        Statement statement = CCJSqlParserUtil.parse(sql);
        System.out.println(statement);
    }
}

上述代码的解释如下:

  • 首先,我们导入了 CCJSqlParserUtilStatement 类,它们是 JSqlParser 的一部分。
  • main 方法中,我们定义了一个 SQL 语句字符串 sql
  • 然后,我们使用 CCJSqlParserUtil.parse(sql) 方法将 SQL 语句解析为一个 Statement 对象。
  • 最后,我们将解析后的 Statement 对象打印出来。

请注意,使用不同的构建工具(Maven、Gradle 等)可以更方便地管理项目的依赖,建议使用 Maven 或 Gradle 进行依赖管理,因为它们可以自动处理依赖的版本冲突等问题。而手动下载 JAR 文件的方式可能会导致版本冲突或管理困难,特别是在项目规模较大或依赖较多的情况下。 同时,在使用 JSqlParser 时,要确保你的 Java 运行环境版本符合其要求,以避免兼容性问题。

二、使用场景

  • SQL 语句分析
  • 你可以使用 JSqlParser 来解析 SQL 语句,以提取其中的关键信息。例如,如果你想知道一个 SELECT 语句选择了哪些列、查询了哪个表、使用了哪些条件等,可以通过 JSqlParser 进行解析。以下是一个简单的示例:
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;
import net.sf.jsqlparser.statement.select.SelectItem;


public class JSqlParserExample {
    public static void main(String[] args) {
        String sql = "SELECT column1, column2 FROM table1 WHERE column1 = 'value'";
        try {
            Statement statement = CCJSqlParserUtil.parse(sql);
            if (statement instanceof Select) {
                Select selectStatement = (Select) statement;
                SelectBody selectBody = selectStatement.getSelectBody();
                if (selectBody instanceof net.sf.jsqlparser.statement.select.PlainSelect) {
                    net.sf.jsqlparser.statement.select.PlainSelect plainSelect = (net.sf.jsqlparser.statement.select.PlainSelect) selectBody;
                    List<SelectItem> selectItems = plainSelect.getSelectItems();
                    for (SelectItem item : selectItems) {
                        System.out.println("Selected column: " + item);
                    }
                    System.out.println("Table: " + plainSelect.getTable());
                    System.out.println("Where clause: " + plainSelect.getWhere());
                }
            }
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }
    }
}

代码解释:

  • 首先,我们使用 CCJSqlParserUtil.parse(sql) 将 SQL 语句解析为一个 Statement 对象。
  • 然后,我们将 Statement 对象转换为 Select 类型,因为我们知道这是一个 SELECT 语句。
  • 接着,我们通过 getSelectBody() 获取 SelectBody,并将其转换为 PlainSelect 类型,因为大多数简单的 SELECT 语句是 PlainSelect 类型。
  • 最后,我们可以使用 getSelectItems() 获取选择的列,getTable() 获取表名,getWhere() 获取 WHERE 子句。
  • SQL 语句转换
  • 你可以修改 SQL 语句的某些部分。例如,你可能想要将一个 SELECT 语句中的某些列替换为其他列,或者修改 WHERE 条件。以下是一个示例:
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;
import net.sf.jsqlparser.statement.select.SelectItem;


public class JSqlParserModifyExample {
    public static void main(String[] args) {
        String sql = "SELECT column1, column2 FROM table1 WHERE column1 = 'value'";
        try {
            Statement statement = CCJSqlParserUtil.parse(sql);
            if (statement instanceof Select) {
                Select selectStatement = (Select) statement;
                SelectBody selectBody = selectStatement.getSelectBody();
                if (selectBody instanceof net.sf.jsqlparser.statement.select.PlainSelect) {
                    net.sf.jsqlparser.statement.select.PlainSelect plainSelect = (net.sf.jsqlparser.statement.select.PlainSelect) selectBody;
                    // 修改列名
                    plainSelect.getSelectItems().clear();
                    plainSelect.addSelectItems(CCJSqlParserUtil.parseSelectItem("column3, column4"));
                    // 修改 WHERE 条件
                    plainSelect.setWhere(CCJSqlParserUtil.parseCondExpression("column3 > 10"));
                }
                System.out.println("Modified SQL: " + statement);
            }
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }
    }
}

代码解释:

  • 首先,我们按照上述的解析步骤将 SQL 语句解析为 PlainSelect 类型。
  • 然后,我们使用 getSelectItems().clear() 清除原有的选择项,并使用 addSelectItems() 添加新的选择项。
  • 最后,我们使用 setWhere() 修改 WHERE 条件。
  • SQL 语句生成
  • 你可以使用 JSqlParser 来构建新的 SQL 语句。例如,你可以使用其 API 来创建一个 SELECT 语句,而不是手动编写 SQL 字符串。以下是一个简单的示例:
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
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.Select;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;


public class JSqlParserCreateExample {
    public static void main(String[] args) {
        // 创建表对象
        Table table = new Table("table1");
        // 创建列对象
        Column column1 = new Column("column1");
        Column column2 = new Column("column2");


        // 创建表达式 column1 = 'value'
        Expression equalsTo = new EqualsTo(column1, CCJSqlParserUtil.parseExpression("'value'"));
        // 创建表达式 column2 > 10
        Expression greaterThan = new GreaterThan(column2, CCJSqlParserUtil.parseExpression("10"));


        // 创建 AND 表达式 column1 = 'value' AND column2 > 10
        Expression where = new AndExpression(equalsTo, greaterThan);


        // 创建 SELECT 语句
        SelectExpressionItem selectItem1 = new SelectExpressionItem(column1);
        SelectExpressionItem selectItem2 = new SelectExpressionItem(column2);


        PlainSelect plainSelect = new PlainSelect();
        plainSelect.setSelectItems(List.of(selectItem1, selectItem2));
        plainSelect.setTable(table);
        plainSelect.setWhere(where);


        Select select = new Select();
        select.setSelectBody(plainSelect);


        System.out.println("Generated SQL: " + select);
    }
}

代码解释:

  • 首先,我们创建表对象和列对象。

  • 然后,我们创建各种表达式,如 EqualsTo 表示等于条件,GreaterThan 表示大于条件,并使用 AndExpression 将它们组合成 WHERE 条件。

  • 接着,我们创建 SelectExpressionItem 作为选择项。

  • 最后,我们将这些元素组合成 PlainSelect 对象,再将其作为 Select 语句的 SelectBody

  • SQL 语句验证
  • 你可以使用 JSqlParser 来验证 SQL 语句的语法和结构。例如,在一个 SQL 编辑工具中,你可以使用 JSqlParser 来检查用户输入的 SQL 是否合法。以下是一个简单的示例:
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;


public class JSqlParserValidationExample {
    public static void main(String[] args) {
        String sql = "SELECT column1, column2 FROM table1 WHERE column1 = 'value'";
        try {
            CCJSqlParserUtil.parse(sql);
            System.out.println("SQL is valid");
        } catch (JSQLParserException e) {
            System.out.println("SQL is invalid: " + e.getMessage());
        }
    }
}

代码解释:

  • 我们使用 CCJSqlParserUtil.parse(sql) 尝试解析 SQL 语句,如果解析成功,说明 SQL 语句是合法的,否则会抛出 JSQLParserException,表明 SQL 语句存在问题。

小结一下,JSqlParser 在 SQL 语句的解析、修改、生成和验证等多个方面都有广泛的应用,尤其适用于需要对 SQL 语句进行动态操作和处理的场景,如 SQL 查询优化工具、SQL 审计工具、数据库迁移工具等。它提供了一种强大的编程方式,让你可以更加灵活地处理 SQL 语句,避免了手动处理 SQL 字符串可能带来的错误和复杂性。

三、在使用 JSqlParser 时,如何处理 SQL 注入攻击?

以下是在使用 JSqlParser 时处理 SQL 注入攻击的一些方法:

一、使用预编译语句(Prepared Statements)

在 Java 中,使用 JDBC 的预编译语句是防止 SQL 注入的重要手段,JSqlParser 可以与预编译语句结合使用。以下是一个简单的示例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class JSqlParserWithPreparedStatement {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/your_database";
        String user = "username";
        String password = "password";


        try (Connection connection = DriverManager.getConnection(url, user, password)) {
            // 假设解析后的 SQL 语句是一个 SELECT 语句
            String parsedSql = "SELECT * FROM users WHERE username =?";


            try (PreparedStatement preparedStatement = connection.prepareStatement(parsedSql)) {
                // 设置参数,这里假设用户输入来自于用户界面或其他来源
                String userInput = "admin"; 
                preparedStatement.setString(1, userInput);


                try (ResultSet resultSet = preparedStatement.executeQuery()) {
                    while (resultSet.next()) {
                        // 处理结果集
                        System.out.println(resultSet.getString("username"));
                    }
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

解释:

  • 首先,我们使用 DriverManager.getConnection() 建立数据库连接。
  • 然后,我们定义一个包含占位符 ? 的 SQL 语句,这里的 ? 是预编译语句的占位符。
  • 使用 connection.prepareStatement() 创建预编译语句对象。
  • 通过 preparedStatement.setString() 等方法设置参数,这里的参数会被正确转义,避免了 SQL 注入的风险。

二、使用 JSqlParser 对 SQL 语句进行验证和规范化

JSqlParser 可以用来检查 SQL 语句是否符合预期,例如,可以检查 SQL 语句是否只包含允许的关键字和结构。以下是一个简单的示例:

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;


public class JSqlParserValidation {
    public static void main(String[] args) {
        String sql = "SELECT * FROM users WHERE username = 'admin' AND 1=1; DROP TABLE users;";


        try {
            Statement statement = CCJSqlParserUtil.parse(sql);
            // 这里可以添加更多的验证逻辑
            // 例如,检查是否包含不允许的关键字,如 DROP、TRUNCATE 等
            System.out.println("Parsed SQL: " + statement);
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }
    }
}

解释:

  • 我们使用 CCJSqlParserUtil.parse() 对 SQL 语句进行解析。
  • 在解析后,可以添加额外的验证逻辑,例如检查 SQL 语句中是否包含 DROPTRUNCATE 等危险的关键字,以防止恶意用户删除或修改数据库结构。

三、白名单机制

使用白名单来限制 SQL 语句中的表名、列名和操作。以下是一个简单的示例:

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.Select;


public class JSqlParserWhiteList {
    public static final String[] ALLOWED_TABLES = {"users", "products"};


    public static void main(String[] args) {
        String sql = "SELECT * FROM users WHERE username = 'admin'";


        try {
            Statement statement = CCJSqlParserUtil.parse(sql);


            if (statement instanceof Select) {
                Select select = (Select) statement;
                // 假设我们只允许查询 users 或 products 表
                String tableName = select.getSelectBody().toString().split("FROM")[1].trim().split(" ")[0];
                if (!isAllowedTable(tableName)) {
                    throw new RuntimeException("Table not allowed");
                }
                System.out.println("Parsed SQL: " + statement);
            }
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }
    }


    private static boolean isAllowedTable(String tableName) {
        for (String allowedTable : ALLOWED_TABLES) {
            if (allowedTable.equalsIgnoreCase(tableName)) {
                return true;
            }
        }
        return false;
    }
}

解释:

  • 我们定义了一个允许的表名数组 ALLOWED_TABLES
  • 解析 SQL 语句后,对于 SELECT 语句,我们提取出表名,并检查它是否在白名单中。

四、使用参数化查询对象

JSqlParser 可以帮助你将 SQL 语句转换为参数化查询对象,然后可以与预编译语句结合使用。以下是一个简单的示例:

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.Select;


public class JSqlParserParameterized {
    public static void main(String[] args) {
        String sql = "SELECT * FROM users WHERE username = 'admin' AND age > 20";


        try {
            Statement statement = CCJSqlParserUtil.parse(sql);


            if (statement instanceof Select) {
                Select select = (Select) statement;
                // 假设这里可以提取表达式,如 username = 'admin' 和 age > 20
                Expression whereExpression = ((Select) statement).getSelectBody().toString().split("WHERE")[1].trim();
                // 这里可以进一步处理表达式,将其转换为参数化查询对象
                System.out.println("Parsed Expression: " + whereExpression);
            }
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }
    }
}

解释:

  • 我们使用 CCJSqlParserUtil.parse() 解析 SQL 语句。
  • 对于 SELECT 语句,我们可以提取 WHERE 子句的表达式,将其作为参数化查询对象,然后与预编译语句结合使用,进一步避免 SQL 注入风险。

通过结合 JSqlParser 和预编译语句,使用白名单机制和对 SQL 语句进行验证,可以有效地防止 SQL 注入攻击。根据具体的应用场景,你可以灵活选择和组合这些方法,以确保应用程序的安全性。

四、使用 JSqlParser 解析复杂的 SQL 语句?

以下是在 Java 代码中使用 JSqlParser 解析复杂 SQL 语句的步骤和示例代码:

解决思路:

  • 导入 JSqlParser 的相关类。
  • 创建一个 SQL 语句的字符串。
  • 使用 CCJSqlParserUtil.parse() 方法将 SQL 语句解析为 Statement 对象。
  • 根据 SQL 语句的不同类型(例如 SelectInsertUpdateDelete),将 Statement 对象进行类型转换。
  • 对转换后的对象进行进一步的操作,提取所需的信息。

示例代码:

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;
import net.sf.jsqlparser.statement.select.SelectItem;

import java.util.List;


public class JSqlParserComplexExample {
    public static void main(String[] args) {
        String complexSql = "SELECT column1, column2, SUM(column3) AS total FROM table1 WHERE column1 > 10 GROUP BY column1, column2 HAVING SUM(column3) > 100 ORDER BY column1 ASC, column2 DESC";

        try {
            // 将 SQL 语句解析为 Statement 对象
            Statement statement = CCJSqlParserUtil.parse(complexSql);

            // 判断 Statement 对象是否为 Select 语句
            if (statement instanceof Select) {
                Select selectStatement = (Select) statement;
                SelectBody selectBody = selectStatement.getSelectBody();

                // 提取 Select 语句中的 SelectItems
                if (selectBody instanceof net.sf.jsqlparser.statement.select.PlainSelect) {
                    net.sf.jsqlparser.statement.select.PlainSelect plainSelect = (net.sf.jsqlparser.statement.select.PlainSelect) selectBody;
                    List<SelectItem> selectItems = plainSelect.getSelectItems();
                    for (SelectItem item : selectItems) {
                        System.out.println("Select Item: " + item);
                    }

                    // 提取 Where 条件
                    if (plainSelect.getWhere()!= null) {
                        System.out.println("Where Clause: " + plainSelect.getWhere());
                    }

                    // 提取 Group By 子句
                    if (plainSelect.getGroupBy()!= null) {
                        System.out.println("Group By Clause: " + plainSelect.getGroupBy());
                    }

                    // 提取 Having 子句
                    if (plainSelect.getHaving()!= null) {
                        System.out.println("Having Clause: " + plainSelect.getHaving());
                    }

                    // 提取 Order By 子句
                    if (plainSelect.getOrderByElements()!= null) {
                        System.out.println("Order By Clause: " + plainSelect.getOrderByElements());
                    }
                }
            }
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }
    }
}

代码解释:

  • 首先,我们导入了 JSqlParser 所需的类,包括异常处理类 JSQLParserException,解析工具类 CCJSqlParserUtil,以及用于表示 SQL 语句的各种类,如 StatementSelectSelectBodySelectItem 等。
  • main 方法中,我们定义了一个复杂的 SQL 语句字符串 complexSql
  • 然后,我们使用 CCJSqlParserUtil.parse(complexSql) 方法将这个复杂的 SQL 语句解析为一个 Statement 对象。
  • 接下来,我们检查这个 Statement 对象是否是 Select 语句(因为我们的示例是一个 SELECT 语句),如果是,我们将其转换为 Select 类型。
  • 对于 Select 语句,我们进一步提取 SelectBody,并判断它是否是 PlainSelect 类型,因为大多数简单的 SELECT 语句会使用 PlainSelect 结构。
  • 我们可以使用 getSelectItems() 方法获取 SELECT 子句中的所有选择项,并遍历打印它们。
  • 对于 WHERE 子句,我们可以使用 getWhere() 方法获取条件表达式,如果存在的话。
  • 对于 GROUP BY 子句,我们可以使用 getGroupBy() 方法获取分组信息,如果存在的话。
  • 对于 HAVING 子句,我们可以使用 getHaving() 方法获取过滤条件,如果存在的话。
  • 对于 ORDER BY 子句,我们可以使用 getOrderByElements() 方法获取排序信息,如果存在的话。

如果你要解析的 SQL 语句是 INSERTUPDATEDELETE 类型,你可以类似地将 Statement 对象转换为相应的类型,然后使用相应类型的方法提取所需的信息。例如:

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 net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.update.Update;


public class JSqlParserOtherExamples {
    public static void main(String[] args) {
        String insertSql = "INSERT INTO table1 (column1, column2) VALUES (1, 'value')";
        String updateSql = "UPDATE table1 SET column1 = 2 WHERE column2 = 'value'";
        String deleteSql = "DELETE FROM table1 WHERE column1 = 3";


        try {
            // 解析 INSERT 语句
            Statement insertStatement = CCJSqlParserUtil.parse(insertSql);
            if (insertStatement instanceof Insert) {
                Insert insert = (Insert) insertStatement;
                System.out.println("Insert Table: " + insert.getTable());
                System.out.println("Insert Columns: " + insert.getColumns());
                System.out.println("Insert Values: " + insert.getItemsList());
            }


            // 解析 UPDATE 语句
            Statement updateStatement = CCJSqlParserUtil.parse(updateSql);
            if (updateStatement instanceof Update) {
                Update update = (Update) updateStatement;
                System.out.println("Update Table: " + update.getTable());
                System.out.println("Update Set Items: " + update.getSets());
                System.out.println("Update Where Clause: " + update.getWhere());
            }


            // 解析 DELETE 语句
            Statement deleteStatement = CCJSqlParserUtil.parse(deleteSql);
            if (deleteStatement instanceof Delete) {
                Delete delete = (Delete) deleteStatement;
                System.out.println("Delete Table: " + delete.getTable());
                System.out.println("Delete Where Clause: " + delete.getWhere());
            }
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }
    }
}

代码解释:

  • 对于 INSERT 语句,我们将 Statement 转换为 Insert 类型,然后可以使用 getTable() 方法获取插入的表名,getColumns() 方法获取插入的列名列表,getItemsList() 方法获取插入的值列表。
  • 对于 UPDATE 语句,我们将 Statement 转换为 Update 类型,然后可以使用 getTable() 方法获取更新的表名,getSets() 方法获取更新的列和值的映射,getWhere() 方法获取更新的条件。
  • 对于 DELETE 语句,我们将 Statement 转换为 Delete 类型,然后可以使用 getTable() 方法获取删除的表名,getWhere() 方法获取删除的条件。

通过上述方法,你可以灵活地使用 JSqlParser 解析不同类型的复杂 SQL 语句,并提取其中的各种信息,以满足你的具体需求。关注威哥爱编程,全栈开发定能成。

以上就是Java使用JSqlParser解析复杂的SQL语句的详细步骤的详细内容,更多关于Java JSqlParser解析SQL语句的资料请关注脚本之家其它相关文章!

相关文章

  • idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

    idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

    这篇文章主要介绍了idea报错java:非法字符:\ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现\ufeff错误,这是由于BOM字符被认为是非法字符导致的,通过示例代码将解决的过程介绍的非常详细,需要的朋友可以参考下
    2025-05-05
  • java 三种将list转换为map的方法详解

    java 三种将list转换为map的方法详解

    这篇文章主要介绍了java 三种将list转换为map的方法详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • System.getProperty(user.dir)定位问题解析

    System.getProperty(user.dir)定位问题解析

    System.getProperty(user.dir) 获取的是启动项目的容器位置,用IDEA是项目的根目录,部署在tomcat上是tomcat的启动路径,即tomcat/bin的位置,这篇文章主要介绍了System.getProperty(user.dir)定位问题,需要的朋友可以参考下
    2023-05-05
  • java程序代码与文本对比实用工具简介

    java程序代码与文本对比实用工具简介

    可以对两段文本进行对比,检测/比较两个文本有什么不同的差异,以便修改,常用于程序代码,就是不需要人工查看,尤其是大文件,有几百上千行的代码,这时候就建议使用比较工具了,不用浪费过多时间去寻找
    2021-09-09
  • 详解Java中Iterator迭代器的用法

    详解Java中Iterator迭代器的用法

    这篇文章主要介绍了Java中Iterator迭代器的用法,比较简单易懂,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • 详解Java中NullPointerException异常的原因和解决办法

    详解Java中NullPointerException异常的原因和解决办法

    本文主要介绍了详解Java中NullPointerException异常的原因和解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 使用注解+RequestBodyAdvice实现http请求内容加解密方式

    使用注解+RequestBodyAdvice实现http请求内容加解密方式

    这篇文章主要介绍了使用注解+RequestBodyAdvice实现http请求内容加解密方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java 工厂模式的实例详解

    java 工厂模式的实例详解

    这篇文章主要介绍了java 工厂模式的实例详解的相关资料,这里举例说明该如何实现工厂模式,需要的朋友可以参考下
    2017-09-09
  • java开发中使用IDEA活动模板快速增加注释的方法

    java开发中使用IDEA活动模板快速增加注释的方法

    这篇文章主要介绍了java开发中使用IDEA活动模板快速增加注释,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Spring实战之使用@Resource配置依赖操作示例

    Spring实战之使用@Resource配置依赖操作示例

    这篇文章主要介绍了Spring实战之使用@Resource配置依赖操作,结合实例形式分析了Spring使用@Resource配置依赖具体步骤、实现及测试案例,需要的朋友可以参考下
    2019-12-12

最新评论