Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中是否可以使用通用sql查询?_Java_Sql_Jdbc_Resultset - Fatal编程技术网

在java中是否可以使用通用sql查询?

在java中是否可以使用通用sql查询?,java,sql,jdbc,resultset,Java,Sql,Jdbc,Resultset,如果我有创建SQL查询的方法,如下所示: public List selectTuple() { boolean status = true; String query = "SELECT "; query += getFields() == null ? " * " : " " + getFields() + " "; query += " FROM " + tables; if ( getSearchClause() != null ) { que

如果我有创建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中使用getMetaData()来获取列的数量和类型,并在ResultSet中进行迭代

:

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

您需要为自己的类型(如果有的话)使用并传递JDBC到Java对象映射的映射

因此,如果表中有列
i
numeric和列
s
varchar,则下一个代码

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
您要做的唯一一件事是使用
instanceof
检查返回对象的类,以执行实际的强制转换

有关更多详细信息,请参阅


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

正如@jahroy所评论的,避免将JDBC用于此类泛型。我也有同样的问题,我想出了一个简单而优雅的方法来解决这个问题

这里是我创建的一个通用方法,用于处理任何
SELECT
查询,您可以了解
JPA
的工作原理。在本例中,我只想确保只有
选择
查询,但您可以使其更通用,以接受
插入
删除
更新

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,但我只使用这两个IDE)动态地提供了一个“自动创建”类实体!您根本不需要在这些实体类上编写任何代码。简而言之,实体类表示数据库中的表。因此,数据库中的每个表都将由一个实体类表示


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

你可以,你只需要检查结果来确定类型并动态构建。像这样的方法是SQL注入漏洞的永久来源Hi Preet,你能粘贴一个示例代码吗?如果可能的话,使用JPA或JPQL,忘记创建自己的SQL库。JDBC是一个主要的阻力…@Oleg:为什么你认为它容易受到sql注入的攻击?它可以创建准备好的查询和未准备好的查询。