package org.fanhongtao.tools.dbviewer;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.DefaultListModel;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
* @author Dharma
* @created 2010-7-4
*/
public class DBViewerFrame extends JFrame
{
private static final long serialVersionUID = -678384677454161045L;
private DBConfig dialog;
/** 显示数据库中表的List */
private JList listTables;
private JTable tablePrimaryKey;
private JTable tableIndex;
private JTable tableColumn;
private Connection connection;
public DBViewerFrame()
{
createMenu(this);
JComponent component = createViewPanel();
this.add(component, BorderLayout.CENTER);
this.setSize(this.getPreferredSize());
}
private void createMenu(JFrame frame)
{
JMenuBar mbar = new JMenuBar();
frame.setJMenuBar(mbar);
JMenu fileMenu = new JMenu("DB");
mbar.add(fileMenu);
JMenuItem connectItem = new JMenuItem("Connect");
connectItem.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
if (null == dialog)
{
dialog = new DBConfig();
}
if (dialog.showDialog(DBViewerFrame.this, "Connect"))
{
connectDB();
}
}
});
fileMenu.add(connectItem);
JMenuItem exitItem = new JMenuItem("Exit");
exitItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
System.exit(0);
}
});
fileMenu.add(exitItem);
}
private JComponent createViewPanel()
{
listTables = new JList();
listTables.setMinimumSize(new Dimension(100, 200));
// listTables.setSize(100, 200);
listTables.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 设置“单选”
listTables.addListSelectionListener(new ListSelectionListener()
{
@Override
public void valueChanged(ListSelectionEvent e)
{
String tableName = (String) listTables.getSelectedValue();
if (null != tableName)
{
try
{
viewTable(tableName);
}
catch (SQLException e1)
{
e1.printStackTrace();
}
}
}
});
JScrollPane scrollPane = new JScrollPane(listTables);
JTabbedPane tabbedPane = new JTabbedPane();
tablePrimaryKey = new JTable(new PrimaryKeyTableModel(null));
JScrollPane pane = new JScrollPane(tablePrimaryKey);
tabbedPane.addTab("Primary Key", pane);
// 创建时指定表头及数据。不方便,修改成使用 TableModel 的方式
// String[] columnNames = { "Index", "Column" };
// Object[][] cells = { { "", "" } };
// tableIndex = new JTable(cells, columnNames);
tableIndex = new JTable(new IndexTableModel(null));
pane = new JScrollPane(tableIndex);
tabbedPane.addTab("Index", pane);
tableColumn = new JTable(new ColumnTableModel(null));
pane = new JScrollPane(tableColumn);
tabbedPane.addTab("Column", pane);
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scrollPane, tabbedPane);
splitPane.setContinuousLayout(true);
splitPane.setOneTouchExpandable(true);
return splitPane;
}
/**
* 连接数据库,并更新左边的“表”列表。
*/
private void connectDB()
{
String url = dialog.getURL();
String username = dialog.getUser();
String password = dialog.getPassword();
// System.setProperty("jdbc.drivers", dialog.getDrivers());
try
{
Class.forName(dialog.getDrivers());
if (null != connection)
{
connection.close();
connection = null;
}
connection = DriverManager.getConnection(url, username, password);
listTables.removeAll();
DatabaseMetaData meta = connection.getMetaData();
ResultSet mrs = meta.getTables(null, null, null, new String[] { "TABLE" });
DefaultListModel model = new DefaultListModel();
// ListModel model = listTables.getModel();
while (mrs.next())
{
model.addElement(mrs.getString(3));
}
mrs.close();
listTables.setModel(model);
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 查看指定表的表结构
* @param tableName 表名
* @throws SQLException
*/
private void viewTable(String tableName) throws SQLException
{
// 设置表的“主键”信息
DatabaseMetaData dbMeta = connection.getMetaData();
ResultSet rs = dbMeta.getPrimaryKeys(null, null, tableName);
// tablePrimaryKey.removeAll();
// TableModel model = tablePrimaryKey.getModel();
tablePrimaryKey.setModel(new PrimaryKeyTableModel(rs));
rs.close();
/*
* System.err.println("TABLE_CAT : "+pkRSet.getObject(1));
System.err.println("TABLE_SCHEM: "+pkRSet.getObject(2));
System.err.println("TABLE_NAME : "+pkRSet.getObject(3));
System.err.println("COLUMN_NAME: "+pkRSet.getObject(4));
System.err.println("KEY_SEQ : "+pkRSet.getObject(5));
System.err.println("PK_NAME : "+pkRSet.getObject(6));
*/
// 设置表的“索引”信息
rs = dbMeta.getIndexInfo(null, null, tableName, false, false);
tableIndex.setModel(new IndexTableModel(rs));
rs.close();
// 设置表的“字段”信息
// ResultSet rs = dbMeta.getColumns(null, null, tableName, null);
Statement statement = connection.createStatement();
ResultSet resultset = statement.executeQuery("select * from " + tableName + " where 1!=1");
tableColumn.setModel(new ColumnTableModel(resultset));
resultset.close();
}
}