您的位置:首页 > 编程语言 > Java开发

在Java中实现.net中DataTable功能以及操作双数据库的List连接问题解决方案探究

2011-07-15 15:18 1131 查看
前两天实现了net中DataTable功能,虽说功能不是很强大,但是完全满足了java中的多表查询,带来的编程风格改变还是存在的。

现在拿出来说下,和各位大哥探讨下。

因为我本来就是搞net的,突然来了两个项目就是要用java以及oracle,便从各种方向上寻求net的影子,便有了今天这些工具类。

不知道好不好,bug测试了一下了,性能上也只有经过项目来验证吧!!!

其中一部分涉及到双数据库操作,所以也提了一种解决方案,写的不好,大家看看吧!

我们先看效果,再说说怎么弄!

我们来试试如何用,我也写了一个测试数据





然后我们在Junit中测试

@Test
public void joinTable() {

JingZongDB jzdb=new JingZongDB();
DataTable dt1=jzdb.getDataTable("select * from newsType");
DataTable dt2=jzdb.getDataTable("select * from news");
DataTable dt=DataTable.joinTable(dt1, dt2, "id", "typeid");

wl("新闻类型表:"+dt1.getRow().size());
DataTable.outTable(dt1);
wl("新闻表:"+dt2.getRow().size());
DataTable.outTable(dt2);
wl("合并后:"+dt.getRow().size());
DataTable.outTable(dt);
}

private void wl(String s) {
System.out.println(s);
}


最后结果为

新闻类型表:4
id:1  typeName:学生工作
id:2  typeName:通知公告
id:3  typeName:招生简章
id:4  typeName:教务信息
新闻表:16
id:1  typeid:1  newsName:学生工作1
id:2  typeid:1  newsName:学生工作2
id:3  typeid:1  newsName:学生工作3
id:4  typeid:1  newsName:学生工作4
id:5  typeid:2  newsName:通知公告1
id:6  typeid:2  newsName:通知公告2
id:7  typeid:2  newsName:通知公告3
id:8  typeid:2  newsName:通知公告4
id:9  typeid:3  newsName:招生简章1
id:10  typeid:3  newsName:招生简章2
id:11  typeid:3  newsName:招生简章3
id:12  typeid:3  newsName:招生简章4
id:13  typeid:4  newsName:教务信息1
id:14  typeid:4  newsName:教务信息2
id:15  typeid:4  newsName:教务信息3
id:16  typeid:4  newsName:教务信息4
合并后:16
id:1  typeName:学生工作  id:1  typeid:1  newsName:学生工作1
id:1  typeName:学生工作  id:2  typeid:1  newsName:学生工作2
id:1  typeName:学生工作  id:3  typeid:1  newsName:学生工作3
id:1  typeName:学生工作  id:4  typeid:1  newsName:学生工作4
id:2  typeName:通知公告  id:5  typeid:2  newsName:通知公告1
id:2  typeName:通知公告  id:6  typeid:2  newsName:通知公告2
id:2  typeName:通知公告  id:7  typeid:2  newsName:通知公告3
id:2  typeName:通知公告  id:8  typeid:2  newsName:通知公告4
id:3  typeName:招生简章  id:9  typeid:3  newsName:招生简章1
id:3  typeName:招生简章  id:10  typeid:3  newsName:招生简章2
id:3  typeName:招生简章  id:11  typeid:3  newsName:招生简章3
id:3  typeName:招生简章  id:12  typeid:3  newsName:招生简章4
id:4  typeName:教务信息  id:13  typeid:4  newsName:教务信息1
id:4  typeName:教务信息  id:14  typeid:4  newsName:教务信息2
id:4  typeName:教务信息  id:15  typeid:4  newsName:教务信息3
id:4  typeName:教务信息  id:16  typeid:4  newsName:教务信息4


现在说如何实现

1 实现,net数据库参数化

package cdu.yas.xykps.util;

import java.sql.Blob;
import java.sql.Date;

/**
* @功能描述  sql参数,sql执行时传递的参数用此类封装
* @可能的错误
* @作者 叶小钗
* @修改说明
* @修改人
*/
public class SqlParameter {

public SqlParameter(String type, String value) {
this.type = type;
this.value = value;
}

public SqlParameter(String type, int intValue) {
this.type = type;
this.intValue = intValue;
}

public SqlParameter(String type, boolean boolValue) {
this.type = type;
this.boolValue = boolValue;
}

public SqlParameter(String type, Date dateValue) {
this.type = type;
this.dateValue = dateValue;
}

public SqlParameter(String type, Blob blobValue) {
this.type = type;
this.blobValue = blobValue;
}

String type;
String value;
int intValue;
boolean boolValue;
Date dateValue;
Blob blobValue;
public String getType() {
return type;
}

public String getValue() {
return value;
}

public int getIntValue() {
return intValue;
}

public boolean getBoolValue() {
return boolValue;
}

public Date getDateValue() {
return dateValue;
}

public Blob getBlobValue() {
return blobValue;
}

public void setType(String type) {
this.type = type;
}

public void setValue(String value) {
this.value = value;
}

public void setIntValue(int intValue) {
this.intValue = intValue;
}

public void setBoolValue(boolean boolValue) {
this.boolValue = boolValue;
}

public void setDateValue(Date dateValue) {
this.dateValue = dateValue;
}

public void setBlobValue(Blob blobValue) {
this.blobValue = blobValue;
}

}


2 后台参数执行

/**
* @功能描述 执行一条select语句返回一张数据表,支持多表查询
* @可能的错误
* @作者 叶小钗
* @修改说明
* @修改人
*/
public DataTable getDataTable(String sql, SqlParameter[] p) {
Connection conn = DB.createConn();
PreparedStatement ps = DB.prepare(conn, sql);
DataTable t = null;
try {
addSqlParameter(ps, p);
ResultSet rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();

List<DataRow> row = new ArrayList<DataRow>();// 表所有行集合
List<DataColumn> col = null;// 行所有列集合
DataRow r = null; // 单独一行
DataColumn c = null;// 单独一列
// 此处开始循环读数据,每次往表格中插入一行记录
while (rs.next()) {
// 初始化行集合,

// 初始化列集合
col = new ArrayList<DataColumn>();
// 此处开始列循环,每次向一行对象插入一列
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
String columnName = rsmd.getColumnName(i);
Object value = rs.getObject(columnName);
// 初始化单元列
c = new DataColumn(columnName, value);
// 将列信息加入列集合
col.add(c);
}
// 初始化单元行
r = new DataRow(col);
// 将行信息降入行结合
row.add(r);
}
// 得到数据表
t = new DataTable(row);
rs.close();
rs = null;
} catch (SQLException e) {
e.printStackTrace();
} finally {

DB.close(ps);
DB.close(conn);
}
return t;
}


3 增加参数的方法:

/**
* @功能描述 增加参数方法
* @可能的错误 需要测试全局数据共享问题,以及可能会扩展参数类型
* @作者 叶小钗
* @修改说明
* @修改人
*/
private void addSqlParameter(PreparedStatement ps, SqlParameter[] p)
throws SQLException {
for (int j = 0; j < p.length; j++) {
// wl(p[j].getValue() + "--" + p[j].getType() + "--" + j);
if (p[j].getType().equals("int")) {
ps.setInt(j + 1, p[j].getIntValue());
}
if (p[j].type.equals("String")) {
ps.setString(j + 1, p[j].getValue());
}
if (p[j].type.equals("boolean")) {
ps.setBoolean(j + 1, p[j].getBoolValue());
}
if (p[j].type.equals("Date")) {
ps.setDate(j + 1, p[j].getDateValue());
}
if (p[j].type.equals("Blob")) {
ps.setBlob(j + 1, p[j].getBlobValue());
}
}
}


4 看看我们如何调用方法

public DataTable getByParentId(int pId) {
String sql = "select * from kpxz where fbh=? order by kpxzsx asc";
SqlParameter[] p = new SqlParameter[1];
p[0] = new SqlParameter("int", pId);
return db.getDataTable(sql, p);
}


上面就是调用函数的具体方法,现在我们来详细说下DataTable,具体实现如下

package cdu.yas.xykps.util;

import java.util.ArrayList;
import java.util.List;

/**
* @功能描述 数据表,即是表格集合,为List类型,其中List中每一个对象是一个DataRow类(List)
* @可能的错误
* @作者 叶小钗
* @修改说明
* @修改人
*/
public class DataTable {

List<DataRow> row;

public DataTable() {

}

public DataTable(List<DataRow> r) {
row = r;
}

public List<DataRow> getRow() {
return row;
}

public void setRow(List<DataRow> row) {
this.row = row;
}

/**
* @功能描述 双表根据两表关联字段连接,要求两表必须包含公告字段,并且每一行数据公共字段相等 。dt1对应colname1 ,dt2
*       对应colName2
* @可能的错误 未完成
* @作者 叶小钗
* @修改说明
* @修改人
*/
public static DataTable joinTable(DataTable dt1, DataTable dt2, String colName1,
String colName2) {
List<DataRow> newRows = new ArrayList<DataRow>();

List<DataRow> rows1 = dt1.getRow();
List<DataRow> rows2 = dt2.getRow();

int i1 = rows1.size();
int i2 = rows2.size();

List<DataRow> temp = new ArrayList<DataRow>();
String tempC = "";
if (i1 > i2) {
temp = rows1;
rows1 = rows2;
rows2 = temp;
tempC = colName1;
colName1 = colName2;
colName2 = tempC;
}
for (DataRow r1 : rows1) {
String value1 = r1.eval(colName1);
for (DataRow r2 : rows2) {
String value2 = r2.eval(colName2);
if (value1.equals(value2)) {
List<DataColumn> cols = new ArrayList<DataColumn>();
for (DataColumn c : r1.getCol()) {
cols.add(c);
}
for (DataColumn c : r2.getCol()) {
cols.add(c);
}
DataRow rr = new DataRow(cols);
newRows.add(rr);
}
}
}
DataTable dt = new DataTable(newRows);
return dt;
}

public static void outTable(DataTable dt) {
for (DataRow r : dt.getRow()) {
for (DataColumn c : r.getCol()) {
System.out.print(c.getKey() + ":" + c.getValue() + "  ");
}
wl("");
}
}

public static void wl(String s) {
System.out.println(s);
}

}


对应DataRow

package cdu.yas.xykps.util;

import java.sql.Blob;
import java.sql.Date;
import java.util.List;

/**
* @功能描述 数据行,即是表格中的每一行数据的集合,为List类型,其中List中每一个对象是一个DataColumn类(键值对)
* @可能的错误 当需要取得行数据中某一列时,若是类型转换不匹配会出错(例:1 若是数据项为字符串,我们取时候想取整形;);
* @作者 叶小钗
* @修改说明 由于取为空字符串时候会报类型转换的错误,便使用了异常处理
* @修改人 叶小钗
*/
public class DataRow {

List<DataColumn> col;

/**
* @功能描述 返回指定DataColumn类型数据列对象
* @作者 叶小钗
*/
public DataColumn getColumnObject(String colName) {
for (DataColumn c : col) {
if (c.getKey().toUpperCase().equals(colName.toUpperCase())) {
try {
return c;
} catch (Exception e) {
System.out.println("错误描述:" + e.toString());
}
}
}
return null;
}

/**
* @功能描述 返回指定Object类型数据列对象
* @作者 叶小钗
*/
public Object getColumn(String colName) {
for (DataColumn c : col) {
if (c.getKey().toUpperCase().equals(colName.toUpperCase())) {
try {
return c.getValue();
} catch (Exception e) {
System.out.println("错误描述:" + e.toString());
}
}
}
return null;
}

/**
* @功能描述 返回指定int类型数据列对象
* @作者 叶小钗
*/
public int getIntColumn(String colName) {
for (DataColumn c : col) {
if (c.getKey().toUpperCase().equals(colName.toUpperCase())) {
try {
return Integer.parseInt(c.getValue().toString());
} catch (Exception e) {
System.out.println("错误描述:" + e.toString());
}
}
}
return 0;
}

/**
* @功能描述 返回指定String类型数据列对象
* @作者 叶小钗
*/
public String getStringColumn(String colName) {
for (DataColumn c : col) {
if (c.getKey().toUpperCase().equals(colName.toUpperCase())) {
try {
return c.getValue().toString();
} catch (Exception e) {
System.out.println("错误描述:" + e.toString());
}

}
}
return null;
}

/**
* @功能描述 返回指定String类型数据列对象
* @作者 叶小钗
*/
public String eval(String colName) {
for (DataColumn c : col) {
if (c.getKey().toUpperCase().equals(colName.toUpperCase())) {
try {
return c.getValue() + "";// 此方法将屏蔽错误!!!
} catch (Exception e) {
System.out.println("错误描述:" + e.toString());
}
}
}
return null;
}

/**
* @功能描述 返回指定Date类型数据列对象
* @作者 叶小钗
*/
public Date getDateColumn(String colName) {
for (DataColumn c : col) {
if (c.getKey().toUpperCase().equals(colName.toUpperCase())) {
try {
return Date.valueOf(c.getValue().toString());
} catch (Exception e) {
System.out.println("错误描述:" + e.toString());
}
}
}
return null;
}

/**
* @功能描述 返回指定Blob类型数据列对象
* @作者 叶小钗
*/
public Blob getBlobColumn(String colName) {
for (DataColumn c : col) {
if (c.getKey().toUpperCase().equals(colName.toUpperCase())) {
try {
return (Blob) c.getValue();
} catch (Exception e) {
System.out.println("错误描述:" + e.toString());
}
}
}
return null;
}

/**
* @功能描述 返回指定Blob类型数据列对象
* @作者 叶小钗
*/
public float getFloatColumn(String colName) {
for (DataColumn c : col) {
if (c.getKey().toUpperCase().equals(colName.toUpperCase())) {
try {
return Float.parseFloat(c.getValue().toString());
} catch (Exception e) {
System.out.println("错误描述:" + e.toString());
}
}
}
return 0;
}

public DataRow(List<DataColumn> c) {
col = c;
}

public List<DataColumn> getCol() {
return col;
}

public void setCol(List<DataColumn> col) {
this.col = col;
}

}


然后数据列

package cdu.yas.xykps.util;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
* @功能描述 数据列,也是最简单的数据项,相当于表格中的一个单元项目。
* 采用健值对思想,key为列名,value对应key值的单元格元素,为Object类型
* @可能的错误
* @作者 叶小钗
* @修改说明
* @修改人
*/
public class DataColumn {

String key;
Object value;

public DataColumn(String k, Object v) {
key = k;
value = v;
}

public String getKey() {
return key;
}

public Object getValue() {
return value;
}

public void setKey(String key) {
this.key = key;
}

public void setValue(Object value) {
this.value = value;
}

}


如此一来便实现了java中的DataTable了。

好了暂时这个样子了,我还封装了一个分页控件,也有点类似于net里面的分页控件,等下次大家一起看看吧

希望各位大哥多指正!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐