- 浏览: 29717 次
- 性别:
- 来自: 成都
-
文章分类
最新评论
-
549265480:
http://www.cnblogs.com/yexiaoch ...
在Java中实现.net中DataTable功能以及操作双数据库的LIst连接问题解决方案探究
在Java中实现.net中DataTable功能以及操作双数据库的LIst连接问题解决方案探究
前两天实现了net中DataTable功能,虽说功能不是很强大,但是完全满足了java中的多表查询,带来的编程风格改变还是存在的。
现在拿出来说下,和各位大哥探讨下。
因为我本来就是搞net的,突然来了两个项目就是要用java以及oracle,便从各种方向上寻求net的影子,便有了今天这些工具类。
不知道好不好,bug测试了一下了,性能上也只有经过项目来验证吧!!!
其中一部分涉及到双数据库操作,所以也提了一种解决方案,写的不好,大家看看吧!
1 实现,net数据库参数化
01 |
package cdu.yas.xykps.util;
|
02 |
|
03 |
import java.sql.Blob;
|
04 |
import java.sql.Date;
|
05 |
|
06 |
/** |
07 |
* @功能描述 sql参数,sql执行时传递的参数用此类封装
|
08 |
* @可能的错误
|
09 |
* @作者 王磊
|
10 |
* @修改说明
|
11 |
* @修改人
|
12 |
*/
|
13 |
public class SqlParameter {
|
14 |
|
15 |
public SqlParameter(String type, String value) {
|
16 |
this .type = type;
|
17 |
this .value = value;
|
18 |
}
|
19 |
|
20 |
public SqlParameter(String type, int intValue) {
|
21 |
this .type = type;
|
22 |
this .intValue = intValue;
|
23 |
}
|
24 |
|
25 |
public SqlParameter(String type, boolean boolValue) {
|
26 |
this .type = type;
|
27 |
this .boolValue = boolValue;
|
28 |
}
|
29 |
|
30 |
public SqlParameter(String type, Date dateValue) {
|
31 |
this .type = type;
|
32 |
this .dateValue = dateValue;
|
33 |
}
|
34 |
|
35 |
public SqlParameter(String type, Blob blobValue) {
|
36 |
this .type = type;
|
37 |
this .blobValue = blobValue;
|
38 |
}
|
39 |
|
40 |
String type;
|
41 |
String value;
|
42 |
int intValue;
|
43 |
boolean boolValue;
|
44 |
Date dateValue;
|
45 |
Blob blobValue;
|
46 |
public String getType() {
|
47 |
return type;
|
48 |
}
|
49 |
|
50 |
public String getValue() {
|
51 |
return value;
|
52 |
}
|
53 |
|
54 |
public int getIntValue() {
|
55 |
return intValue;
|
56 |
}
|
57 |
|
58 |
public boolean getBoolValue() {
|
59 |
return boolValue;
|
60 |
}
|
61 |
|
62 |
public Date getDateValue() {
|
63 |
return dateValue;
|
64 |
}
|
65 |
|
66 |
public Blob getBlobValue() {
|
67 |
return blobValue;
|
68 |
}
|
69 |
|
70 |
public void setType(String type) {
|
71 |
this .type = type;
|
72 |
}
|
73 |
|
74 |
public void setValue(String value) {
|
75 |
this .value = value;
|
76 |
}
|
77 |
|
78 |
public void setIntValue( int intValue) {
|
79 |
this .intValue = intValue;
|
80 |
}
|
81 |
|
82 |
public void setBoolValue( boolean boolValue) {
|
83 |
this .boolValue = boolValue;
|
84 |
}
|
85 |
|
86 |
public void setDateValue(Date dateValue) {
|
87 |
this .dateValue = dateValue;
|
88 |
}
|
89 |
|
90 |
public void setBlobValue(Blob blobValue) {
|
91 |
this .blobValue = blobValue;
|
92 |
}
|
93 |
|
94 |
} |
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了。
我们来试试如何用,我也写了一个测试数据
然后我们在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
|
好了暂时这个样子了,我还封装了一个分页控件,也有点类似于net里面的分页控件,等下次大家一起看看吧
希望各位大哥多指正!!!!!
http://www.cnblogs.com/yexiaochai/archive/2011/07/15/2107468.html
<script type="text/javascript"></script>
评论
1 楼
549265480
2011-07-15
http://www.cnblogs.com/yexiaochai/archive/2011/07/15/2107468.html
这是博客园链接,因为不是主攻java,就写在那上面的。
请各位java大哥指正下
这是博客园链接,因为不是主攻java,就写在那上面的。
请各位java大哥指正下
相关推荐
然而,标题提到的是"Java实现ADO.NET DataTable",这意味着我们将讨论如何在Java环境中模拟或实现类似ADO.NET中的DataTable功能。DataTable在ADO.NET中是一个非常重要的数据结构,它可以在内存中存储和操作数据,而...
与常见的访问数据库操作不一样,该操作选择用DataTable/DataSet作为缓冲,用户操作数据库实际上并未在后台数据库直接修改,而是在DataTable/DataSet上进行;真正修改后台数据库的操作可由程序员进行设定,成批量的...
在Java开发中,特别是在Android应用开发中,常常需要处理数据集合,C#中的DataTable是一种非常方便的数据结构,它允许我们动态地存储和操作表格数据。然而,Java原生API并没有提供与之对应的类。这篇博客(博文链接...
在VB.NET中建立数据库连接是开发数据库驱动应用程序的基础步骤。Visual Basic .NET (VB.NET) 提供了多种方法来连接到各种类型的数据库,包括SQL Server、MySQL、Oracle等。本实例将详细介绍如何在VB.NET环境下创建...
通过上述总结,我们可以看出VB.NET中`DataTable`提供了非常丰富的API来支持对数据表的各种操作,包括但不限于数据的增删改查以及更复杂的处理逻辑。这使得在开发过程中能够更加灵活高效地管理和操作数据。
ADO.NET中的DataTable是一种非常重要的数据处理组件,它在.NET框架中扮演着数据存储和操作的角色。DataTable不直接与数据库交互,而是作为DataSet的一部分,用于在内存中存储数据,类似于一个临时的、离线的数据表。...
非常方便的datatable类型与List泛型实体对象集合的互相转换,在面向对象的开发中,经常会用到的,如使用上不懂可以咨询我
在本文中,我们将深入探讨如何使用ASP.NET进行简单的数据库连接操作。ASP.NET是Microsoft开发的一个强大的Web应用程序框架,它允许开发者使用C#等语言构建动态、数据驱动的网站。在这个实例中,我们将使用Visual ...
在提供的`TestDataTableToExcel`项目中,`TestDataTableToExcel.sln`是解决方案文件,`TestDataTableToExcel.suo`是用户特定的解决方案选项文件,而`TestDataTableToExcel`可能是源代码文件夹,包含具体的C#代码实现...
本文将深入探讨如何使用ADO.NET技术在.NET中操作SQL Server数据库,并通过13个实例源代码来加深理解。 首先,我们需要了解ADO.NET的基本组件。这包括DataSet、DataTable、DataRow、DataAdapter以及Connection、...
本文将详细介绍如何使用VB.NET实现这一功能,以及涉及的关键知识点。 首先,我们需要了解SQL数据库中如何存储图像。由于图片是二进制数据,所以通常会存储在BLOB类型的字段中,如SQL Server中的`VARBINARY(MAX)`或`...
.NET 数据库操作类库是一种用于简化数据库交互的软件组件,主要目标是为开发者提供一个统一的接口,以便在多种数据库管理系统(如MySQL、SQL Server、Oracle等)中进行数据操作。这种类库通常包含了诸如连接数据库、...
在.NET框架中,将Excel数据导入到数据库是一个常见的任务,特别是在处理大量数据或者用户需要从Excel文件批量导入信息时。以下是一种实现此功能的方法,基于描述中的思路: 首先,我们需要在前端提供一个文件上传...
在网页中通过后台代码实现数据从 Excel 中批量导入到数据库中。通过上网查询参考,总结如下: ExcelToMSSql 类 该类是实现批量导入数据的核心,主要包含两个静态方法:DataTranf 和 ExcelToDataTable。 DataTranf ...
在.NET中,可以使用ADO.NET的DataSet、DataTable等组件来操作数据,或者使用Entity Framework这样的ORM(对象关系映射)工具简化数据访问。DataSet是一个内存中的数据缓存,它可以容纳多个DataTable,提供了灵活的...
通过本篇教程,我们详细介绍了如何在ASP.NET开发环境中使用编码方式创建和操作`DataTable`。包括如何通过构造函数创建`DataTable`,如何通过`DataAdapter`填充数据,以及如何定义表结构和添加列。掌握这些基础知识...
ADO.NET是Microsoft提供的一个数据访问框架,它包括DataSet、DataTable、DataRow等对象,以及用于连接数据库的SqlConnection、OleDbConnection等连接类。 1. **创建数据库连接** 在VB .NET中,我们可以使用`...
将datatable转换为实体类LIST,运用了反射和泛型的技术
在.NET框架中,C#是一种常用的编程语言,用于构建各种应用程序,包括与数据库交互的应用程序。本实例将深入探讨如何使用C#连接到数据库,主要关注`.NET`框架下的数据库连接技术。 首先,我们需要理解ADO.NET(即...