我还没有尝试你的代码,但是乍一看它似乎可行。
在设计上,我们通常希望将数据库访问与其他逻辑分离。
很可能你还要定义一个名为“Course”的类来保存这些数据并实现你的业务逻辑。例如,你可以选择在“Course”类上实现一个名为“toHtmlTableRow”的方法来生成HTML源代码。(在更复杂或高级的环境中,你可能还需要将该HTML生成功能移动到另一个类中。)类似这样:
class Course {
String id, name, prereq;
public Course ( String id , String name , String prereq ) {
this.id = id;
this.name = name;
this.prereq = prereq;
}
public CharSequence toHtmlTableRow () {
StringBuilder html = new StringBuilder();
html.append( "<tr>\n" );
html.append( "<td>" + this.id + "</td><td>" + this.name + "</td><td>" + this.prereq + "</td>\n" );
html.append( "</tr>\n" );
return html;
}
@Override
public String toString () {
return "Course{ " +
"id='" + id + '\'' +
" | name='" + name + '\'' +
" | prereq='" + prereq + '\'' +
" }";
}
}
这是一个完整的工作示例应用程序。为了演示方便,我将所有内容都塞到了一个单独的
.java
文件中。在实际工作中,我不会这样做。
此示例使用
H2数据库引擎。该示例创建了一个内存数据库,从未写入存储器,因为这只是一个示例。
请注意,在较新版本的Java中使用了
try-with-resource和
AutoCloseable
语法,简化了使用JDBC的工作。
package com.basilbourque.example;
import java.sql.*;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class DbToText {
public static void main ( String[] args ) {
DbToText app = new DbToText();
app.doIt();
}
private void doIt () {
try {
Class.forName( "org.h2.Driver" );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
}
List< Course > courses = new ArrayList();
try (
Connection conn = DriverManager.getConnection( "jdbc:h2:mem:db_to_text" ) ;
Statement stmt = conn.createStatement() ;
) {
String sql = "CREATE TABLE course_ ( \n" +
" id_ VARCHAR NOT NULL PRIMARY KEY , \n" +
" name_ VARCHAR NOT NULL , \n" +
" prereq_ VARCHAR NOT NULL \n" +
");";
stmt.execute( sql );
sql = "INSERT INTO course_ ( id_ , name_ , prereq_ ) VALUES ( ? , ? , ? ) ;";
try (
PreparedStatement preparedStatement = conn.prepareStatement( sql ) ;
) {
preparedStatement.setString( 1 , "C01" );
preparedStatement.setString( 2 , "Course 1" );
preparedStatement.setString( 3 , "None" );
preparedStatement.executeUpdate();
preparedStatement.setString( 1 , "C02" );
preparedStatement.setString( 2 , "Course 2" );
preparedStatement.setString( 3 , "C01" );
preparedStatement.executeUpdate();
preparedStatement.setString( 1 , "C03" );
preparedStatement.setString( 2 , "Course 3" );
preparedStatement.setString( 3 , "C02" );
preparedStatement.executeUpdate();
}
sql = "SELECT * FROM course_";
try ( ResultSet rs = stmt.executeQuery( sql ) ; ) {
while ( rs.next() ) {
String id = rs.getString( "id_" );
String name = rs.getString( "name_" );
String prereq = rs.getString( "prereq_" );
Course c = new Course( id , name , prereq );
courses.add( c );
}
}
} catch ( SQLException e ) {
e.printStackTrace();
}
System.out.println( "List of courses: \n" + courses );
System.out.println( "Courses as HTML table rows: " );
for ( Course course : courses ) {
System.out.println( course.toHtmlTableRow() );
}
}
class Course {
String id, name, prereq;
public Course ( String id , String name , String prereq ) {
this.id = id;
this.name = name;
this.prereq = prereq;
}
public CharSequence toHtmlTableRow () {
StringBuilder html = new StringBuilder();
html.append( "<tr>\n" );
html.append( "<td>" + this.id + "</td><td>" + this.name + "</td><td>" + this.prereq + "</td>\n" );
html.append( "</tr>\n" );
return html;
}
@Override
public String toString () {
return "Course{ " +
"id='" + id + '\'' +
" | name='" + name + '\'' +
" | prereq='" + prereq + '\'' +
" }";
}
}
}
运行时。
List of courses:
[Course{ id='C01' | name='Course 1' | prereq='None' }, Course{ id='C02' | name='Course 2' | prereq='C01' }, Course{ id='C03' | name='Course 3' | prereq='C02' }]
Courses as HTML table rows:
<tr>
<td>C01</td><td>Course 1</td><td>None</td>
</tr>
<tr>
<td>C02</td><td>Course 2</td><td>C01</td>
</tr>
<tr>
<td>C03</td><td>Course 3</td><td>C02</td>
</tr>