0

编辑4:

我不知道为什么,但是我在下面使用的结构不起作用。我不得不修改我在 java2s 网站上找到的一个文件,它叫做 TableFromDatabase,然后将 JTextFields 设为公共静态,然后在 FrmMovimento 等中实例化 TableFromDatabase 类:

TableFromDatabase frame = new TableFromDatabase();
jDesktopPane2.add(frame);
frame.show();

我还修改了 TableFromDatabase 行

frame.setDefaultCloseOperation( EXIT_ON_CLOSE_ );

frame.setDefaultCloseOperation( DISPOSE_ON_CLOSE );

原帖:

在这部分程序中,JInternalFrame 文件 FrmMovimento,我制作了一个名为 Visualizar(“视图”)的按钮。根据我们在文本字段中键入的内容,它必须显示用户定义的间隔。

有这些 JTextField: 代码来自:_到:_ 资产:_

还有这些 JFormattedTextFields: 日期从:_到:_

例如,如果我使用另一个 SELECT 语句选择所有寄存器,则 JInternalFrame FrmListarMov 的 JDesktopPane 中已经出现了寄存器。但如果我像在标题中那样输入:

public List<MovimentoVO> Lista() throws ErroException, InformacaoException{
    List<MovimentoVO> listaMovimento = new ArrayList<> ();
    try {

        MySQLDAO.getInstancia().setAutoCommit(false);
        try (PreparedStatement stmt = MySQLDAO.getInstancia().prepareStatement(
             "SELECT * FROM Cadastro2 WHERE Codigo BETWEEN "+ txtCodDeMov +" AND "+ txtCodAteMov +";") {

            ResultSet registro = stmt.executeQuery();

            while(registro.next()){

                MovimentoVO Movimento = new MovimentoVO();

                Movimento.setCodDeMov(registro.getInt(1));
                Movimento.setCodAteMov(registro.getInt(2));
                Movimento.setAtivoMov(registro.getString(3));
                Movimento.setDataDeMov(registro.getString(4));
                Movimento.setDataAteMov(registro.getString(5));

                listaMovimento.add(Movimento);
            }
        }
    } catch (SQLException ex) {            
          throw new ErroException(ex.getMessage());
     } catch (InformacaoException ex) {  
          throw ex;
    }
    return listaMovimento;
}

在 SELECT 行中,txtCodDeMov 是我如何命名“Code from”的 JTextField,而 txtCodAtemov 是我如何命名第一个“To”的 JTextField。

哦,我在 Linux Mint 12 64 位中使用 NetBeans 7.1.2(内部版本 201204101705)和 MySQL Ver 14.14 Distrib 5.1.63。

编辑:实际上,它是 MovimentoVO2、MovimentoDAO2 等,因为我做了两个文件,一个带有 setCodDeMov 和 setCodAteMov 等,另一个只有 setCodigo、setAtivo 和 setData。抱歉,我在使用这些技术方面还是有点菜鸟。

从表 Cadastro2 中,只有主键 Codigo 将用于查询。稍后我们将创建另一个表,我们将在其中注册资产的买卖,因此它们将具有资产类型和移动日期,这将被添加到 SELECT ... BETWEEN ... AND 我们需要。到目前为止,我只需要了解 Java 如何获取我在 JTextField 中键入的值并将其放入 SELECT 命令中。

EDIT2:在客户端注册屏幕中,查询按钮工作100%,如下所示。但这是另一种情况,因为在这种情况下,如果找到具有指定代码(表 Cadastro2 中的主键)的寄存器,则按钮事件会使所有 JTextField 完成。现在我要做的是生成一个包含间隔中所有寄存器的表。

EDIT3:我认为正确的术语是报告生成。我听说过 iReport 和 Jasper Reports,但我从未使用过它们。考虑到这个项目必须在 12 月在大学里提交,有时间学习这两个工具吗?当我还在学习 Java 时,这会是一个糟糕的举动吗?起初我认为是,所以我只在 Netbeans 上做所有事情。


假设 txtCodDeMo 和 txtCodAteMov 是日期,它们应该是单引号。

SELECT * FROM Cadastro2 WHERE Codigo BETWEEN '"+ txtCodDeMov +"' AND '"+ txtCodAteMov +"'";

注意:此语法易受 SQL 注入攻击。

如果可能,请使用 PreparedStatement。

4

4 回答 4

2

不要使用动态sql,它会导致SQL注入。使用参数。

代替 "SELECT * FROM Cadastro2 WHERE Codigo BETWEEN "+ txtCodDeMov +" AND "+ txtCodAteMov +";"

"SELECT * FROM Cadastro2 WHERE Codigo BETWEEN ? AND ?" // without semicolon in query
...
stmt.setString(1, txtCodDeMov); // depends of 'Codigo' type, it may be stmt.setLong(1, txtCodDeMov);
stmt.setString(2, txtCodAteMov);
ResultSet registro = stmt.executeQuery();

编辑:如果您未在查询中指定字段顺序,则不要按索引获取字段值。您可以稍后更改数据库中的字段顺序,您的函数将返回不正确的结果。按字段名称获取值或指定字段顺序。

于 2012-09-17T15:30:25.313 回答
1

我可能有点被误导了,但除了考虑使用@user1516873 所说的参数或像@nambari 所说的那样添加'。我相信您在每个 JTextfields 中都缺少 getText() 方法,并且 + 运算符隐式调用 toString 方法。

于 2012-09-17T16:10:00.173 回答
0

尝试使用 JTextField.getText() 来获取这些值。您还应该考虑对准备好的语句进行参数化。

你会做这样的事情。

“从 Cadatro2 中选择 * 在 Codigo 之间?和?;”

stmt.setInt(1,1); stmt.setInt(2,2);

您可以将 .setInt 更改为您需要的任何数据类型。第一个参数是“?” 位置。第一个 .setInt 将设置第一个 ? 到值(对于该方法,它是一)。

于 2012-09-17T15:06:52.023 回答
0

假设 txtCodDeMo 和 txtCodAteMov 是日期,它们应该是单引号。

SELECT * FROM Cadastro2 WHERE Codigo BETWEEN '"+ txtCodDeMov +"' AND '"+ txtCodAteMov +"'";

注意:此语法易受 SQL 注入攻击。

如果可能,请使用 PreparedStatement。

于 2012-09-17T15:02:10.190 回答