この記事では、Javaクラスとオブジェクトに基づいてSQLクエリを自動的に生成するためのフレームワークの作成について説明します。 すでに多くの同様の既製のソリューションがあることを理解していますが、これを自分で実装したいと考えました。
フレームワークを作成するには、JavaアノテーションとJava Reflection APIを使用します。
それでは始めましょう。
いくつかのユースケースから始めましょう。
例1
特定のPersonクラスがあるとしましょう:
public static class Person { public String firstName; public String lastName; public int age; }
次の呼び出しは、このクラスに基づいてテーブルを作成するSQLクエリを生成します。
System.out.println(MySQLQueryGenerator.generateCreateTableQuery(Person.class));
実行すると、コンソールに次の出力が表示されます。
CREATE TABLE `Person_table` ( `firstName` VARCHAR(256), `lastName` VARCHAR(256), `age` INT);
例2
これで、注釈を使用した例はより複雑になります。
@IfNotExists
このクラスに基づいて、次のSQLクエリを取得します。
CREATE TABLE IF NOT EXISTS `persons` ( `id` INT AUTO_INCREMENT, `createTime` BIGINT NOT NULL, `firstName` VARCHAR(256) NOT NULL, `lastName` VARCHAR(256) NOT NULL, `age` INT DEFAULT '21', `address` VARCHAR(1024) DEFAULT '', `letter` VARCHAR(1), PRIMARY KEY (`id`));
例3
また、データベースサーバーに接続し、そこに生成されたSQLクエリを送信できる
MySQLClientクラスも作成しました。
クライアントには、
createTable 、
alterTable 、
insert 、
update 、
selectのメソッドが含まれてい
ます 。
おおよそ次のように使用されます。
MySQLClient client = new MySQLClient("login", "password", "dbName"); client.connect();
仕組み
最初に、アルゴリズムはReflection APIを使用して、クラスのすべてのパブリックフィールドと非静的フィールドを反復処理します。 この場合のフィールドがアルゴリズムでサポートされている型(すべてのプリミティブデータ型、オブジェクト類似体、String型がサポートされている)の場合、データベースオブジェクト
フィールドに関するデータを含む
Columnオブジェクトが
Fieldオブジェクトから作成されます。 Javaデータ型とMySQL型の間の変換は自動的に行われます。 また、フィールドとクラスの注釈から、テーブルとそのフィールドのすべての修飾子が抽出されます。 次に、すべての
ColumnからSQLクエリが形成されます。
public static String generateCreateTableQuery(Class clazz) throws MoreThanOnePrimaryKeyException { List<Column> columnList = new ArrayList<>(); Field[] fields = clazz.getFields();
同様に、ALTER TABLE、INSERT、およびUPDATEクエリが生成されます。 後者の2つの場合、列リストに加えて、そのフィールドの値もオブジェクトから抽出されます。
Column column = Column.fromField(field); if (column!=null) { if (column.isAutoIncrement) continue; Object value = field.get(obj); if (value==null && column.hasDefaultValue) continue;
フレームワークには
ResultSetExtractorクラスもあり、そのメソッドである
extractResultSet(ResultSet resultSet、Class clazz)は、resultSetからclazzクラスのオブジェクトのリストを自動的に作成します。 これは非常に簡単に行われるため、ここではその動作の原理について説明しません。
github
では、フレームワークの完全なソースコードを見ることができます。 これで私はすべてを持っています。