Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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 当对应的JTextfield为空时,如何填充JTable中的所有项_Java_Swing_Jdbc_Jtable_Jtextfield - Fatal编程技术网

Java 当对应的JTextfield为空时,如何填充JTable中的所有项

Java 当对应的JTextfield为空时,如何填充JTable中的所有项,java,swing,jdbc,jtable,jtextfield,Java,Swing,Jdbc,Jtable,Jtextfield,我正在用NetBeans中的sqlite在Java项目中设计一个高级搜索选项。 有5个不同的JTextfields和5列,我想用相应的匹配条件填充JTable。如果JTextfield为空,则应选择该列的所有项目 我使用的查询是: String val1 = txt_billing2.getText(); String val2 = txt_station2.getText(); String val3 = txt_invoice2.getText(); String val4 = txt_am

我正在用NetBeans中的
sqlite
在Java项目中设计一个高级搜索选项。 有5个不同的
JTextfields
和5列,我想用相应的匹配条件填充
JTable
。如果
JTextfield
为空,则应选择该列的所有项目

我使用的查询是:

String val1 = txt_billing2.getText();
String val2 = txt_station2.getText();
String val3 = txt_invoice2.getText();
String val4 = txt_amonth2.getText();
String val5 = txt_umonth2.getText();

String sql = "SELECT * from airindia_sqlite WHERE BILLING = '"+val1+"' and STATION =    '"+val2+"' and INVOICE = '"+val3+"' and AMONTH = '"+val4+"' and UMONTH = '"+val5+"'";

pst = conn.prepareStatement(sql);
rs = pst.executeQuery();

Table_airindia.setModel(DbUtils.resultSetToTableModel(rs));
但是当我将
JTextfield
留空时,它在
JTable
中不显示任何数据。
我知道的唯一方法是使用
if-else
条件,但这会生成5!=120个条件。

首先请注意,您的查询容易受到攻击。要避免这些问题,您需要正确使用:

String val1 = txt_billing2.getText();
...
String val5 = txt_umonth2.getText();

String sql = "SELECT * from airindia_sqlite WHERE BILLING = ? and STATION = ? and INVOICE = ? and AMONTH = ? and UMONTH = ?";
ps = con.prepareStatement(sql);
ps.setObject(1, val1);
...
ps.setObject(5, val5);
说到这里,我将使用一个辅助类来编写
WHERE
子句,给出一些参数。比如:

public class WhereClause {

    private Integer currentIndex = 0;
    private Map<Integer, Object> parameters = new HashMap<>();
    private StringBuilder whereClause = null;

    public void addParameter(String columnName, Object value) {
        if(whereClause == null) {
            whereClause = new StringBuilder(" WHERE ");
        } else if (currentIndex > 0) {
            whereClause.append(" AND ");
        }
        whereClause.append(columnName).append(" = ?");
        paramenters.put(++currentIndex, value);
    }

    public String getWhereClause() {
        return whereClause != null ? whereClause.toString() : "";
    }

    public Map<Integer, Object> getParamenters() {
        return parameters;
    }
}
public class子句{
私有整数currentIndex=0;
私有映射参数=new HashMap();
private StringBuilder whereClause=null;
public void addParameter(字符串列名、对象值){
if(whereClause==null){
whereClause=新的StringBuilder(“WHERE”);
}否则如果(当前索引>0){
其中第条。附加(“和”);
}
whereClause.append(columnName).append(=?);
参数put(++currentIndex,value);
}
公共字符串getWhere子句(){
return whereClause!=null?whereClause.toString():“”;
}
公共映射getParameters(){
返回参数;
}
}
然后,您可以执行以下操作以获得适当的SQL语句:

WhereClause whereClause = new WhereClause();

if(!(txt_billing2.getText().trim().isEmpty())) {
    whereClause.addParameter("BILLING", txt_billing2.getText().trim());
}

...

if(!(txt_umonth2.getText().trim().isEmpty())) {
    whereClause.addParameter("UMONTH ", txt_umonth2.getText().trim());
}

String sql = "SELECT * FROM airindia_sqlite" + whereClause.getWhereClause();
ps = con.prepareStatement(sql);

Map<Integer, Object> parameters = whereClause.getParameters();
for (Integer key : parameters.keySet()) {
    ps.setObject(key, parameters.get(key));
}

rs = ps.executeQuery();
WhereClause WhereClause=新WhereClause();
if(!(txt_billing2.getText().trim().isEmpty()){
whereClause.addParameter(“BILLING”,txt_billing2.getText().trim());
}
...
if(!(txt_umonth2.getText().trim().isEmpty()){
whereClause.addParameter(“UMONTH”,txt_month2.getText().trim());
}
String sql=“SELECT*FROM airnia_sqlite”+whereClause.getWhereClause();
ps=con.prepareStatement(sql);
映射参数=whereClause.getParameters();
for(整数键:parameters.keySet()){
ps.setObject(key,parameters.get(key));
}
rs=ps.executeQuery();

离题
当心数据库调用是耗时的任务,可能会阻塞(又称EDT),导致GUI无响应。EDT是一个单独的特殊线程,Swing组件在其中创建和更新。为了避免阻塞,该线程考虑使用A在后台线程中执行数据库调用,并更新EDT中的Swing组件。请首先注意,您的查询容易受到攻击。要避免这些问题,您需要正确使用:

String val1 = txt_billing2.getText();
...
String val5 = txt_umonth2.getText();

String sql = "SELECT * from airindia_sqlite WHERE BILLING = ? and STATION = ? and INVOICE = ? and AMONTH = ? and UMONTH = ?";
ps = con.prepareStatement(sql);
ps.setObject(1, val1);
...
ps.setObject(5, val5);
说到这里,我将使用一个辅助类来编写
WHERE
子句,给出一些参数。比如:

public class WhereClause {

    private Integer currentIndex = 0;
    private Map<Integer, Object> parameters = new HashMap<>();
    private StringBuilder whereClause = null;

    public void addParameter(String columnName, Object value) {
        if(whereClause == null) {
            whereClause = new StringBuilder(" WHERE ");
        } else if (currentIndex > 0) {
            whereClause.append(" AND ");
        }
        whereClause.append(columnName).append(" = ?");
        paramenters.put(++currentIndex, value);
    }

    public String getWhereClause() {
        return whereClause != null ? whereClause.toString() : "";
    }

    public Map<Integer, Object> getParamenters() {
        return parameters;
    }
}
public class子句{
私有整数currentIndex=0;
私有映射参数=new HashMap();
private StringBuilder whereClause=null;
public void addParameter(字符串列名、对象值){
if(whereClause==null){
whereClause=新的StringBuilder(“WHERE”);
}否则如果(当前索引>0){
其中第条。附加(“和”);
}
whereClause.append(columnName).append(=?);
参数put(++currentIndex,value);
}
公共字符串getWhere子句(){
return whereClause!=null?whereClause.toString():“”;
}
公共映射getParameters(){
返回参数;
}
}
然后,您可以执行以下操作以获得适当的SQL语句:

WhereClause whereClause = new WhereClause();

if(!(txt_billing2.getText().trim().isEmpty())) {
    whereClause.addParameter("BILLING", txt_billing2.getText().trim());
}

...

if(!(txt_umonth2.getText().trim().isEmpty())) {
    whereClause.addParameter("UMONTH ", txt_umonth2.getText().trim());
}

String sql = "SELECT * FROM airindia_sqlite" + whereClause.getWhereClause();
ps = con.prepareStatement(sql);

Map<Integer, Object> parameters = whereClause.getParameters();
for (Integer key : parameters.keySet()) {
    ps.setObject(key, parameters.get(key));
}

rs = ps.executeQuery();
WhereClause WhereClause=新WhereClause();
if(!(txt_billing2.getText().trim().isEmpty()){
whereClause.addParameter(“BILLING”,txt_billing2.getText().trim());
}
...
if(!(txt_umonth2.getText().trim().isEmpty()){
whereClause.addParameter(“UMONTH”,txt_month2.getText().trim());
}
String sql=“SELECT*FROM airnia_sqlite”+whereClause.getWhereClause();
ps=con.prepareStatement(sql);
映射参数=whereClause.getParameters();
for(整数键:parameters.keySet()){
ps.setObject(key,parameters.get(key));
}
rs=ps.executeQuery();

离题
当心数据库调用是耗时的任务,可能会阻塞(又称EDT),导致GUI无响应。EDT是一个单独的特殊线程,Swing组件在其中创建和更新。为了避免阻塞,该线程考虑使用A在后台线程中执行数据库调用,并更新EDT中的Swing组件。请首先注意,您的查询容易受到攻击。要避免这些问题,您需要正确使用:

String val1 = txt_billing2.getText();
...
String val5 = txt_umonth2.getText();

String sql = "SELECT * from airindia_sqlite WHERE BILLING = ? and STATION = ? and INVOICE = ? and AMONTH = ? and UMONTH = ?";
ps = con.prepareStatement(sql);
ps.setObject(1, val1);
...
ps.setObject(5, val5);
说到这里,我将使用一个辅助类来编写
WHERE
子句,给出一些参数。比如:

public class WhereClause {

    private Integer currentIndex = 0;
    private Map<Integer, Object> parameters = new HashMap<>();
    private StringBuilder whereClause = null;

    public void addParameter(String columnName, Object value) {
        if(whereClause == null) {
            whereClause = new StringBuilder(" WHERE ");
        } else if (currentIndex > 0) {
            whereClause.append(" AND ");
        }
        whereClause.append(columnName).append(" = ?");
        paramenters.put(++currentIndex, value);
    }

    public String getWhereClause() {
        return whereClause != null ? whereClause.toString() : "";
    }

    public Map<Integer, Object> getParamenters() {
        return parameters;
    }
}
public class子句{
私有整数currentIndex=0;
私有映射参数=new HashMap();
private StringBuilder whereClause=null;
public void addParameter(字符串列名、对象值){
if(whereClause==null){
whereClause=新的StringBuilder(“WHERE”);
}否则如果(当前索引>0){
其中第条。附加(“和”);
}
whereClause.append(columnName).append(=?);
参数put(++currentIndex,value);
}
公共字符串getWhere子句(){
return whereClause!=null?whereClause.toString():“”;
}
公共映射getParameters(){
返回参数;
}
}
然后,您可以执行以下操作以获得适当的SQL语句:

WhereClause whereClause = new WhereClause();

if(!(txt_billing2.getText().trim().isEmpty())) {
    whereClause.addParameter("BILLING", txt_billing2.getText().trim());
}

...

if(!(txt_umonth2.getText().trim().isEmpty())) {
    whereClause.addParameter("UMONTH ", txt_umonth2.getText().trim());
}

String sql = "SELECT * FROM airindia_sqlite" + whereClause.getWhereClause();
ps = con.prepareStatement(sql);

Map<Integer, Object> parameters = whereClause.getParameters();
for (Integer key : parameters.keySet()) {
    ps.setObject(key, parameters.get(key));
}

rs = ps.executeQuery();
WhereClause WhereClause=新WhereClause();
if(!(txt_billing2.getText().trim().isEmpty()){
whereClause.addParameter(“BILLING”,txt_billing2.getText().trim());
}
...
if(!(txt_umonth2.getText().trim().isEmpty()){
whereClause.addParameter(“UMONTH”,txt_month2.getText().trim());
}
String sql=“SELECT*FROM airnia_sqlite”+whereClause.getWhereClause();
ps=合同准备声明