Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Thêm khóa chính vào câu lệnh TẠO BẢNG bằng JSqlParser

Trình phân tích cú pháp là một chương trình hiểu ngữ pháp của chuỗi từ/câu và tạo ra biểu diễn cây cú pháp. Nó đang được sử dụng trong nhiều lĩnh vực như ngôn ngữ lập trình, xử lý ngôn ngữ tự nhiên, SQL, v.v. Để minh họa cách sử dụng Trình phân tích cú pháp, chúng tôi sẽ đề cập đến JSqlParser mã nguồn mở trong hướng dẫn này.

JSqlParser

JSqlParser là trình phân tích cú pháp câu lệnh SQL có sẵn dưới dạng nguồn mở trong Github. Nó phân tích một câu lệnh SQL và dịch thành một hệ thống phân cấp của các lớp Java. Trong ví dụ sau, chúng ta sẽ phân tích câu lệnh CREATE TABLE bằng cách sử dụng JSqlParser. Hãy viết một chương trình Java để phân tích câu lệnh CREATE TABLE và thêm khóa chính vào đó.

TẠO câu lệnh BẢNG

CREATE TABLE College_db.Students (
 Student_id int,
 Name varchar(255),
 Course varchar(255),
 Join_date DATE
);

Trong câu lệnh CREATE TABLE ở trên, chúng ta muốn thêm Cột Student_id làm Khóa chính.

Chương trình Java để phân tích cú pháp CREATE TABLE SQL bằng cách sử dụng JSqlParser

Bước 1:Thêm JSqlParser làm phần phụ thuộc

Chúng tôi đang tạo một dự án maven để thêm JSqlParser làm phần phụ thuộc. Hãy thêm phần phụ thuộc bên dưới vào tệp pom.xml.

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

Bước 2:Gán câu lệnh CREATE TABLE đầu vào cho một biến

Đây là câu lệnh CREATE TABLE đầu vào của chúng tôi không có khóa chính. Ký tự dòng mới \n là tùy chọn. Chúng tôi cũng có thể cung cấp SQL hoàn chỉnh trong một dòng duy nhất. Để dễ đọc, chúng tôi cung cấp thông tin đầu vào ở nhiều dòng.

String createTableSql = "CREATE TABLE College_db.Students (\n" +
 " Student_id int,\n" +
 " Name varchar(255),\n" +
 " Course varchar(255),\n" +
 " Join_date DATE\n" +
 ");";

Bước 3:Phân tích cú pháp SQL bằng JSqlParser

Sử dụng Trình phân tích cú pháp sử dụng lớp CCJSqlParserUtil , chúng ta đang gọi phương thức phân tích cú pháp với đối số là CREATE TABLE sql.

Statement createTable = CCJSqlParserUtil.parse(createTableSql);

Sau khi thực thi phương thức phân tích cú pháp, đối tượng Statement createTable có cấu trúc phân cấp của các lớp Java như bên dưới.

Thêm khóa chính vào câu lệnh TẠO BẢNG bằng JSqlParser JSqlParser đầu ra dưới dạng phân cấp của các lớp Java

Bước 4 :Khám phá đầu ra của trình phân tích cú pháp

Nếu phương thức phân tích cú pháp được thực thi thành công, chúng ta có thể nhận được tất cả thông tin về câu lệnh CREATE TABLE. Hãy lấy tên cơ sở dữ liệu/bảng và định nghĩa cột của câu lệnh. Ngoài ra, chúng tôi đang thay đổi cơ sở dữ liệu và tên bảng trong câu lệnh tạo bảng.

System.out.println("Table Name from query: " + ((CreateTable) createTable).getTable().getName());
System.out.println("Database Name from query: " + ((CreateTable) createTable).getTable().getSchemaName());
System.out.println("\nColumns in the given insert query");
System.out.println("---------------------------------\n");
for(ColumnDefinition col: ((CreateTable) createTable).getColumnDefinitions())
{
 System.out.println(col.getColumnName() + " - " + col.getColDataType().toString());
}
//Changing the DB and table name
((CreateTable) createTable).getTable().setSchemaName("College_db_bk");
((CreateTable) createTable).getTable().setName("Students_bkup");

Bước 5:Tạo ràng buộc khóa chính làm chỉ mục

Chúng ta có thể đặt chỉ mục khác nhau cho Sql, chẳng hạn như Ràng buộc kiểm tra, Ràng buộc loại trừ, Khóa ngoại và Ràng buộc được đặt tên. Đối với khóa chính, chúng ta cần tạo ràng buộc Named như dưới đây.

//Creating Primary Key constraint
NamedConstraint namedConstraint = new NamedConstraint();
namedConstraint.setType("PRIMARY KEY");
//Adding column names for the Primary Key
List<Index.ColumnParams> columns = new ArrayList<>();
Index.ColumnParams columnParams = new Index.ColumnParams("Student_id");
columns.add(columnParams);
//Setting columns in the Primary Key constraint
namedConstraint.setColumns(columns);

Hãy đặt Khóa chính của Sinh viên_id làm Ràng buộc được đặt tên trong chỉ mục.

//Setting the Primary Key constraint in Index list
List<Index> indexList = new ArrayList<>();
indexList.add(namedConstraint);

Bước 6:Đặt chỉ mục trong câu lệnh CREATE TABLE

Chúng ta cần thiết lập danh sách chỉ mục trong bảng tạo như bên dưới để câu lệnh bảng CREATE sẽ được tạo bằng Khóa chính.

((CreateTable) createTable).setIndexes(indexList);

Hoàn thành chương trình Java để thêm khóa chính vào SQL CREATE TABLE

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.table.Index;
import net.sf.jsqlparser.statement.create.table.NamedConstraint;
import java.util.ArrayList;
import java.util.List;
public class AddPrimaryKey {
 public static void main(String[] args) {
 System.out.println("Adding Primary key in the CREATE TABLE statement");
 System.out.println("-------------------------------------\n");
 //Assign the input CREATE TABLE sql
 String createTableSql = "CREATE TABLE College_db.Students (\n" +
 " Student_id int,\n" +
 " Name varchar(255),\n" +
 " Course varchar(255),\n" +
 " Join_date DATE\n" +
 ");";
 try {
 //Parsing Create table statement using JSqlParser
 Statement createTable = CCJSqlParserUtil.parse(createTableSql);
 //Getting the table and database name from Create table
 System.out.println("Table Name from query: " + ((CreateTable) createTable).getTable().getName());
 System.out.println("Database Name from query: " + ((CreateTable) createTable).getTable().getSchemaName());
 System.out.println("\nColumns in the given insert query");
 System.out.println("---------------------------------\n");
 for (ColumnDefinition col : ((CreateTable) createTable).getColumnDefinitions()) {
 System.out.println(col.getColumnName() + " - " + col.getColDataType().toString());
 }
 //Changing the DB and table name
 ((CreateTable) createTable).getTable().setSchemaName("College_db_bk");
 ((CreateTable) createTable).getTable().setName("Students_bkup");
 //Creating Primary Key constraint
 NamedConstraint namedConstraint = new NamedConstraint();
 namedConstraint.setType("PRIMARY KEY");
 //Adding column names for the Primary Key
 List<Index.ColumnParams> columns = new ArrayList<>();
 Index.ColumnParams columnParams = new Index.ColumnParams("Student_id");
 columns.add(columnParams);
 //Setting columns in the Primary Key constraint
 namedConstraint.setColumns(columns);
 //Setting the Primary Key constraint in Index list
 List<Index> indexList = new ArrayList<>();
 indexList.add(namedConstraint);
 //Setting the indexes in Create table statement
 ((CreateTable) createTable).setIndexes(indexList);
 System.out.println("New CREATE TABLE statement with Primary Key");
 System.out.println("---------------------------------");
 System.out.println(createTable + ";");
 } catch (JSQLParserException e) {
 throw new RuntimeException(e);
 }
 }
}

Đầu ra

Như chúng tôi trình bày bên dưới, CREATE TABLE mới được tạo bằng khóa chính là Sinh viên_id. Ngoài ra, tên cơ sở dữ liệu và bảng cũng được đổi thành College_db_bk.Students_bkup.

Adding Primary key in the CREATE TABLE statement
-------------------------------------
Table Name from query: Students
Database Name from query: College_db
Columns in the given insert query
---------------------------------
Student_id - int
Name - varchar (255)
Course - varchar (255)
Join_date - DATE
New CREATE TABLE statement with Primary Key
---------------------------------
CREATE TABLE College_db_bk.Students_bkup (Student_id int, 
Name varchar (255), 
Course varchar (255), 
Join_date DATE, 
PRIMARY KEY (Student_id));

Bài viết được đề xuất

  • Ví dụ về trình phân tích cú pháp Hive của Apache