使用jsqlparser获取sql语句所有字段信息

7 篇文章 1 订阅

在建表的时候,需要获取表名和字段,有两种方式,自己写正则表达式获取,或者调用现成的库,自己造轮子有点复杂,于是打算寻找有没有开源的库,找了很久后,终于找到了一个开源的jsqlparser,这个开源的库可以获取sql语句所有的信息,包括表名和字段,它的用法是Statement stmt = CCJSqlParserUtil.parse(sql),Statement是一个接口,它根据sql语句可以转化成不同的实现类,如下:

不同sql语句对应的操作类型都可以被格式化成对应的实现类,如果sql语句有误的时候,CCJSqlParserUtil.parse(sql)会抛出异常,Statement在转化成对应的类型的时候,可以强行转换,比如CreateTable stmt = (CreateTable) CCJSqlParserUtil.parse(sql),也可以通过instanceof来判断相对于的类型。

这里通过讲解一个CreateTable获取创建表sql语句所有信息来简要介绍其应用。

Maven依赖:

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

代码实现:

import java.io.StringReader;
import java.util.List;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.parser.CCJSqlParserManager;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.util.TablesNamesFinder;

public class JSqlParserTest {

	public static void main(String[] args) throws Exception {
		String sql = "create table table1(id int(11,2,3),name varchar(36,0))";
		getCreateTableInfo(sql);
	}

	/**
	 * 根据SQL语句获取表名和建表参数
	 * 
	 * @param sql sql语句
	 * @return
	 * @throws JSQLParserException
	 */
	private static void getCreateTableInfo(String sql) throws JSQLParserException {
		
		CreateTable stmt = (CreateTable) CCJSqlParserUtil.parse(sql);
		TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
		System.out.println("表名:" + tablesNamesFinder.getTableList(stmt));
		List<ColumnDefinition> list = stmt.getColumnDefinitions();
		for (ColumnDefinition d : list) {
			System.out.println("列名:" + d.getColumnName() + "  ,列类型:" + d.getColDataType().getDataType() + "  长度:"
					+ d.getColDataType().getArgumentsStringList());
		}
	}
}

结果如下:

参考连接
1.https://github.com/JSQLParser/JSqlParser
2.https://github.com/JSQLParser/JSqlParser/wiki/Examples-of-SQL-parsing
3.https://www.cnblogs.com/tonggc1668/p/6992902.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JSqlParser 可以很方便地从 SQL 语句提取表名和字段名。以下是一个简单的 Java 代码示例,可以从 SQL 语句提取出表名和所有字段名: ```java import java.util.List; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Expression; 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.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SelectBody; import net.sf.jsqlparser.statement.select.SelectItem; import net.sf.jsqlparser.statement.select.SelectVisitorAdapter; public class TableAndColumnExtractor { public static void main(String[] args) throws JSQLParserException { String sql = "SELECT a.id, a.name, b.age FROM table1 a, table2 b WHERE a.id = b.id"; Statement statement = CCJSqlParserUtil.parse(sql); Select select = (Select) statement; SelectBody selectBody = select.getSelectBody(); selectBody.accept(new SelectVisitorAdapter() { @Override public void visit(PlainSelect plainSelect) { List<SelectItem> selectItems = plainSelect.getSelectItems(); for (SelectItem selectItem : selectItems) { selectItem.getExpression().accept(new SelectVisitorAdapter() { @Override public void visit(Column column) { System.out.println("Column name: " + column.getColumnName()); } }); } Table table = (Table) plainSelect.getFromItem(); System.out.println("Table name: " + table.getName()); } }); } } ``` 在上面的代码,我们首先将 SQL 语句解析为一个 Statement 对象,然后获取的 Select 对象和 SelectBody 对象。接着,我们使用 SelectVisitorAdapter 类访问 SelectBody 对象,从提取出表名和字段名。最后,我们打印出了所有的字段名和表名。 需要注意的是,JSqlParser 还支持其他类型的 SQL 语句,例如 INSERT、UPDATE 和 DELETE,您可以根据需要进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值