使用 java 注释生成 Postgresql table
Generating Postgresql table using java Annotations
我正在研究注释和休眠的工作原理,以便更好地理解它。
我知道我的代码可能不是最好的质量,当我可以解决我的异常时我会修复它,我一直收到 NullPointerException
,但我不明白为什么,我做了什么错了?
这个class中的主要只是为了找到问题的原因,我有另一个class将使用这个,从我的另一个class我可以将数据添加到我的 table,但我需要能够使用注释生成 table,这就是我获取 NullPointerException
的地方 我无法生成我的 table
这是我的StackTrace
Exception in thread "main" java.lang.RuntimeException: java.lang.NullPointerException
at psybergate.grad2018.javafnds.javabasics.annotations.hw3.vendor.DatabaseManager.generateDatabase(DatabaseManager.java:84)
at psybergate.grad2018.javafnds.javabasics.annotations.hw3.vendor.DatabaseManager.main(DatabaseManager.java:40)
Caused by: java.lang.NullPointerException
at psybergate.grad2018.javafnds.javabasics.annotations.hw3.vendor.DatabaseManager.generateDatabase(DatabaseManager.java:82)
... 1 more
这是我的代码
package psybergate.grad2018.javafnds.javabasics.annotations.hw3.vendor;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import psybergate.grad2018.javafnds.javabasics.annotations.hw3.annotations.DomainClass;
import psybergate.grad2018.javafnds.javabasics.annotations.hw3.annotations.DomainProperty;
import psybergate.grad2018.javafnds.javabasics.annotations.hw3.developer.Customer;
/**
* @since 26 Apr 2018
* @author christiaan.dotze
*/
public class DatabaseManager {
private String addField = "";
private Connection connect = null;
private Statement statement = null;
private String primaryKey = "";
private String tableName = "";
public static void main(String[] args) {
DatabaseManager manager = new DatabaseManager();
try {
Customer cust = new Customer();
cust.setCustomerNum("11");
cust.setFirstName("John");
cust.setLastName("Doe");
cust.setAge(27);
cust.setDateOfBirth(1991);
manager.generateDatabase(cust);
} catch (ClassNotFoundException | NoSuchFieldException | SecurityException | SQLException ex) {
throw new RuntimeException("An error occured", ex);
}
}
public String getTableName(Object obj) {
Annotation[] domainClassAnnotation = obj.getClass().getDeclaredAnnotations();
for (Annotation annotation : domainClassAnnotation) {
if (annotation instanceof DomainClass) {
tableName = ((DomainClass) annotation).name();
}
}
return tableName;
}
private String getDatabaseFields(Object obj) throws NoSuchFieldException, SecurityException {
Field[] decladedFields = obj.getClass().getDeclaredFields();
for (Field field : decladedFields) {
Annotation[] annotations = field.getDeclaredAnnotations();
for (Annotation annotation : annotations) {
if (annotation instanceof DomainProperty) {
DomainProperty myAnnotation = (DomainProperty) annotation;
if (myAnnotation.primaryKey() == true) primaryKey = myAnnotation.name();
if (myAnnotation.unique() == false) {
addField += myAnnotation.name() + " " + myAnnotation.dataType() + ",\n";
} else {
addField += myAnnotation.name() + " " + myAnnotation.dataType() + " " + "NOT NULL" + ",\n";
}
}
}
}
addField += "PRIMARY KEY(" + primaryKey + ")\n";
return addField;
}
public void generateDatabase(Object obj)
throws SQLException, ClassNotFoundException, NoSuchFieldException, SecurityException {
createConnection();
getTableName(obj);
getDatabaseFields(obj);
try {
statement.executeUpdate("CREATE TABLE " + getTableName(obj) + "(\n" + getDatabaseFields(obj) + ")");
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
private void createConnection() throws ClassNotFoundException, SQLException {
Class.forName("org.postgresql.Driver");
connect = DriverManager.getConnection("jdbc:postgresql://localhost:5432/", "postgres", "1234");
}
public int add(Object obj, String data)
throws NoSuchFieldException, SecurityException, SQLException, ClassNotFoundException {
createConnection();
statement = connect.createStatement();
return statement.executeUpdate("INSERT INTO " + getTableName(obj) + " VALUES (" + data + ")");
}
}
您在 'generateDatabase' 方法中有空对象 'statement'。当 'add' 从不运行时,'statement' 字段在 'add' 方法中初始化。
尽量放
statement = connect.createStatement();
在
之后
createConnection();
在 'generateDatabase' 方法中。
我正在研究注释和休眠的工作原理,以便更好地理解它。
我知道我的代码可能不是最好的质量,当我可以解决我的异常时我会修复它,我一直收到 NullPointerException
,但我不明白为什么,我做了什么错了?
这个class中的主要只是为了找到问题的原因,我有另一个class将使用这个,从我的另一个class我可以将数据添加到我的 table,但我需要能够使用注释生成 table,这就是我获取 NullPointerException
的地方 我无法生成我的 table
这是我的StackTrace
Exception in thread "main" java.lang.RuntimeException: java.lang.NullPointerException
at psybergate.grad2018.javafnds.javabasics.annotations.hw3.vendor.DatabaseManager.generateDatabase(DatabaseManager.java:84)
at psybergate.grad2018.javafnds.javabasics.annotations.hw3.vendor.DatabaseManager.main(DatabaseManager.java:40)
Caused by: java.lang.NullPointerException
at psybergate.grad2018.javafnds.javabasics.annotations.hw3.vendor.DatabaseManager.generateDatabase(DatabaseManager.java:82)
... 1 more
这是我的代码
package psybergate.grad2018.javafnds.javabasics.annotations.hw3.vendor;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import psybergate.grad2018.javafnds.javabasics.annotations.hw3.annotations.DomainClass;
import psybergate.grad2018.javafnds.javabasics.annotations.hw3.annotations.DomainProperty;
import psybergate.grad2018.javafnds.javabasics.annotations.hw3.developer.Customer;
/**
* @since 26 Apr 2018
* @author christiaan.dotze
*/
public class DatabaseManager {
private String addField = "";
private Connection connect = null;
private Statement statement = null;
private String primaryKey = "";
private String tableName = "";
public static void main(String[] args) {
DatabaseManager manager = new DatabaseManager();
try {
Customer cust = new Customer();
cust.setCustomerNum("11");
cust.setFirstName("John");
cust.setLastName("Doe");
cust.setAge(27);
cust.setDateOfBirth(1991);
manager.generateDatabase(cust);
} catch (ClassNotFoundException | NoSuchFieldException | SecurityException | SQLException ex) {
throw new RuntimeException("An error occured", ex);
}
}
public String getTableName(Object obj) {
Annotation[] domainClassAnnotation = obj.getClass().getDeclaredAnnotations();
for (Annotation annotation : domainClassAnnotation) {
if (annotation instanceof DomainClass) {
tableName = ((DomainClass) annotation).name();
}
}
return tableName;
}
private String getDatabaseFields(Object obj) throws NoSuchFieldException, SecurityException {
Field[] decladedFields = obj.getClass().getDeclaredFields();
for (Field field : decladedFields) {
Annotation[] annotations = field.getDeclaredAnnotations();
for (Annotation annotation : annotations) {
if (annotation instanceof DomainProperty) {
DomainProperty myAnnotation = (DomainProperty) annotation;
if (myAnnotation.primaryKey() == true) primaryKey = myAnnotation.name();
if (myAnnotation.unique() == false) {
addField += myAnnotation.name() + " " + myAnnotation.dataType() + ",\n";
} else {
addField += myAnnotation.name() + " " + myAnnotation.dataType() + " " + "NOT NULL" + ",\n";
}
}
}
}
addField += "PRIMARY KEY(" + primaryKey + ")\n";
return addField;
}
public void generateDatabase(Object obj)
throws SQLException, ClassNotFoundException, NoSuchFieldException, SecurityException {
createConnection();
getTableName(obj);
getDatabaseFields(obj);
try {
statement.executeUpdate("CREATE TABLE " + getTableName(obj) + "(\n" + getDatabaseFields(obj) + ")");
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
private void createConnection() throws ClassNotFoundException, SQLException {
Class.forName("org.postgresql.Driver");
connect = DriverManager.getConnection("jdbc:postgresql://localhost:5432/", "postgres", "1234");
}
public int add(Object obj, String data)
throws NoSuchFieldException, SecurityException, SQLException, ClassNotFoundException {
createConnection();
statement = connect.createStatement();
return statement.executeUpdate("INSERT INTO " + getTableName(obj) + " VALUES (" + data + ")");
}
}
您在 'generateDatabase' 方法中有空对象 'statement'。当 'add' 从不运行时,'statement' 字段在 'add' 方法中初始化。
尽量放
statement = connect.createStatement();
在
之后createConnection();
在 'generateDatabase' 方法中。