Java GroovySQL框架

Java GroovySQL框架,java,groovy,Java,Groovy,嗨,我想设计一个类使用,我将能够在我未来的任何数据库相关的项目使用。目前我提出了下面的类,它有单独的函数用于单独的查询,我想学习如何使它通用!因此,我只需要传递1查询和一些绑定参数(如果不传递null)请帮助我获得解决方案 我的代码 import java.sql.*; import java.util.List; import groovy.sql.Sql public class ProductInfo { ReadProperty prop def sql public

嗨,我想设计一个类使用,我将能够在我未来的任何数据库相关的项目使用。目前我提出了下面的类,它有单独的函数用于单独的查询,我想学习如何使它通用!因此,我只需要传递
1查询
和一些
绑定参数(如果不传递null)
请帮助我获得解决方案

我的代码

import java.sql.*;
import java.util.List;
import groovy.sql.Sql

public class ProductInfo {

  ReadProperty prop

  def sql
  public ProductInfo()
  {
    prop=ReadProperty.getInstance("db")
    sql = Sql.newInstance("jdbc:oracle:thin:@"+prop.getProperty("hostname")+":"+prop.getProperty("port")+":"+prop.getProperty("service"), "asimonc", "asimon","oracle.jdbc.OracleDriver")
  }

  public List executeSelection(String query)
  {
    List result=new ArrayList()
    sql.eachRow(query)
    { 
      String[] rows=new String[5]
      rows[0]=(String)it.id
      rows[1]=(String)it.name
      rows[2]=(String)it.description
      rows[3]=(String)it.active
      rows[4]=(String)it.release_date

      result.add(rows)
    }
    return result
  }

  public executeInsert(String query,Object[] paramValues)
  {
    sql.execute(query,[paramValues[0], paramValues[1],paramValues[2], paramValues[3], paramValues[4]])
  }

  public executeUpdation(String query,Object[] paramValues)
  {
    sql.executeUpdate(query,[paramValues[1], paramValues[2],paramValues[4],paramValues[5], paramValues[0]])
  }

  public int executeSelectMax(String query)
  {
    int max     
    sql.eachRow(query) 
    {
      max=it.max
    }
    if(max==null)
      return 0
    else
      return max
  }
}
我的甲骨文表

CREATE TABLE PRODUCTINFO
(     "ID" NUMBER NOT NULL ENABLE, 
      "NAME" NVARCHAR2(200), 
      "DESCRIPTION" NVARCHAR2(200), 
      "ACTIVE" NVARCHAR2(2), 
      "RELEASE_DATE" DATE, 
       PRIMARY KEY ("ID")
)
用于查找最大id(选择

对于更新

ProductInfo pinfo= new ProductInfo();
int max=pinfo.executeSelectMax("select max(id) as max from productinfo");
Object[] paramValues={iid,name,desc,"A",date,active};
pinfo.executeUpdation("update productinfo set name=?, description=?, release_date=?, active=? where id=?",paramValues);
Object[] paramValues={max+1,name,desc,"A",date};
pinfo.executeInsert("insert into productinfo(ID,NAME,DESCRIPTION,ACTIVE,RELEASE_DATE) values (?,?,?,?,?)",paramValues);
List result=pinfo.executeSelection("select ID,NAME,DESCRIPTION,ACTIVE,RELEASE_DATE from productinfo where ACTIVE='A'");
对于插入

ProductInfo pinfo= new ProductInfo();
int max=pinfo.executeSelectMax("select max(id) as max from productinfo");
Object[] paramValues={iid,name,desc,"A",date,active};
pinfo.executeUpdation("update productinfo set name=?, description=?, release_date=?, active=? where id=?",paramValues);
Object[] paramValues={max+1,name,desc,"A",date};
pinfo.executeInsert("insert into productinfo(ID,NAME,DESCRIPTION,ACTIVE,RELEASE_DATE) values (?,?,?,?,?)",paramValues);
List result=pinfo.executeSelection("select ID,NAME,DESCRIPTION,ACTIVE,RELEASE_DATE from productinfo where ACTIVE='A'");
对于另一个选择

ProductInfo pinfo= new ProductInfo();
int max=pinfo.executeSelectMax("select max(id) as max from productinfo");
Object[] paramValues={iid,name,desc,"A",date,active};
pinfo.executeUpdation("update productinfo set name=?, description=?, release_date=?, active=? where id=?",paramValues);
Object[] paramValues={max+1,name,desc,"A",date};
pinfo.executeInsert("insert into productinfo(ID,NAME,DESCRIPTION,ACTIVE,RELEASE_DATE) values (?,?,?,?,?)",paramValues);
List result=pinfo.executeSelection("select ID,NAME,DESCRIPTION,ACTIVE,RELEASE_DATE from productinfo where ACTIVE='A'");
那么:

import groovy.sql.Sql

public class ProductInfo {

  ReadProperty prop

  def sql
  public ProductInfo() {
    prop=ReadProperty.getInstance("db")
    sql = Sql.newInstance( "jdbc:oracle:thin:@"+prop.getProperty("hostname")+":"+prop.getProperty("port")+":"+prop.getProperty("service"), "asimonc", "asimon","oracle.jdbc.OracleDriver")
  }

  public List executeSelection(String query) {
    List result = []
    sql.eachRow(query) { 
      result << [ it.id, it.name, it.description, it.active, it.release_date ]
    }
    result
  }

  public void executeInsert( GString query ) {
    sql.execute( query )
  }

  public void executeUpdation( GString query ) {
    sql.executeUpdate( query )
  }

  public int executeSelectMax( String query ) {
    sql.firstRow(query)?.max ?: 0
  }
}
插入:

pinfo.executeInsert( "insert into productinfo(ID,NAME,DESCRIPTION,ACTIVE,RELEASE_DATE) values (${max+1}, $name, $desc, ${'A'}, $date )" )
正如你所看到的。。。您的许多代码只是简单地将东西包装在
groovy.sql.sql
类中

如何:

import groovy.sql.Sql

public class ProductInfo {

  ReadProperty prop

  def sql
  public ProductInfo() {
    prop=ReadProperty.getInstance("db")
    sql = Sql.newInstance( "jdbc:oracle:thin:@"+prop.getProperty("hostname")+":"+prop.getProperty("port")+":"+prop.getProperty("service"), "asimonc", "asimon","oracle.jdbc.OracleDriver")
  }

  public List executeSelection(String query) {
    List result = []
    sql.eachRow(query) { 
      result << [ it.id, it.name, it.description, it.active, it.release_date ]
    }
    result
  }

  public void executeInsert( GString query ) {
    sql.execute( query )
  }

  public void executeUpdation( GString query ) {
    sql.executeUpdate( query )
  }

  public int executeSelectMax( String query ) {
    sql.firstRow(query)?.max ?: 0
  }
}
插入:

pinfo.executeInsert( "insert into productinfo(ID,NAME,DESCRIPTION,ACTIVE,RELEASE_DATE) values (${max+1}, $name, $desc, ${'A'}, $date )" )

正如你所看到的。。。您的许多代码只是简单地将东西包装在
groovy.sql.sql
类中

谢谢您的回复。。如果我使用jsp页面发出这些查询,会怎么样?它还能用吗?同样在您的
executeSelection
方法
it.id
it.name
。。。都是硬编码的。。如果我试图执行其他一些select查询呢?不,因为JSP不知道GString。也许这一海量的信息片段本该成为问题?我要警告您,如果JSP中直接存在SQL,您可能需要重新思考。。。表示层中的数据库调用通常是一件非常糟糕的事情:-/那么如何提供绑定参数而不是硬编码?您还可以建议,除了直接从jsp使用SQL之外,我应该如何在我的webapp中使用SQL?编写某种控制器类,其中包含与您希望执行的操作(添加用户、更新字段等)匹配的方法,然后从jsp调用这些方法。否则,当您的代码库中的所有JSP中都存在一些SQL时,您将面临一场维护噩梦。。。对于小事情来说,这没问题,但如果它增长了,你会感到非常痛苦…K1问题解决了:)现在
executeSelection
总是从一个Oracle表执行查询,如果我想执行一个从另一个Oracle表获取数据的查询呢?我是否总是需要为每个
select query
编写不同的函数,因为
it.id,it.name…
已在函数中指定感谢您的回复。。如果我使用jsp页面发出这些查询,会怎么样?它还能用吗?同样在您的
executeSelection
方法
it.id
it.name
。。。都是硬编码的。。如果我试图执行其他一些select查询呢?不,因为JSP不知道GString。也许这一海量的信息片段本该成为问题?我要警告您,如果JSP中直接存在SQL,您可能需要重新思考。。。表示层中的数据库调用通常是一件非常糟糕的事情:-/那么如何提供绑定参数而不是硬编码?您还可以建议,除了直接从jsp使用SQL之外,我应该如何在我的webapp中使用SQL?编写某种控制器类,其中包含与您希望执行的操作(添加用户、更新字段等)匹配的方法,然后从jsp调用这些方法。否则,当您的代码库中的所有JSP中都存在一些SQL时,您将面临一场维护噩梦。。。对于小事情来说,这没问题,但如果它增长了,你会感到非常痛苦…K1问题解决了:)现在
executeSelection
总是从一个Oracle表执行查询,如果我想执行一个从另一个Oracle表获取数据的查询呢?我是否总是需要为每个
select query
编写不同的函数,因为
it.id,it.name…
已在函数中指定