Reputation: 893
I have a couple of questions on the class below.
public class Test {
public void run() throws SQLException {
Connection conn = getConnection();
DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
// query books for author named 'selena'
Result<Record2<Long, String>> result = create
.select(BOOK.ID, BOOK.TITLE).from(BOOK).join(BOOK_AUTHOR_REL)
.on(BOOK_AUTHOR_REL.BOOKID.equal(BOOK.ID)).join(AUTHOR)
.on(BOOK_AUTHOR_REL.AUTHORID.equal(AUTHOR.ID))
.where(AUTHOR.NAME.equal("selena"))
.orderBy(BOOK.TITLE.asc(), BOOK.ID.asc()).fetch();
result.forEach((r) -> {
System.out.println(String.format("%s (id: %s)",
r.getValue(BOOK.TITLE), r.getValue(BOOK.ID)));
});
conn.close();
System.exit(0);
}
public static void main(final String[] args) throws SQLException {
new Test().run();
}
private Connection getConnection() {
try {
Class.forName(System.getProperty("jdbc.driver")).newInstance();
return DriverManager.getConnection(System.getProperty("jdbc.url"),
System.getProperty("jdbc.user"),
System.getProperty("jdbc.password"));
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return null;
}
}
void run
not in any other method which belongs to instance of class? Why is the String argument final
here?
public static void main(final String[] args) throws SQLException {
new Test().run();
}
After closing the connection, why are we calling System.exit()
?
conn.close();
System.exit(0);
Upvotes: 2
Views: 97
Reputation: 96434
It's not created in a new thread. In order to call this in a new thread, then Test would have to implement Runnable (or extend Thread). Assuming Test implemented Runnable there would be a line like new Thread(new Test()).start();
.
There's a convention that an argument to a method shouldn't be modified. Using final prevents that, but it is unnecessary here, since the JVM won't do anything with args after calling main. Also note making the array final doesn't make its contents unmodifiable.
Calling System.exit is unnecessary here. The code is done executing anyway, the JVM will terminate once there's no more code to run. System.exit abruptly kills the JVM.
This is not great code. Having the getConnection catch exceptions and return null is bad style (because the rest of the program doesn't know the connection is null and will try to access it, causing a NullPointerException), it could be changed to:
private Connection getConnection() throws SQLException {
return DriverManager.getConnection(System.getProperty("jdbc.url"),
System.getProperty("jdbc.user"),
System.getProperty("jdbc.password"));
}
Class.forName
is unnecessary with a type 4 jdbc driver, and calling newInstance doesn't do anything useful.
Also the connection doesn't get closed if an exception is thrown, the connection on the server side will be left to time-out.
This is plumbing code done to demonstrate the DSL class. I wouldn't worry too much about it.
Upvotes: 2
Reputation: 308988
This is bad code. Don't use it.
They don't close resources correctly.
It's impossible to pool connections as written.
I'd pass that Connection into a constructor and initialize a private data member so the run() method would have access to it.
I see no reason to call System.exit(0). More badly thought out stuff.
Upvotes: 3