之前花两个星期写了一个简易的数据库工具,还有好多功能没有做,这是界面部分,左上角的下拉框来选择数据库,目前支持的数据库是mysql,oracle,sqlserver,树上显示的是之前保存的数据库连接,点击后,会弹出请输入密码的输入框,输入密码后,就可以打开树,然后点击数据库,打开相应的数据库,点击先关的表,就可以查看表数据,表数据可以用excel导出。点击查询查询后,就可以打开查询面板,在查询面板中就可以输入要执行的sql语句。界面部分用flex完成,因为flex实现快,且不用考虑浏览器兼容性。展开后的面板如下所示。
java部分代码结构很简单就12个类,界面也很简单。使用java+flex的模式开发应用非常适合像我这样的菜鸟。
其中的关键在于对连接的控制和数据库数据的获取。我分别将其操作放入到两个类中。
数据库数据的获取代码如下,因为安全因素,没哟添加修改表数据和字段功能,大家可以单个小练习看看
package itims.typNew.tool.dbtool.operator;
import itims.typNew.tool.dbtool.service.DbDataAction;
import itims.typNew.tool.dbtool.util.SqlGenerator;
import itims.typNew.tool.dbtool.bean.ColumnsInfo;
import itims.typNew.tool.dbtool.util.UtilTool;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
*
* @author chenshanqun
*连接上数据库以后,对数据库的所有操作方法
*/
public class DataControl {
private Log logger = LogFactory.getLog(DataControl.class);
private Connection conn;
private String dbType = null;
public DataControl(Connection conn) {
this.conn = conn;
}
public void setConnection(Connection conn) {
this.conn = conn;
}
public Connection getConnection() {
return this.conn;
}
/**
* 获取数据库名称
* @return
*/
public String getDatabaseName() {
try {
String name = conn.getMetaData().getDatabaseProductName();
name = name.replaceAll("/", "-");
return name;
} catch (SQLException e) {
// System.out.println("meta.getDatabaseProductName.ERROR" +
// e.getMessage());
return "--ERROR--";
}
}
/**
* 获取所有的数据库列表 (有的数据库不能根据连接获取到和他同级的其他数据库,如oracle)
* @return
*/
public List<String> getCatalogs() {
List<String> list = new ArrayList<String>();
try {
ResultSet rs;
rs = conn.getMetaData().getCatalogs();
while (rs.next()) {
// System.out.println("getcatalogs+++++++++++++++++++++++++++++++++++++++++++++");
String schema = rs.getString("TABLE_CAT");
list.add(schema);
}
rs.close();
} catch (SQLException e) {
// System.out.println("meta.getSchemas" + e.getMessage());
}
return list;
}
/**
* 获取所有的表空间
* @return
*/
public List<String> getSchemas() {
List<String> list = new ArrayList<String>();
try {
ResultSet rs = conn.getMetaData().getSchemas();
while (rs.next()) {
// System.out.println("get tableschem++++++++++++++++++++++++++++++++++++++++++++++++");
String schema = rs.getString("TABLE_SCHEM");
list.add(schema);
}
rs.close();
} catch (SQLException e) {
// System.out.println("meta.getSchemas" + e.getMessage());
}
return list;
}
/**
* 获取所有表的类型(如视图,表等)
* @return
*/
public List<String> getElementTypes() {
List<String> list = new ArrayList<String>();
try {
ResultSet rs = conn.getMetaData().getTableTypes();
while (rs.next()) {
String type = rs.getString("TABLE_TYPE");
list.add(type);
}
rs.close();
} catch (SQLException e) {
// System.out.println("meta.getTableTypes" + e.getMessage());
}
return list;
}
/**
*
* @param schema 表空间或者数据库名(因为有的数据库没有表空间,如mysql)
* @param types 表的类型列表
* @param mode 数据库结构的类型,0有表空间,1没有表空间,有数据库名
* @return 获取所有的数据表(表名列表)
*/
public List<String> getElements(String schema, List types, int mode) {
// mode 0 means by schema;
// mode 1 means by catalog;
String[] newTypes;
List<String> list = new ArrayList<String>();
if (types.size() == 0) {
newTypes = new String[] { "table" };
}
try {
ResultSet rs = null;
newTypes = UtilTool.changeListToStrings(types);
System.out.println(newTypes[0]);
if (mode == 0) {
rs = conn.getMetaData().getTables(null, schema, null, newTypes);
} else {
rs = conn.getMetaData().getTables(schema, null, null, newTypes);
}
while (rs.next()) {
String name = rs.getString("TABLE_NAME");
if (name.indexOf('/') > -1 || name.indexOf('$') > -1) {
continue;
}
list.add(name);
}
rs.close();
} catch (SQLException e) {
// System.out.println("meta.getTableNames" + e.getMessage());
}
return list;
}
/**
*
* @param tableName
* @return 获取一个数据表,所有的字段列表(列表里面的为字段对象)
*/
public List getColumns(String tableName) {
ResultSet resultSet = null;
List<ColumnsInfo> columnsInfoList = new ArrayList<ColumnsInfo>();
try {
resultSet = conn.getMetaData().getColumns(null, null, tableName,
null);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (resultSet != null) {
try {
while (resultSet.next()) {
// 获得字段名称
String name = resultSet.getString("COLUMN_NAME");
// 获得字段类型名称
String type = resultSet.getString("TYPE_NAME");
// 获得字段大小
int size = resultSet.getInt("COLUMN_SIZE");
// 获得字段备注
String remark = resultSet.getString("REMARKS");
ColumnsInfo info = new ColumnsInfo();
info.setImportedKey(false);
info.setParmaryKey(false);
info.setName(name);
info.setSize(size);
info.setType(type);
info.setRemark(remark);
columnsInfoList.add(info);
}
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return columnsInfoList;
}
/**
* 根据一个数据集,获取这个数据集所有的字段列表
* @param rs
* @return
*/
public List getColumns(ResultSet rs) {
int columnsCount = 0;
java.sql.ResultSetMetaData rsm = null;
try {
rsm = rs.getMetaData();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
List<ColumnsInfo> columnsInfoList = new ArrayList<ColumnsInfo>();
try {
columnsCount = rs.getMetaData().getColumnCount();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < columnsCount; i++) {
// 获得字段名称
ColumnsInfo info = new ColumnsInfo();
String name = null;
try {
System.out.println("dsfafed " + i + 1);
info.set