5

如果我有创建 SQL 查询的方法,如下所示:

public List selectTuple() {
   boolean status = true;
   String query = "SELECT ";
   query += getFields() == null ? " * " : " " + getFields() + " ";
   query += " FROM " + tables;
   if ( getSearchClause() != null ) {
       query += " " + getSearchClause();
   }
   query += ";";
   Debug("SQL...........caleed selectTuple method, query is : "+ query);
   setQuery(query);
   if ( getPrepared() ) {//If this is a Prepared query,
      status = setPreparedStatement();
   } else {
      status = setNonPreparedStatement();
   }
   if ( ! status ) {
      Log("[CRITICAL] (.........)..........");
   }
   status = doExecuteQuery();
   if ( ! status ) {
      Log("[CRITICAL] (.........)..........");
   }
   return( getResults() );
}//method selectTuple

但是,由于这将用于不同的表,因此字段将具有不同的数据类型(int、string、date 等)。那么我怎样才能遍历这样的 ResultSet 呢?

另外,如何创建这样的插入查询?

谢谢。

4

3 回答 3

2

是的,我认为可以做到...您可以在 ResultSet 中使用 getMetaData() 来获取列的数量和类型,然后遍历 ResultSet。

获取元数据()

ResultSetMetaData 类

但是,我不知道如何编写这样一个通用的插入查询......

于 2012-11-03T02:59:46.727 回答
1

您将需要使用getObject并将 JDBC 映射传递给您自己的类型的 Java 对象映射(如果有)。

所以,如果你的表有列inumeric 和列svarchar 下一个代码

ResultSet rs = st.executeQuery("select i, s from test");
rs.next();
System.out.println(rs.getObject(1).getClass());
System.out.println(rs.getObject(2).getClass());

将导致

class java.lang.Integer
class java.lang.String

您唯一要做的就是检查返回的 Object 的类,使用instanceof, 来进行实际的转换。

您可以参考这篇文章了解更多详情。

对于插入部分,您可以使用setObject方法并依赖 JDBC 转换,这可能不是一个好主意,但应该可以。

于 2012-11-03T03:00:11.730 回答
0

正如@jahroy 评论的那样,避免将 JDBC 用于此类通用事物。我也遇到了同样的问题,我想出了一个简单而优雅的方法来使用JPA

这是我创建的用于处理任何SELECT查询的通用方法,您可以了解其JPA工作原理。在这种情况下,我只是想确保只有SELECT查询,但你可以让它更通用,接受INSERT, DELETE, UPDATE...

public List executeSelectQuery(String selectQuery, Class entityClass, String classPersistentUnit)
{
    selectQuery = selectQuery.toUpperCase();
    if(!selectQuery.startsWith("SELECT"))
    {
        throw new IllegalArgumentException("This method only accepts SELECT queries. You tried: " + selectQuery);
    }

    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(classPersistentUnit);
    EntityManager entityManager = entityManagerFactory.createEntityManager();

    Query query = entityManager.createNativeQuery(selectQuery, entityClass);

    return query.getResultList();
}

好消息是 Netbeans 和 Eclipse(可能还有更多的 IDE,但我只使用这两个)动态地提出了一个“自动创建”类实体!您根本不需要在这些实体类上编写任何代码。简而言之,实体类代表数据库中的一个表。因此,数据库中的每个表都将由一个实体类表示。

你可以在这里找到一个简单的小教程

于 2014-07-20T23:26:40.127 回答