Ich bitte um einen Denkanstoß bei einem Anfängerproblem. Ich hoffe, ihr könnt mir helfen. Ich sitz schon den ganzen Tag und durchstöber das Web.
Problem:
Verteilung von Driver, Connection, Statement und Resultset auf verschiedene Klassen. Wenn alles in der Klasse db_connection ist, funktioniert es, aber bei der Verteilung nicht. Ich denk mal, dass das Problem bei der Vererbung liegt, denn db_resultset müsste wohl auch von db_connection erben. Dies ist natürlich nicht möglich.
Fehlermeldung: NullPointerexception.
Exception in thread "main" Verbindung hergestellt
java.lang.NullPointerException
at Datenhaltung.db_statements.db_createStatement(db_statements.java:27)
at Datenhaltung.dbMain.main(dbMain.java:20)
[JAVA=42]
public class db_connection {
private String dbHostname = "***";
private String dbPort ="1521";
private String dbName = "***";
private String dbUser = "***";
private String dbPassword = "**";
private Connection conn = null;
public Connection getConn() {
return conn;
}
public void setConn(Connection conn) {
this.conn = conn;
}
public Connection db_connect ()
{
try {
System.out.println("* Verbindung aufbauen");
String url = "jdbc
racle:thin
"+dbHostname+":"+dbPort+":"+dbName;
conn = DriverManager.getConnection(url, dbUser, dbPassword);
System.out.println("Verbindung hergestellt");
// conn.setAutoCommit(false);
}
catch (SQLException sqlconnect)
{
System.out.println("SQLException: " + sqlconnect.getMessage());
System.out.println("SQLState: " + sqlconnect.getSQLState());
System.out.println("VendorError: " + sqlconnect.getErrorCode());
sqlconnect.printStackTrace();
}
return conn;
}
public void db_close()
{
System.out.println("* Datenbank-Verbindung beenden");
try
{
conn.close();
System.out.println("Verbindung geschlossen");
}
catch (SQLException sqlclose)
{
System.out.println("SQLException: " + sqlclose.getMessage());
System.out.println("SQLState: " + sqlclose.getSQLState());
System.out.println("VendorError: " + sqlclose.getErrorCode());
sqlclose.printStackTrace();
}
}
[/code]
Die Verbindung wird hergestellt und geschlossen, wenn nur die klasse db_connection und driver genutzt wird.
[JAVA=42]
public class db_statements extends db_connection {
private Statement stmt = null;
public Statement getStmt() {
return stmt;
}
public void setStmt(Statement stmt) {
this.stmt = stmt;
}
public Statement db_createStatement()
{
try {
stmt = getConn().createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
return stmt;
}
public void db_closeStatement ()
{
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
[/code]
Ich denke, es ist sinnvoll, eine eigene Klasse für die Statements zu erstellen. Hatte diese vorher auch bei der Connection, find es aber aufgeteilt schöner.
[JAVA=42]
public class db_resultsets extends db_statements{
public void resultNames()
{
try {
ResultSet kunden = getStmt().executeQuery("SELECT * FROM kunde");
while (kunden.next())
{
String name = kunden.getString("Name");
System.out.println(name);
}
}
catch (SQLException rsetNamen)
{
rsetNamen.printStackTrace();
}
}
}
[/code]
[JAVA=42]
public class db_driver {
public void db_registerDriver()
{
try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
System.out.println("Treiber geladen");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
[/code]
Hier noch die Main...
[JAVA=42]
public class dbMain {
/**
* @param args
*/
public static void main(String[] args) {
//Klassen erzeugen
db_driver dbdriver = new db_driver();
db_connection dbconn = new db_connection();
db_statements dbstmt = new db_statements();
db_resultsets dbrset = new db_resultsets();
dbdriver.db_registerDriver();
dbconn.db_connect();
dbstmt.db_createStatement();
dbrset.resultNames();
dbstmt.db_closeStatement();
dbconn.db_close();
}
}
[/code]
Problem:
Verteilung von Driver, Connection, Statement und Resultset auf verschiedene Klassen. Wenn alles in der Klasse db_connection ist, funktioniert es, aber bei der Verteilung nicht. Ich denk mal, dass das Problem bei der Vererbung liegt, denn db_resultset müsste wohl auch von db_connection erben. Dies ist natürlich nicht möglich.
Fehlermeldung: NullPointerexception.
Exception in thread "main" Verbindung hergestellt
java.lang.NullPointerException
at Datenhaltung.db_statements.db_createStatement(db_statements.java:27)
at Datenhaltung.dbMain.main(dbMain.java:20)
[JAVA=42]
public class db_connection {
private String dbHostname = "***";
private String dbPort ="1521";
private String dbName = "***";
private String dbUser = "***";
private String dbPassword = "**";
private Connection conn = null;
public Connection getConn() {
return conn;
}
public void setConn(Connection conn) {
this.conn = conn;
}
public Connection db_connect ()
{
try {
System.out.println("* Verbindung aufbauen");
String url = "jdbc
conn = DriverManager.getConnection(url, dbUser, dbPassword);
System.out.println("Verbindung hergestellt");
// conn.setAutoCommit(false);
}
catch (SQLException sqlconnect)
{
System.out.println("SQLException: " + sqlconnect.getMessage());
System.out.println("SQLState: " + sqlconnect.getSQLState());
System.out.println("VendorError: " + sqlconnect.getErrorCode());
sqlconnect.printStackTrace();
}
return conn;
}
public void db_close()
{
System.out.println("* Datenbank-Verbindung beenden");
try
{
conn.close();
System.out.println("Verbindung geschlossen");
}
catch (SQLException sqlclose)
{
System.out.println("SQLException: " + sqlclose.getMessage());
System.out.println("SQLState: " + sqlclose.getSQLState());
System.out.println("VendorError: " + sqlclose.getErrorCode());
sqlclose.printStackTrace();
}
}
[/code]
Die Verbindung wird hergestellt und geschlossen, wenn nur die klasse db_connection und driver genutzt wird.
[JAVA=42]
public class db_statements extends db_connection {
private Statement stmt = null;
public Statement getStmt() {
return stmt;
}
public void setStmt(Statement stmt) {
this.stmt = stmt;
}
public Statement db_createStatement()
{
try {
stmt = getConn().createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
return stmt;
}
public void db_closeStatement ()
{
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
[/code]
Ich denke, es ist sinnvoll, eine eigene Klasse für die Statements zu erstellen. Hatte diese vorher auch bei der Connection, find es aber aufgeteilt schöner.
[JAVA=42]
public class db_resultsets extends db_statements{
public void resultNames()
{
try {
ResultSet kunden = getStmt().executeQuery("SELECT * FROM kunde");
while (kunden.next())
{
String name = kunden.getString("Name");
System.out.println(name);
}
}
catch (SQLException rsetNamen)
{
rsetNamen.printStackTrace();
}
}
}
[/code]
[JAVA=42]
public class db_driver {
public void db_registerDriver()
{
try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
System.out.println("Treiber geladen");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
[/code]
Hier noch die Main...
[JAVA=42]
public class dbMain {
/**
* @param args
*/
public static void main(String[] args) {
//Klassen erzeugen
db_driver dbdriver = new db_driver();
db_connection dbconn = new db_connection();
db_statements dbstmt = new db_statements();
db_resultsets dbrset = new db_resultsets();
dbdriver.db_registerDriver();
dbconn.db_connect();
dbstmt.db_createStatement();
dbrset.resultNames();
dbstmt.db_closeStatement();
dbconn.db_close();
}
}
[/code]
Zuletzt bearbeitet: