gpt4 book ai didi

java - 如何动态创建准备好的语句 - 并重新使用查询

转载 作者:行者123 更新时间:2023-11-29 08:24:00 24 4
gpt4 key购买 nike

例如,我一直在尝试创建一个类来处理来自创建不同对象的不同类的查询。

Class Employees, Class Customers, Class Sales

我想通过从 JTextField 值派生的构造函数传递 SQL 查询(到查询类“数据库”)。

例如,来自两个不同的类:

new Database (SELECT PRODUCT FROM SALES WHERE DATE = YESTERDAY);

new Database (SELECT FULLNAMES FROM CUSTOMER WHERE ADDRESS = NEWYORK);

我面临的问题是动态创建以下项目(PreparedStatement 参数):

stmt.setString(2, NEWYORK);

这样“sql”就在“?”处可以填充:

String sql = "SELECT FULLNAMES FROM CUSTOMER WHERE ADDRESS = ?";

在我的项目中,可能有一个语句将值传递给上面的参数,或者可能有更多参数,意味着更多语句,因此上面的内容无法重用。

任何人都可以了解如何生成“stmt.setString(2, NEWYORK);”动态地以便我可以根据传递的参数数量动态生成它。这样我就可以:

stmt.setString(1, NEWYORK);
stmt.setString(2, FULLNAMES);
stmt.setString(3, EMPLOYEE);

注意:重点是重用数据库类。

最佳答案

假设您已经能够动态创建 SQL 字符串(根据需要在正确的位置插入 ?),我建议使用 Map 传入参数,其中key 是参数顺序(1、2、3 等)。像这样的事情:

public class Database{
private String _sqlString;
private Map<Integer,Object> _parameters;

public Database(String sql){
_sqlstring = sql;
}

public void setParameters(Map<Integer,Object> param){
_parameters = param;
}

/*
* I'm assuming you already have a method like this
*/
public List processQuery(){
List results = new ArrayList();
/*
* establish connection here
*/
PreparedStatement preparedStatement = connection.prepareStatement(this._sqlString);

if(_parameters != null){
/*
* Iterate over the map to set parameters
*/
for(Integer key : _parameters.keySet()){
preparedStatement.setObject(key, _parameters.get(key));
}
}

ResultSet rs = preparedStatement.executeQuery();
/*
* process the ResultSet
*/
return results;
}

}

最后您可以使用数据库,如下所示:

String sql = "SELECT FULLNAMES FROM CUSTOMER WHERE ADDRESS = ? OR ADDRESS = ?";

Map<Integer,Object> param = new HashMap<>();
param.put(1,"NEW YORK");
param.put(2,"CHICAGO");

Database db = new Database(sql);
db.setParameters(param);
List customers = db.processQuery();

关于java - 如何动态创建准备好的语句 - 并重新使用查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18466437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com