在建表的时候,需要获取表名和字段,有两种方式,自己写正则表达式获取,或者调用现成的库,自己造轮子有点复杂,于是打算寻找有没有开源的库,找了很久后,终于找到了一个开源的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