[JAVA] J'ai créé une source qui génère automatiquement un fichier de classe d'entité JPA

introduction

Comme le titre l'indique, cette fois j'ai créé une application qui génère des fichiers Java de la classe Entity! Il a été confirmé qu'il fonctionne avec OracleDB11g2R et MySQL.

Test.java


import java.util.ArrayList;

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

@Entity
@Table("test")//Le nom de la table enregistré dans le DB s'affiche.
public class Test {

	@id//Clé primaire
	@column//colonne
	private String num;

	@column//colonne
	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;
 	}

}

Environnement (approprié)

Configuration (super aperçu)

nom de la classe La description
EntityGenerator Une classe qui crée JavaFile et écrit le contenu du fichier tout en appelant la classe suivante
DBReader Les classes qui se connectent à DB et obtiennent des métadonnées (liste de table, nom de colonne, clé primaire, etc...)
DataTypeMapper Classe qui convertit le type de données de colonne en type de données DB → type de données Java
EntityInfo Une classe qui stocke les informations acquises par DBReader
groupe d'annotations @Table, @Id, @column

La source

EntityGenerator

interface

EntityGenerator.java



package entityCreater.generator;

public interface EntityGenerator {

	void generateEntity();

}

Classe d'implémentation

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{

	//Où enregistrer le fichier
	String filePlace;

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

	/**
	 *Méthode de création d'entité
	 */
	@Override
	public void generateEntity() {
		System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		System.out.println("Démarrez la méthode de création EntityFile");

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


	/**
	 *Méthode de création EntityFile
	 * @param entityInfo
	 */
	private void createFile(EntityInfo entityInfo) {
    	//Obtenir les informations de la table DB
    	String tableName = entityInfo.getTableName();
    	String id = entityInfo.getId();
    	List<String[]> columns = entityInfo.getColumns();

    	//Générer le nom de la classe
    	String className = tableName.substring(0, 1).toUpperCase() + tableName.substring(1).toLowerCase();

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

		try{
			if (entityFile.createNewFile()){
				System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		    	System.out.println("Le fichier a été créé avec succès.");
		    }else{
		    	System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		    	System.out.println("La création du fichier a échoué");
		    }
		}catch(IOException e){
		    System.out.println(e);
		}

		//Créer le contenu du fichier
		System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
    	System.out.println("Créez le contenu du fichier.");

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

    		//Instruction d'importation d'annotation
    		pw.println("import annotation.Entity;");
    		pw.println("import annotation.Table;");
    		pw.println("import annotation.id;");
    		pw.println("import annotation.column;");
    		pw.println("");

    		//Déclaration de classe(début)
    		pw.println("@Entity");
    		pw.println("@Table(\"" + tableName + "\")");
    		pw.println("public class " + className + " {");
    		pw.println("");

    		//Déclaration de colonne
    		Iterator<String[]> it = columns.iterator();

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

    			//Déclaration de colonne
    			if(colum[1].equals(id)) {
    	    		pw.println("	@id");
    			}
    			pw.println("	@column");
        		pw.println("	private " + colum[0] + " " + colum[1] + ";");
        		pw.println("");

    		}

    		//Setter.Déclaration Getter
    		//Remettre Iterator au début
    		it = columns.iterator();

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

    			//Déclaration de Setter
    			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("");

    			//Déclaration Getter
    			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("");
    		}

    		//Déclaration de classe(Fin)
    		pw.println("}");

			//Fin de l'affichage
			System.out.println(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
	    	System.out.println("*************************************************************");
	    	System.out.println("***Ajoutez la déclaration de package SUCCESS et la déclaration de multiplicité.***");
	    	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();
}

Classe d'implémentation

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() {

		//Pour stocker les métadonnées
		ResultSet rs = null;

		//Pour stocker les informations de table
		ArrayList<String> tableNames = new ArrayList<>();

		//Pour stocker les informations sur l'entité
		ArrayList<EntityInfo> entityInfos = new ArrayList<>();

		//Obtenir les paramètres de la base de données
                /*
          *Ne vous inquiétez pas trop des gammes suivantes.
          *Obtenez les informations de connexion à la base de données (URL, PASSWORD, etc.) à partir de votre propre fichier yaml,
          *J'obtiens juste la connexion avec la base de données dans la classe DBAccess.
          *Les sources de EnvironmentConfigReader et DBAccess sont répertoriées à titre de référence.
          */

               /*
               *d'ici
               */
		EnvironmentConfigReader ecr = new EnvironmentConfigReader();
		DBConfig dbc = ecr.read();

		String dbName = dbc.getDbName();

		//Établir une connexion
		DBAccess dba = new DBAccess(dbc);

               /*
               *Jusque là
               */

		try {

			//Connexion avec la base de données
			Connection con = dba.getConnection();

			//Obtenir les métadonnées de la base de données
			DatabaseMetaData dbmd = con.getMetaData();

			//Obtenir le nom de la table
			System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
			System.out.println("Obtenez la liste des tableaux");
			String[] types = { "TABLE", "VIEW", "SYSTEM TABLE" };
			rs = dbmd.getTables(dbName, null, "%", types);
			while (rs.next()) {
				String tableName = rs.getString("TABLE_NAME");

				//Stockage du nom de la table
				tableNames.add(tableName);
			}

			//Classes pour stocker les informations de table
			Iterator<String> tableNameList = tableNames.iterator();
			String tableName;
			String id = null;
			ArrayList<String[]> columns;

			while (tableNameList.hasNext()) {

				//Obtenir TableName
				tableName = tableNameList.next();

				System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
				System.out.println("Nom de la table:" + tableName + "La classe d'entité est générée");

				//Obtenir toutes les informations de colonne de la table
				System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
				System.out.println("Nom de la table:" + tableName + "Obtenez toutes les informations de colonne de");
				rs = dbmd.getColumns(dbName, null, tableName, "%");

				//Pour le stockage en colonne
				columns = new ArrayList<>();
				while (rs.next()) {
					//Conversion du type de données SQL au type de données Java
					String dataType = DataTypeMapper.dataTypeChange(rs.getString("TYPE_NAME"));

					//Convertir les noms de variables en minuscules
					String columnName = rs.getString("COLUMN_NAME").toLowerCase();

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

				//Obtenir la clé primaire
				System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
				System.out.println("Nom de la table:" + tableName + "Obtenez la clé primaire pour");
				ResultSet primaryKeys = dbmd.getPrimaryKeys(dbName, null, tableName);
				if (primaryKeys.next()) {
					System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
					System.out.println("Nom de la table:" + tableName + "La clé primaire est" + primaryKeys.getString("COLUMN_NAME") + "est");
					id = primaryKeys.getString("COLUMN_NAME").toLowerCase();
				}

				System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
				System.out.println("Les informations de table sont stockées dans la classe EntityInfo");
				//Classe de stockage des informations de table
				EntityInfo ei = new EntityInfo();

				//Définir TableName dans la classe de stockage des informations de table
				ei.setTableName(tableName);
				//Définir l'ID dans la classe de stockage des informations de table
				ei.setId(id);
				//Définir les informations de colonne dans la classe de stockage des informations de table
				ei.setColumns(columns);

				entityInfos.add(ei);
			}

			rs.close();

			//Fermer la base de données
			System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
			System.out.println("Annuler la connexion avec le DB");
			con.close();

		} catch (Exception e) {
			System.out.println("Il y a une exception");
			e.printStackTrace();
		}
		return entityInfos;
	}

}

DataTypeMapper

DataTypeMapper.java



package entityCreater.dataTypeMapper;

public class DataTypeMapper {

	/**
	 *Classe à convertir du type de données SQL au type de données Java
	 * @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;

/**
 *
 *Classe de stockage des informations d'entité
 * @author okamotoyuuma
 *
 */
public class EntityInfo {

	//nom de la table
	private String tableName;

	//Nom de la clé primaire
	private String id;

	//Tous les noms et types de colonnes
	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;
	}

}

Annotation

@Table annotation (classe qui stocke le nom de la table dans l'attribut)

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();

}

Annotation @id (affectée au champ de clé primaire)

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 {

}

Annotation @columnn (ajoutée à la valeur de colonne de la table)

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 {

}

Comment utiliser

Créez une méthode Main et spécifiez l'emplacement de stockage de la classe Entity générée comme indiqué ci-dessous.

main.java



public class main {

	public static void main(String[] args) {
               EntityGenerator eg = new EntityGeneratorImplements("Chemin de destination");
               eg.generateEntity();
	}

}

finalement

Cette fois, j'ai essayé de générer automatiquement la classe Entity. La source et la logique sont encore immatures et enfantines, mais ce fut une très bonne expérience car je n'avais jamais créé de fichier! Si vous avez des suggestions sur des points qui n'ont pas été pris en considération ou des améliorations dans la source, nous vous serions reconnaissants de bien vouloir commenter.

La section de référence suivante répertorie les fichiers de paramètres de base de données et les classes à lire qui ne sont pas répertoriés dans la source ci-dessus. Si vous êtes intéressé, jetez un œil.

Référence (fichier YAML de paramétrage de la base de données et classe pour lire le fichier de paramétrage, etc.)

Fichier de paramétrage DB

DBProfile.yaml



#Paramètres de base de données
!!container.DBConfig #Chemin de classe de définition de base de données
driver: com.mysql.cj.jdbc.Driver #nom du conducteur
url: jdbc:mysql://localhost:3306/Nom de la base de données#URL de la base de données
user:Nom d'utilisateur DB#Utilisateur DB
password: password #Mot de passe DB
numberOfAccess: 10 #Nombre de connexions
dbName:Nom de la base de données#Nom de la base de données
dbType: MySQL #Type de base de données (seuls MySQL et Oracle DB sont pris en charge cette fois)
schema:Nom du schéma

Classe de stockage des informations de réglage

DBConfig.java



package container;

//Fichier de configuration de la base de données
public class DBConfig {

	//Nom du conducteur
	String driver;

	//URL de la base de données
	String url;

	//Utilisateur DB
	String user;

	//mot de passe
	String password;

	//Nom du schéma
	String schema;

	//Nombre de connexions établies
	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 classe qui lit le fichier de configuration ci-dessus

EnvironmentConfigReader.java



package container;

import org.yaml.snakeyaml.Yaml;

public class EnvironmentConfigReader implements Reader<DBConfig>{

	//Fichier de configuration de la base de données
	static String configFileName = "DBProfile.yaml";

	//Méthode pour obtenir les paramètres de la base de données à partir du fichier yaml(Aucun argument)
	@Override
	public DBConfig read() {
		//Emplacement de génération de journaux
		System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		//Traitement du contenu
		System.out.println(configFileName + "Commencera le chargement.");

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

		//Emplacement de génération de journaux
		System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		//Traitement du contenu
		System.out.println(configFileName + "A été chargé.");

		return dbc;
	}

	//Méthode pour obtenir les paramètres de la base de données à partir du fichier yaml(Avec argument)
	@Override
	public DBConfig read(String setConfigFileName) {
		//Emplacement de génération de journaux
		System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		//Traitement du contenu
		System.out.println(configFileName + "Commencera le chargement.");

		//Définissez le nom de fichier spécifié
		if (configFileName != null) {
			configFileName = setConfigFileName;
		}

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

		//Emplacement de génération de journaux
		System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
		//Traitement du contenu
		System.out.println(configFileName + "A été chargé.");

		return dbc;
	}

}

Classe qui stocke la connexion avec DB

DBAccess.java



package db_access;

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

import container.DBConfig;

public class DBAccess {

	//membre
	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("Connecté à DB");
			//Validation automatique désactivée
			conn.setAutoCommit(false);
		} catch (SQLException | ClassNotFoundException e) {//Échec de l'établissement de la connexion
			System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
			System.out.println("Échec de la connexion à la base de données");
			e.printStackTrace();
		}
	}

	//Distribuez la connexion
	public Connection getConnection() {
		return conn;
	}

	//Briser la connexion
	public void closeConnection() {
		try {
			conn.close();
			System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
			System.out.println("Déconnecté de la base de données");
		} catch (SQLException e) {
			//Bloc de capture généré automatiquement TODO
			System.out.print(Thread.currentThread().getStackTrace()[1].getClassName() + ":");
			System.out.println("Impossible de se déconnecter de la base de données");
			e.printStackTrace();
		}
	}
}

Recommended Posts

J'ai créé une source qui génère automatiquement un fichier de classe d'entité JPA
J'ai créé une classe qui génère automatiquement Json qui spécifie la texture de Minecraft [1.12.2]
J'ai créé une classe qui peut utiliser JUMAN et KNP de Java
J'ai créé un outil Diff pour les fichiers Java
J'ai créé une application de visualisation qui affiche le PDF
Remarque simple: IntelliJ génère automatiquement la classe Entity à partir de la base de données
J'ai créé une bibliothèque qui fonctionne comme un onglet dans Safari !!
J'ai créé un Wrapper qui appelle KNP depuis Java
Point 25: limiter les fichiers source à une seule classe de premier niveau
Création du framework JAVA "numatrix" qui génère facilement des valeurs numériques uniques dans un environnement distribué et multi-thread
J'ai créé un MOD qui appelle instantanément un véhicule avec Minecraft
J'ai créé une application de chat.
J'ai posé une question qui peut être utilisée pour des entretiens techniques
Générez automatiquement des entités jpa à l'aide de Gradle
J'ai créé une application shopify @java
J'ai créé une interface graphique avec Swing
J'ai fait une simple fonction de recommandation.
J'ai créé une application correspondante (application Android)
J'ai créé un outil de génération package.xml.
[Android] J'ai créé une application de podomètre.
J'ai créé un site qui résume les informations sur la restriction du sucre avec Vue.js