在java中是否可以使用通用sql查询?
如果我有创建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
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注入的攻击?它可以创建准备好的查询和未准备好的查询。