[JAVA] Ich habe eine Quelle erstellt, die automatisch eine JPA-Entitätsklassendatei generiert

Einführung

Wie der Titel schon sagt, habe ich diesmal eine App erstellt, die Java-Dateien der Entity-Klasse generiert! Es wurde bestätigt, dass es mit OracleDB11g2R und MySQL funktioniert.

Test.java


import java.util.ArrayList;

import annotation.Entity;
import annotation.Table;
import annotation.column;
import annotation.id;

@Entity
@Table("test")//Der in der Datenbank registrierte Tabellenname wird angezeigt.
public class Test {

	@id//Primärschlüssel
	@column//Säule
	private String num;

	@column//Säule
	private String namename;

	public void setNum(String num) {
		this.num = num;
 	}

	public String getNum() {
		return this.num;
 	}

	public void setNamename(String namename) {
		this.namename = namename;
 	}

	public String getNamename() {
		return this.namename;
 	}

}

Umwelt (angemessen)

Konfiguration (super Übersicht)

Name der Klasse Erläuterung
EntityGenerator Eine Klasse, die JavaFile erstellt und den Inhalt der Datei schreibt, während die folgende Klasse aufgerufen wird
DBReader Klassen, die eine Verbindung zur Datenbank herstellen und Metadaten abrufen (Tabellenliste, Spaltenname, Primärschlüssel usw.)..)
DataTypeMapper Klasse, die den Spaltendatentyp in den DB-Datentyp → Java-Datentyp konvertiert
EntityInfo Eine Klasse, die die von DBReader erfassten Informationen speichert
Anmerkungsgruppe @Table, @Id, @column

Quelle

EntityGenerator

interface

EntityGenerator.java



package entityCreater.generator;

public interface EntityGenerator {

	void generateEntity();

}

Implementierungsklasse

EntityGeneratorImplements.java



package entityCreater.generator;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import entityCreater.info.EntityInfo;
import entityCreater.reader.DBReaderImplements;

public class EntityGeneratorImplements implements EntityGenerator{

	//Wo soll die Datei gespeichert werden?
	String filePlace;

	/**
	 *Konstrukteur
	 */
	public EntityGeneratorImplements(String filePlace) {
		this.filePlace = filePlace;
	}

	/**
	 *Methode zur Erstellung von Entitäten
	 */
	@Override
	public void generateEntity() {
		System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		System.out.println("Starten Sie die EntityFile-Erstellungsmethode");

		ArrayList<EntityInfo> entityInfos = new DBReaderImplements().read();
		for(EntityInfo ei : entityInfos) {
			createFile(ei);
		}
	}


	/**
	 *EntityFile-Erstellungsmethode
	 * @param entityInfo
	 */
	private void createFile(EntityInfo entityInfo) {
    	//Informationen zur DB-Tabelle abrufen
    	String tableName = entityInfo.getTableName();
    	String id = entityInfo.getId();
    	List<String[]> columns = entityInfo.getColumns();

    	//Klassennamen generieren
    	String className = tableName.substring(0, 1).toUpperCase() + tableName.substring(1).toLowerCase();

		//EntityFile-Klasse
		File entityFile = new File(filePlace + "/" + className + ".java");

		try{
			if (entityFile.createNewFile()){
				System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		    	System.out.println("Die Datei wurde erfolgreich erstellt.");
		    }else{
		    	System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		    	System.out.println("Erstellen der Datei fehlgeschlagen");
		    }
		}catch(IOException e){
		    System.out.println(e);
		}

		//Erstellen Sie den Inhalt der Datei
		System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
    	System.out.println("Erstellen Sie den Inhalt der Datei.");

    	try(PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(entityFile, true)));) {

    		//Anmerkungsimportanweisung
    		pw.println("import annotation.Entity;");
    		pw.println("import annotation.Table;");
    		pw.println("import annotation.id;");
    		pw.println("import annotation.column;");
    		pw.println("");

    		//Klassenerklärung(Start)
    		pw.println("@Entity");
    		pw.println("@Table(\"" + tableName + "\")");
    		pw.println("public class " + className + " {");
    		pw.println("");

    		//Spaltendeklaration
    		Iterator<String[]> it = columns.iterator();

    		while(it.hasNext()) {
    			String[] colum = it.next();

    			//Spaltendeklaration
    			if(colum[1].equals(id)) {
    	    		pw.println("	@id");
    			}
    			pw.println("	@column");
        		pw.println("	private " + colum[0] + " " + colum[1] + ";");
        		pw.println("");

    		}

    		//Setter.Getter Erklärung
    		//Bringen Sie Iterator zum Anfang zurück
    		it = columns.iterator();

    		while(it.hasNext()) {
    			String[] colum = it.next();

    			//Setter-Erklärung
    			pw.println("	public void set" + colum[1].substring(0, 1).toUpperCase() + colum[1].substring(1).toLowerCase() + "(" + colum[0] + " " + colum[1] + ") {");
    			pw.println("		this." + colum[1] + " = " + colum[1] + ";");
    			pw.println(" 	}");
    			pw.println("");

    			//Getter Erklärung
    			pw.println("	public " + colum[0] + " get" + colum[1].substring(0, 1).toUpperCase() + colum[1].substring(1).toLowerCase() + "() {");
    			pw.println("		return this." + colum[1] + ";");
    			pw.println(" 	}");
    			pw.println("");
    		}

    		//Klassenerklärung(Ende)
    		pw.println("}");

			//Anzeige beenden
			System.out.println(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
	    	System.out.println("*************************************************************");
	    	System.out.println("***Fügen Sie die SUCCESS-Paketdeklaration und die Multiplizitätsdeklaration hinzu.***");
	    	System.out.println("*************************************************************");

		} catch (IOException e) {
			e.printStackTrace();
		}finally {

		}
	}


}

DBReader interface

DBReader.java


package entityCreater.reader;

import java.util.ArrayList;

import entityCreater.info.EntityInfo;

public interface DBReader {

	ArrayList<EntityInfo> read();
}

Implementierungsklasse

DBReaderImplements.java


package entityCreater.reader;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Iterator;

import container.DBConfig;
import container.EnvironmentConfigReader;
import db_access.DBAccess;
import entityCreater.dataTypeMapper.DataTypeMapper;
import entityCreater.info.EntityInfo;

public class DBReaderImplements implements DBReader{

	@Override
	public ArrayList<EntityInfo> read() {

		//Zum Speichern von Metadaten
		ResultSet rs = null;

		//Zum Speichern von Tabelleninformationen
		ArrayList<String> tableNames = new ArrayList<>();

		//Zum Speichern von Entitätsinformationen
		ArrayList<EntityInfo> entityInfos = new ArrayList<>();

		//DB-Einstellungen abrufen
                /*
          *Sorgen Sie sich nicht zu sehr um die folgenden Bereiche.
          *Rufen Sie die DB-Verbindungsinformationen (URL, PASSWORT usw.) aus Ihrer eigenen yaml-Datei ab.
          *Ich erhalte gerade die Verbindung mit der Datenbank in der DBAccess-Klasse.
          *Die Quellen von EnvironmentConfigReader und DBAccess werden als Referenz aufgelistet.
          */

               /*
               *von hier
               */
		EnvironmentConfigReader ecr = new EnvironmentConfigReader();
		DBConfig dbc = ecr.read();

		String dbName = dbc.getDbName();

		//Verbindung herstellen
		DBAccess dba = new DBAccess(dbc);

               /*
               *Bisher
               */

		try {

			//Verbindung mit der Datenbank
			Connection con = dba.getConnection();

			//Datenbank-Metadaten abrufen
			DatabaseMetaData dbmd = con.getMetaData();

			//Tabellennamen abrufen
			System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
			System.out.println("Holen Sie sich die Tabellenliste");
			String[] types = { "TABLE", "VIEW", "SYSTEM TABLE" };
			rs = dbmd.getTables(dbName, null, "%", types);
			while (rs.next()) {
				String tableName = rs.getString("TABLE_NAME");

				//Speicherung des Tabellennamens
				tableNames.add(tableName);
			}

			//Klassen zum Speichern von Tabelleninformationen
			Iterator<String> tableNameList = tableNames.iterator();
			String tableName;
			String id = null;
			ArrayList<String[]> columns;

			while (tableNameList.hasNext()) {

				//Holen Sie sich TableName
				tableName = tableNameList.next();

				System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
				System.out.println("Tabellenname:" + tableName + "Entitätsklasse wird generiert");

				//Holen Sie sich alle Spalteninformationen der Tabelle
				System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
				System.out.println("Tabellenname:" + tableName + "Holen Sie sich alle Spalteninformationen von");
				rs = dbmd.getColumns(dbName, null, tableName, "%");

				//Zur Spaltenspeicherung
				columns = new ArrayList<>();
				while (rs.next()) {
					//Konvertieren Sie vom SQL-Datentyp in den Java-Datentyp
					String dataType = DataTypeMapper.dataTypeChange(rs.getString("TYPE_NAME"));

					//Konvertieren Sie Variablennamen in Kleinbuchstaben
					String columnName = rs.getString("COLUMN_NAME").toLowerCase();

					String[] column = { dataType, columnName };
					columns.add(column);
				}

				//Primärschlüssel abrufen
				System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
				System.out.println("Tabellenname:" + tableName + "Holen Sie sich den Primärschlüssel für");
				ResultSet primaryKeys = dbmd.getPrimaryKeys(dbName, null, tableName);
				if (primaryKeys.next()) {
					System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
					System.out.println("Tabellenname:" + tableName + "Primärschlüssel ist" + primaryKeys.getString("COLUMN_NAME") + "ist");
					id = primaryKeys.getString("COLUMN_NAME").toLowerCase();
				}

				System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
				System.out.println("Tabelleninformationen werden in der EntityInfo-Klasse gespeichert");
				//Speicherklasse für Tabelleninformationen
				EntityInfo ei = new EntityInfo();

				//Legen Sie TableName in der Tabelleninformationsspeicherklasse fest
				ei.setTableName(tableName);
				//Legen Sie die ID in der Speicherklasse für Tabelleninformationen fest
				ei.setId(id);
				//Legen Sie die Spalteninformationen in der Speicherklasse für Tabelleninformationen fest
				ei.setColumns(columns);

				entityInfos.add(ei);
			}

			rs.close();

			//Datenbank schließen
			System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
			System.out.println("Verwerfen Sie die Verbindung mit der DB");
			con.close();

		} catch (Exception e) {
			System.out.println("Ausnahme aufgetreten");
			e.printStackTrace();
		}
		return entityInfos;
	}

}

DataTypeMapper

DataTypeMapper.java



package entityCreater.dataTypeMapper;

public class DataTypeMapper {

	/**
	 *Klasse zum Konvertieren vom SQL-Datentyp in den Java-Datentyp
	 * @param sqlDataType
	 * @return
	 */
	public static String dataTypeChange(String sqlDataType) {

		String javaDataType = null;

		switch (sqlDataType) {
		case "CHAR":
		case "VARCHAR":
		case "LONGVARCHAR":
			javaDataType = "String";
			break;
		case "NUMERIC":
		case "DECIMAL":
			javaDataType = "java.math.BigDecimal";
			break;
		case "BIT":
			javaDataType = "boolean";
			break;
		case "TINYINT":
			javaDataType = "byte";
			break;
		case "SMALLINT":
			javaDataType = "short";
			break;
		case "INTEGER":
		case "INT":
			javaDataType = "Integer";
			break;
		case "BIGINT":
			javaDataType = "long";
			break;
		case "REAL":
			javaDataType = "float";
			break;
		case "FLOAT":
		case "DOUBLE":
			javaDataType = "double";
			break;
		case "BINARY":
		case "VARBINARY":
		case "LONGVARBINARY":
			javaDataType = "byte[]";
			break;
		case "DATE":
			javaDataType = "java.sql.Date";
			break;
		case "TIME":
			javaDataType = "java.sql.Time";
			break;
		case "TIMESTAMP":
			javaDataType = "java.sql.Timestamp";
			break;
		default:
			break;
		}

		return javaDataType;

	}

}

EntityInfo

EntityInfo.java



package entityCreater.info;

import java.util.List;

/**
 *
 *Speicherklasse für Entitätsinformationen
 * @author okamotoyuuma
 *
 */
public class EntityInfo {

	//Tabellenname
	private String tableName;

	//Primärschlüsselname
	private String id;

	//Alle Spaltennamen und -typen
	private List<String[]> columns;

	/**
	 * (non-javadoc)
	 * getter setter
	 * @return
	 */

	public String getTableName() {
		return tableName;
	}

	public void setTableName(String tableName) {
		this.tableName = tableName;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public List<String[]> getColumns() {
		return columns;
	}

	public void setColumns(List<String[]> columns) {
		this.columns = columns;
	}

}

Anmerkung

@ Table Annotation (Klasse, die den Tabellennamen im Attribut speichert)

Table.java


package annotation;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Target(TYPE)
@Retention(RUNTIME)
public @interface Table {

	String value();

}

@ ID Annotation (dem Primärschlüsselfeld zugewiesen)

id.java


package annotation;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(RUNTIME)
@Target(FIELD)
public @interface id {

}

@ columnn-Annotation (zum Spaltenwert der Tabelle hinzugefügt)

column.java


package annotation;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(RUNTIME)
@Target(FIELD)
public @interface column {

}

Wie benutzt man

Erstellen Sie eine Hauptmethode und geben Sie den Speicherort für die generierte Entitätsklasse wie unten gezeigt an.

main.java



public class main {

	public static void main(String[] args) {
               EntityGenerator eg = new EntityGeneratorImplements("Weg zum Ziel");
               eg.generateEntity();
	}

}

Schließlich

Dieses Mal habe ich versucht, die Entitätsklasse automatisch zu generieren. Die Quelle und Logik sind noch unreif und kindisch, aber es war eine sehr gute Erfahrung, weil ich nie eine Datei erstellt hatte! Wenn Sie Vorschläge zu Punkten haben, die nicht berücksichtigt wurden, oder Verbesserungen in der Quelle, würden wir uns freuen, wenn Sie dies kommentieren könnten.

Im folgenden Referenzabschnitt werden DB-Einstellungsdateien, zu lesende Klassen usw. aufgeführt, die in der obigen Quelle nicht aufgeführt sind. Wenn Sie interessiert sind, schauen Sie bitte.

Referenz (DB-Einstellungs-YAML-Datei und -Klasse zum Lesen der Einstellungsdatei usw.)

DB-Einstellungsdatei

DBProfile.yaml



#
!!container.DBConfig #Klassenpfad für die Einstellung der DB-Definition
driver: com.mysql.cj.jdbc.Driver #Fahrername
url: jdbc:mysql://localhost:3306/DB-Name#DB URL
user:DB-Benutzername#DB-Benutzer
password: password #DB-Passwort
numberOfAccess: 10 #Anzahl der Verbindungen
dbName:Name der Datenbank#DB-Name
dbType: MySQL #DB-Typ (diesmal werden nur MySQL und Oracle DB unterstützt)
schema:Schemaname

Klasse zum Speichern von Einstellungsinformationen

DBConfig.java



package container;

//Datenbankkonfigurationsdatei
public class DBConfig {

	//Fahrername
	String driver;

	//DB URL
	String url;

	//DB-Benutzer
	String user;

	//Passwort
	String password;

	//Schemaname
	String schema;

	//Anzahl der hergestellten Verbindungen
	int numberOfAccess;

	//DBName
	String dbName;

	//DBType
	String dbType;

	public String getDriver() {
		return driver;
	}

	public void setDriver(String driver) {
		this.driver = driver;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getSchema() {
		return schema;
	}

	public void setSchema(String schema) {
		this.schema = schema;
	}

	public int getNumberOfAccess() {
		return numberOfAccess;
	}

	public void setNumberOfAccess(int numberOfAccess) {
		this.numberOfAccess = numberOfAccess;
	}

	public String getDbName() {
		return dbName;
	}

	public void setDbName(String dbName) {
		this.dbName = dbName;
	}

	public String getDbType() {
		return dbType;
	}

	public void setDbType(String dbType) {
		this.dbType = dbType;
	}

}


EnvironmentConfigReader-Klasse, die die obige Konfigurationsdatei liest

EnvironmentConfigReader.java



package container;

import org.yaml.snakeyaml.Yaml;

public class EnvironmentConfigReader implements Reader<DBConfig>{

	//DB-Konfigurationsdatei
	static String configFileName = "DBProfile.yaml";

	//Methode zum Abrufen der DB-Einstellungen aus der Yaml-Datei(Keine Argumente)
	@Override
	public DBConfig read() {
		//Speicherort für die Protokollgenerierung
		System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		//Inhalte verarbeiten
		System.out.println(configFileName + "Wird geladen.");

		Yaml yaml = new Yaml();
		DBConfig dbc = (DBConfig) yaml.load(getClass().getResourceAsStream(configFileName));

		//Speicherort für die Protokollgenerierung
		System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		//Inhalte verarbeiten
		System.out.println(configFileName + "Wurde geladen.");

		return dbc;
	}

	//Methode zum Abrufen der DB-Einstellungen aus der Yaml-Datei(Mit Argument)
	@Override
	public DBConfig read(String setConfigFileName) {
		//Speicherort für die Protokollgenerierung
		System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		//Inhalte verarbeiten
		System.out.println(configFileName + "Wird geladen.");

		//Legen Sie den angegebenen Dateinamen fest
		if (configFileName != null) {
			configFileName = setConfigFileName;
		}

		Yaml yaml = new Yaml();
		DBConfig dbc = (DBConfig) yaml.load(getClass().getResourceAsStream(configFileName));

		//Speicherort für die Protokollgenerierung
		System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		//Inhalte verarbeiten
		System.out.println(configFileName + "Wurde geladen.");

		return dbc;
	}

}

Klasse, die die Verbindung mit DB speichert

DBAccess.java



package db_access;

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

import container.DBConfig;

public class DBAccess {

	//Mitglied
	private Connection conn = null;

	public DBAccess(DBConfig dbc) {
		try {
			Class.forName(dbc.getDriver());
			conn = DriverManager.getConnection(dbc.getUrl(), dbc.getUser(), dbc.getPassword());
			System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
			System.out.println("Verbunden mit DB");
			//Auto Commit OFF
			conn.setAutoCommit(false);
		} catch (SQLException | ClassNotFoundException e) {//Verbindung konnte nicht hergestellt werden
			System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
			System.out.println("Verbindung zur Datenbank fehlgeschlagen");
			e.printStackTrace();
		}
	}

	//Verteilen Sie die Verbindung
	public Connection getConnection() {
		return conn;
	}

	//Verbindung trennen
	public void closeConnection() {
		try {
			conn.close();
			System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
			System.out.println("Von der DB getrennt");
		} catch (SQLException e) {
			//TODO automatisch generierter Fangblock
			System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
			System.out.println("Verbindung zur Datenbank konnte nicht getrennt werden");
			e.printStackTrace();
		}
	}
}

Recommended Posts

Ich habe eine Quelle erstellt, die automatisch eine JPA-Entitätsklassendatei generiert
Ich habe eine Klasse erstellt, die automatisch Json generiert, die die Textur von Minecraft angibt [1.12.2]
Ich habe eine Klasse erstellt, die JUMAN und KNP aus Java verwenden kann
Ich habe ein Diff-Tool für Java-Dateien erstellt
Ich habe eine Viewer-App erstellt, die PDF anzeigt
Einfacher Hinweis: IntelliJ generiert automatisch eine Entitätsklasse aus der Datenbank
Ich habe eine Bibliothek erstellt, die in Safari wie ein Tab funktioniert !!
Ich habe einen Wrapper erstellt, der KNP von Java aus aufruft
Punkt 25: Beschränken Sie Quelldateien auf eine einzelne Klasse der obersten Ebene
Erstellt das JAVA-Framework "numatrix", das auf einfache Weise eindeutige numerische Werte in einer verteilten Umgebung und mit mehreren Threads generiert
Ich habe einen MOD erstellt, der sofort ein Fahrzeug mit Minecraft anruft
Ich habe eine Chat-App erstellt.
Generieren Sie automatisch jpa-Entitäten mit Gradle
Ich habe eine shopify App @java erstellt
Ich habe mit Swing eine GUI erstellt
Ich habe eine einfache Empfehlungsfunktion erstellt.
Ich habe eine passende App erstellt (Android App)
Ich habe ein Tool zur Generierung von package.xml erstellt.
[Android] Ich habe eine Schrittzähler-App erstellt.
Ich habe mit Vue.js eine Seite erstellt, die Informationen zur Zuckereinschränkung zusammenfasst