如何使用Java代码比较VARCHAR数据类型,以确保数据库中的数据相同

如何使用Java代码比较VARCHAR数据类型,以确保数据库中的数据相同,java,sql,jdbc,Java,Sql,Jdbc,由于数据迁移,如何比较两个不同数据库中的值与列中的相同数据。我正在运行jUnit测试,并且这些值没有通过相同的测试。我做错了什么?好的,我知道我已经将sourceDB和目标数据库设置为同一个数据库,即它们是相同的东西。我这样做是因为我想确保连接在整个过程中是正确的,并将所有问题缩小到语法错误。“名称”列的行中的值为;计划管理、缺陷和增强、硬件和软件请求 public class DemandTypeCopier { public static String QUERY_CREATECO

由于数据迁移,如何比较两个不同数据库中的值与列中的相同数据。我正在运行jUnit测试,并且这些值没有通过相同的测试。我做错了什么?好的,我知道我已经将sourceDB和目标数据库设置为同一个数据库,即它们是相同的东西。我这样做是因为我想确保连接在整个过程中是正确的,并将所有问题缩小到语法错误。“名称”列的行中的值为;计划管理、缺陷和增强、硬件和软件请求

public class DemandTypeCopier {

    public static String QUERY_CREATECOPY = "select name from tr_demandtype where name=?";

}

public void testQUERY_CREATECOPY() throws Exception{

    UnitTestHelper helper = new UnitTestHelper();
    Connection con = helper.getConnection(helper.sourceDBUrl);
    Connection conTarget = helper.getConnection(helper.targetDBUrl);
    String x = "Initiative management";

    PreparedStatement stmt = con.prepareStatement(DemandTypeCopier.QUERY_CREATECOPY);
    stmt.setString(1, x);
    ResultSet sourceVal = stmt.executeQuery();

    stmt = conTarget.prepareStatement(DemandTypeCopier.QUERY_CREATECOPY);
    stmt.setString(1, x);
    ResultSet targetVal = stmt.executeQuery();

    assertTrue(helper.resultSetsEqual(sourceVal,targetVal));

}

public boolean resultSetsEqual (ResultSet source, ResultSet target) throws SQLException{
    while(source.next())
    {
            target.next();
            ResultSetMetaData metadata = source.getMetaData();
            int count = metadata.getColumnCount();
            for (int i =1; i<=count; i++)
            {
               if(source.getObject(i) != target.getObject(i))
               {
              return false;
               }
            }
    }
    return true;
}
公共类DemandTypeCopier{
公共静态字符串查询_CREATECOPY=“从tr_demandtype中选择名称,其中名称=?”;
}
public void testQUERY_CREATECOPY()引发异常{
UnitTestHelper=新的UnitTestHelper();
Connection con=helper.getConnection(helper.sourceDBUrl);
Connection conTarget=helper.getConnection(helper.targetDBUrl);
String x=“主动管理”;
PreparedStatement stmt=con.prepareStatement(DemandTypeCopier.QUERY\u CREATECOPY);
stmt.setString(1,x);
ResultSet sourceVal=stmt.executeQuery();
stmt=conTarget.prepareStatement(DemandTypeCopier.QUERY\u CREATECOPY);
stmt.setString(1,x);
ResultSet targetVal=stmt.executeQuery();
assertTrue(helper.resultsequal(sourceVal,targetVal));
}
公共布尔ResultSetQual(ResultSet源、ResultSet目标)引发SQLException{
while(source.next())
{
target.next();
ResultSetMetaData元数据=source.getMetaData();
int count=metadata.getColumnCount();

对于(int i=1;i而言,问题在于,在比较数据时,您测试的是对象标识,而不是相等性

source.getObject(i) != target.getObject(i)
上面将测试从两个结果集返回的对象是否相同,这在大多数(所有?)情况下都不正确。您真正想做的是测试是否相等:

source.getObject(i).equals(target.getObject(i))
请注意,如果source.getObject(i)返回null,上述操作将引发NullPointerException,因此除非数据库中的任何列都不允许使用null值,否则您需要添加代码来处理null值

在查询中添加ORDERBY子句,否则无法保证返回结果的顺序


检查target.next()的结果,以便正确处理两个结果集大小不相等的情况。

我更改了ResultSequal以反映该更改,但它仍然未通过测试。在assertTrue(helper.ResultSequal(sourceVal,targetVal))中失败;编辑了答案,添加了有关ORDER BY和Check target的部分。下一步(),这可能是您的问题