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;
}
}
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 |
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;
}
}
@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 {
}
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();
}
}
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.
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