我对下面的课程有几个问题。
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
而不是属于类实例的任何其他方法? 为什么字符串参数final
在这里?
public static void main(final String[] args) throws SQLException {
new Test().run();
}
关闭连接后,我们为什么要拨打System.exit()
?
conn.close();
System.exit(0);
答案 0 :(得分:3)
这是错误的代码。不要使用它。
他们没有正确关闭资源。
无法按照书面形式汇集联系。
我将该Connection传递给构造函数并初始化私有数据成员,以便run()方法可以访问它。
我认为没有理由调用System.exit(0)。更糟糕的想法。
答案 1 :(得分:2)
它不是在新线程中创建的。为了在新线程中调用它,Test必须实现Runnable(或扩展Thread)。假设Test实现了Runnable,那么会有像new Thread(new Test()).start();
这样的行。
有一种约定,即方法的参数不应该被修改。使用final可以防止这种情况,但这里没有必要,因为JVM在调用main之后不会对args做任何事情。另请注意,使数组最终不能使其内容不可修改。
这里不需要调用System.exit。无论如何,代码都已完成执行,一旦没有更多的代码运行,JVM将终止。 System.exit突然杀死了JVM。
这不是很棒的代码。让getConnection捕获异常并返回null是坏样式(因为程序的其余部分不知道连接是null并且将尝试访问它,导致NullPointerException),它可以更改为:
private Connection getConnection() throws SQLException {
return DriverManager.getConnection(System.getProperty("jdbc.url"),
System.getProperty("jdbc.user"),
System.getProperty("jdbc.password"));
}
类型4 jdbc驱动程序不需要 Class.forName
,并且调用newInstance不会做任何有用的事情。
如果抛出异常,连接也不会关闭,服务器端的连接将暂停。
这是用于演示DSL类的管道代码。我不会太担心它。