在Java中执行通用SQL

在Java中执行通用SQL,java,mysql,generics,Java,Mysql,Generics,我正在开发一个小型web应用程序,它将使用MySQL数据库,有几个servlet执行不同类型的SQL—插入、更新、删除等。以前,我编写了一个单独的类Database.java,每个查询都有一个单独的函数。但是,这会建立一个大而混乱的文件,现在我想创建一些通用函数,例如: static ArrayList rs(String query, List params, int columns) { ArrayList result = new ArrayList(); Conn

我正在开发一个小型web应用程序,它将使用MySQL数据库,有几个servlet执行不同类型的SQL—插入、更新、删除等。以前,我编写了一个单独的类Database.java,每个查询都有一个单独的函数。但是,这会建立一个大而混乱的文件,现在我想创建一些通用函数,例如:

    static ArrayList rs(String query, List params, int columns) {
    ArrayList result = new ArrayList();
    Connection con = null;
    ResultSet rs = null;
    PreparedStatement stmt = null;
    try {
        con = getConnection();          
        stmt = con.prepareStatement(query);

        for (int i = 0; i < params.size(); i++) {
            stmt.setObject(i+1, params.get(i));
        }

        rs = stmt.executeQuery();
        while(rs.next()) {
            ArrayList thisRow = new ArrayList();

            for (int column = 1; column <= columns; column++) {
                thisRow.add(rs.getObject(column));

            }
            result.add(thisRow);

        }

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            rs.close();
            stmt.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }


    }


    return result;

}
静态ArrayList rs(字符串查询、列表参数、int列){
ArrayList结果=新建ArrayList();
连接con=null;
结果集rs=null;
PreparedStatement stmt=null;
试一试{
con=getConnection();
stmt=con.preparest陈述(查询);
对于(int i=0;i对于(int column=1;column非常接近,但为了提高效率,请尝试这样做

static ArrayList rs(String query, List params, int columns) 
{
    ArrayList result = new ArrayList();
    try (Connection con = getConnection())
    {
        try(PreparedStatement stmt = con.prepareStatement(query))
        {
            for (int i = 0; i < params.size(); i++) 
            {
                stmt.setObject(i+1, params.get(i));
            }
            try(ResultSet rs = stmt.executeQuery())
            {
                 while(rs.next()) 
                 {
                     ArrayList thisRow = new ArrayList();
                     for (int column = 1; column <= columns; column++) 
                     {
                          thisRow.add(rs.getObject(column));
                     }
                     result.add(thisRow);
                 }
            } 
            catch (SQLException e) 
            {
                e.printStackTrace();
            }
        }
    }
    return result;
}
静态ArrayList rs(字符串查询、列表参数、int列)
{
ArrayList结果=新建ArrayList();
try(Connection con=getConnection())
{
try(PreparedStatement stmt=con.preparest陈述(查询))
{
对于(int i=0;i对于(int column=1;column如果您试图找到一种比普通JDBC+自制实用程序类更有效的方法,那么有两个好的选择可以考虑:

  • (例如JPA):这些工具可以让您将现有的表映射到您创建的对象,然后为您提供大量现成的功能。当然,它是免费的,您需要学习如何配置和使用这些,但之后它将成为一个非常强大的工具

  • (例如MyBatis):这些工具在某种程度上更易于使用(至少MyBatis是这样),功能更少。我建议阅读示例并将其与JPA进行比较,看看哪一个最适合您


解决方案可能取决于您想要得到的“通用”结果的级别。无论如何,我建议不要发明带有普通JDBC API的自行车,因为它的级别太低了

除了JPA或MyBatis(一开始似乎很复杂)之外,我认为最简单的方法之一是使用。它提供了使用SQL访问数据的功能。最简单、最通用的示例是:

List<Map<String,Object>> queryResult = jdbcTemplate.queryForList("**qour sql select here**");
List queryResult=jdbcTemplate.queryForList(“**qour-sql-select-here**”);

close
调用应该在
finally
块中!看起来很难看,finally中有另一个try-catch,但是如果是这样,我会更改它,感谢JDBC API是如此难看…或者,如果您使用jre 1.7+在超出try范围时关闭连接,您可以使用try with resources-接住