`
549265480
  • 浏览: 29726 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类

在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 实现 ADO.NET DataTable

    然而,标题提到的是"Java实现ADO.NET DataTable",这意味着我们将讨论如何在Java环境中模拟或实现类似ADO.NET中的DataTable功能。DataTable在ADO.NET中是一个非常重要的数据结构,它可以在内存中存储和操作数据,而...

    ASP.NET以更新DataTable/DataSet方式访问数据库

    与常见的访问数据库操作不一样,该操作选择用DataTable/DataSet作为缓冲,用户操作数据库实际上并未在后台数据库直接修改,而是在DataTable/DataSet上进行;真正修改后台数据库的操作可由程序员进行设定,成批量的...

    JAVA实现类似C#的DataTable数据结构_适用于安卓

    在Java开发中,特别是在Android应用开发中,常常需要处理数据集合,C#中的DataTable是一种非常方便的数据结构,它允许我们动态地存储和操作表格数据。然而,Java原生API并没有提供与之对应的类。这篇博客(博文链接...

    实例71. 如何在VB.NET建立数据库连接_vs.NET_VB.net_数据开发_数据库_vb数据库_

    在VB.NET中建立数据库连接是开发数据库驱动应用程序的基础步骤。Visual Basic .NET (VB.NET) 提供了多种方法来连接到各种类型的数据库,包括SQL Server、MySQL、Oracle等。本实例将详细介绍如何在VB.NET环境下创建...

    VB.NET的DataTable常用方法总结

    通过上述总结,我们可以看出VB.NET中`DataTable`提供了非常丰富的API来支持对数据表的各种操作,包括但不限于数据的增删改查以及更复杂的处理逻辑。这使得在开发过程中能够更加灵活高效地管理和操作数据。

    ado.net中的datatable代码

    ADO.NET中的DataTable是一种非常重要的数据处理组件,它在.NET框架中扮演着数据存储和操作的角色。DataTable不直接与数据库交互,而是作为DataSet的一部分,用于在内存中存储数据,类似于一个临时的、离线的数据表。...

    .net 中datatable与list泛型实体对象的互相转换

    非常方便的datatable类型与List泛型实体对象集合的互相转换,在面向对象的开发中,经常会用到的,如使用上不懂可以咨询我

    ASP.NET简单连接操作数据库实例

    在本文中,我们将深入探讨如何使用ASP.NET进行简单的数据库连接操作。ASP.NET是Microsoft开发的一个强大的Web应用程序框架,它允许开发者使用C#等语言构建动态、数据驱动的网站。在这个实例中,我们将使用Visual ...

    ASP.NET 页面中 DataTable 导出EXCEL的例子

    在提供的`TestDataTableToExcel`项目中,`TestDataTableToExcel.sln`是解决方案文件,`TestDataTableToExcel.suo`是用户特定的解决方案选项文件,而`TestDataTableToExcel`可能是源代码文件夹,包含具体的C#代码实现...

    .NET中使用ADO技术操作SQL Server数据库,13个例子源代码

    本文将深入探讨如何使用ADO.NET技术在.NET中操作SQL Server数据库,并通过13个实例源代码来加深理解。 首先,我们需要了解ADO.NET的基本组件。这包括DataSet、DataTable、DataRow、DataAdapter以及Connection、...

    vb.net做的图片存储到SQL数据库

    本文将详细介绍如何使用VB.NET实现这一功能,以及涉及的关键知识点。 首先,我们需要了解SQL数据库中如何存储图像。由于图片是二进制数据,所以通常会存储在BLOB类型的字段中,如SQL Server中的`VARBINARY(MAX)`或`...

    .net 数据库操作类库

    .NET 数据库操作类库是一种用于简化数据库交互的软件组件,主要目标是为开发者提供一个统一的接口,以便在多种数据库管理系统(如MySQL、SQL Server、Oracle等)中进行数据操作。这种类库通常包含了诸如连接数据库、...

    .net实现将Excel中的数据导入数据库

    在.NET框架中,将Excel数据导入到数据库是一个常见的任务,特别是在处理大量数据或者用户需要从Excel文件批量导入信息时。以下是一种实现此功能的方法,基于描述中的思路: 首先,我们需要在前端提供一个文件上传...

    Asp.net Excel批量导入数据到SqlServer数据库

    在网页中通过后台代码实现数据从 Excel 中批量导入到数据库中。通过上网查询参考,总结如下: ExcelToMSSql 类 该类是实现批量导入数据的核心,主要包含两个静态方法:DataTranf 和 ExcelToDataTable。 DataTranf ...

    在.NET框架下,开发三层结构数据库应用系统

    在.NET中,可以使用ADO.NET的DataSet、DataTable等组件来操作数据,或者使用Entity Framework这样的ORM(对象关系映射)工具简化数据访问。DataSet是一个内存中的数据缓存,它可以容纳多个DataTable,提供了灵活的...

    ASP.NET DataTable的操作大全,最全的DataTable教程

    通过本篇教程,我们详细介绍了如何在ASP.NET开发环境中使用编码方式创建和操作`DataTable`。包括如何通过构造函数创建`DataTable`,如何通过`DataAdapter`填充数据,以及如何定义表结构和添加列。掌握这些基础知识...

    VB .net连接Access数据库实例

    ADO.NET是Microsoft提供的一个数据访问框架,它包括DataSet、DataTable、DataRow等对象,以及用于连接数据库的SqlConnection、OleDbConnection等连接类。 1. **创建数据库连接** 在VB .NET中,我们可以使用`...

    .net 将datatable转换为实体类LIST

    将datatable转换为实体类LIST,运用了反射和泛型的技术

    .net连接数据库实例

    在.NET框架中,C#是一种常用的编程语言,用于构建各种应用程序,包括与数据库交互的应用程序。本实例将深入探讨如何使用C#连接到数据库,主要关注`.NET`框架下的数据库连接技术。 首先,我们需要理解ADO.NET(即...

Global site tag (gtag.js) - Google Analytics