JDBC高级特性与应用详解
立即解锁
发布时间: 2025-08-18 00:08:25 阅读量: 4 订阅数: 9 

### JDBC 高级特性与应用详解
#### 1. JDBC 元数据概述
在数据库操作中,除了对数据进行增删改查,还可以获取数据库和结果集的元数据信息。元数据是描述数据库或其部分的数据,与实际存储在数据库中的数据相区分。在 JDBC 中,可以获取两种元数据:关于数据库的元数据和关于结果集的元数据。
##### 1.1 获取数据库元数据
要获取数据库的元数据,需要从数据库连接中请求一个 `DatabaseMetaData` 对象。示例代码如下:
```java
DatabaseMetaData meta = conn.getMetaData();
```
通过 `DatabaseMetaData` 对象,可以获取数据库的各种信息,例如获取数据库中所有表的信息:
```java
ResultSet rs = meta.getTables(null, null, null, new String[] { "TABLE" });
while (rs.next()) {
tableNames.addItem(rs.getString(3));
}
rs.close();
```
上述代码中,`getTables` 方法返回一个结果集,包含数据库中所有表的信息。结果集的每一行包含表的相关信息,我们只关注第三列,即表名。
##### 1.2 获取结果集元数据
当执行查询操作得到一个结果集后,可以通过 `ResultSetMetaData` 类获取结果集的元数据,包括列数、列名、列类型和字段宽度等信息。示例代码如下:
```java
ResultSet rs = stat.executeQuery("SELECT * FROM " + tableName);
ResultSetMetaData meta = rs.getMetaData();
for (int i = 1; i <= meta.getColumnCount(); i++) {
String columnName = meta.getColumnLabel(i);
int columnWidth = meta.getColumnDisplaySize(i);
Label l = new Label(columnName);
TextField tf = new TextField(columnWidth);
// ...
}
```
#### 2. 示例程序:ViewDB.java
为了更好地理解如何使用元数据,下面介绍一个示例程序 `ViewDB.java`,该程序可以浏览数据库中的所有表,并显示表的字段和记录。
##### 2.1 程序步骤概述
- **布局设置**:使用边框布局,将表名组合框放在顶部,表数据放在中心。
- **数据库连接**:连接到数据库,检查是否支持滚动结果集。如果支持,则创建能够产生滚动结果集的 `Statement` 对象;否则,创建默认的 `Statement` 对象。
- **获取表名**:从数据库元数据中获取所有表名,并填充到组合框中。
- **添加按钮**:如果支持滚动结果集,添加“Previous”按钮;始终添加“Next”按钮。
- **显示表数据**:当用户选择一个表时,执行查询操作获取表的所有数据,获取结果集元数据,创建包含标签和文本字段的面板,并显示第一行数据。
- **滚动记录**:点击“Next”按钮显示下一行记录,点击“Previous”按钮显示上一行记录。
##### 2.2 代码实现
```java
import java.net.*;
import java.sql.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
/**
* This program uses metadata to display arbitrary tables in a database.
*/
public class ViewDB {
public static void main(String[] args) {
JFrame frame = new ViewDBFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
/**
* The frame that holds the data panel and the navigation buttons.
*/
class ViewDBFrame extends JFrame {
public ViewDBFrame() {
setTitle("ViewDB");
setSize(WIDTH, HEIGHT);
Container contentPane = getContentPane();
tableNames = new JComboBox();
tableNames.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
showTable((String) tableNames.getSelectedItem());
}
});
contentPane.add(tableNames, BorderLayout.NORTH);
try {
conn = getConnection();
meta = conn.getMetaData();
createStatement();
getTableNames();
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, ex);
}
JPanel buttonPanel = new JPanel();
contentPane.add(buttonPanel, BorderLayout.SOUTH);
if (scrolling) {
previousButton = new JButton("Previous");
previousButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
showPreviousRow();
}
});
buttonPanel.add(previousButton);
}
nextButton = new JButton("Next");
nextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
showNextRow();
}
});
buttonPanel.add(nextButton);
add(new WindowAdapter() {
public void windowClosing(WindowEvent event) {
try {
stat.close();
conn.close();
} catch (SQLException ex) {
while (ex != null) {
ex.printStackTrace();
ex = ex.getNextException();
}
}
}
});
}
/**
* Creates the statement object used for executing queries.
* If the database supports scrolling cursors, the statement is created to yield them.
*/
public void createStatement() throws SQLException {
if (meta.supportsResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE)) {
stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
scrolling = true;
} else {
stat = conn.createStatement();
scrolling = false;
}
}
/**
* Gets all table names of this database and adds them to the combo box.
*/
public void getTableNames() throws SQLException {
ResultSet mrs = meta.getTables(null, null, null, new String[] { "TABLE" });
while (mrs.next()) {
tableNames.addItem(mrs.getString(3));
}
mrs.close();
}
/**
* Prepares the text fields for showing a new table, and shows the first row.
* @param tableName the name of the table to display
*/
public void showTable(String tableName) {
try {
if (rs != null) rs.close();
rs = stat.executeQuery("SELECT * FROM " + tableName);
if (scrollPane != null) {
getContentPane().remove(scrollPane);
}
dataPanel = new DataPanel(rs);
scrollPane = new JScrollPane(dataPanel);
getContentPane().add(scrollPane, BorderLayout.CENTER);
validate();
showNextRow();
```
0
0
复制全文
相关推荐









