如何向数组插入日期或NULL

时间:2016-05-25 08:43:19

标签: java oracle jdbc

我有以下问题。 我在我的项目中使用JDBC,并且我使用简单的方法将数据插入到我的数据库中。

我的问题是:当我想插入sysdateNULL之类的内容以自动增加时该怎么办?对于我的方法,我只发送字符串并将NULL写入字符串并不起作用。

你能给我任何建议吗如何改进它?

这是查询中常量null的代码,但它不是我想要的。

public static void insertInto(String Table, ArrayList<String> values) throws SQLException
{
    Connection conn = JavaConnectDB.ConnectDb();
    OraclePreparedStatement pst = null;    
    StringBuilder Query = new StringBuilder("INSERT INTO " + Table + " VALUES (NULL, ");

    for (int i = 0; i < values.size(); i++)
    {
        Query.append("? ");
        if (i + 1 != values.size())
            Query.append(", ");
    }
    Query.append(")");

    pst = (OraclePreparedStatement) conn.prepareStatement(Query.toString());

    for (int i = 0; i < values.size(); i++)
    {
        pst.setString(i + 1, values.get(i));
    }

    pst.executeUpdate();
}

此方法创建类似&#34; INSERT INTO TABLE VALUES(NULL,?,?,?)&#34;然后用数组中的值填充空白。

3 个答案:

答案 0 :(得分:1)

有java.sql.PreparedStatement.setNull(int,int)

尝试,例如

pst.setNull(1, Types.BIGINT);
for (int i = 1; i < values.size(); i++)
{
    pst.setString(i + 1, values.get(i));
}

更改Types.BIGINT以获取列的apporpriate类型。 请注意,values.get(0)只是被忽略,但应该存在于数组中。

答案 1 :(得分:1)

问题是setString功能。如果你有一个字符串&#34; NULL&#34;或者&#34; SYSDATE&#34;,它将导致查询被引用('NULL''SYSDATE'),因此这将作为字符串插入。

根据this回答,pst.setString(n,null)应该已经完成​​了这个技巧,所以插入SQL NULL值相对容易,只需将Java null值插入到数组中您希望数据库值为SQL NULL

SYSDATE变得更加细腻。但我认为,这里有一些更基础的东西:你将如何处理VARCHAR以外的数据类型(参见setString文档)。 如果你真的想要这样一个泛型方法,我宁愿传递ArrayList<Object>作为参数(或使用省略号...)并为特定的Object类型调用适当的setXXX方法 - 或者setObject使用适当的Type参数集。然后,您可以创建自己的类SysDate,这很容易被检测到。

您的应用程序是否已知数据库布局?然后,我建议为每个表单独插入一个插入方法,准确接受正确类型所需参数的数量,例如

bool insertIntoTest(int someValue, Integer anotherValue, String andAnotherOne)
{
    Connection conn = JavaConnectDB.ConnectDb();
    OraclePreparedStatement pst
        = (OraclePreparedStatement) conn.prepareStatement(
              "INSERT INTO TEST (someValue, anotherValue) VALUES(?, ?)"
          );
    pst.setInt(1, someValue);
    if(anotherValue == 0)
        pst.setNull(2, Types.INTEGER);
    else
        pst.setInt(2, anotherValue);
    // can handle null already...
    pst.setString(3, andAnotherOne);
    /* ... (execute, try/catch, return) */
}

答案 2 :(得分:0)

那么你应该确切地定义你想做什么。

根据定义

,无法在数据库的autoinkrement字段中输入null

自动增量允许在将新记录插入表格时生成唯一编号。

因此,如果您只想将一些字段插入到您的表中并将自动增量的生成委托给您的数据库,您应该像这样创建您的查询:

插入表值(?,?,?)。

示例:

表员工(身份,时间,姓名)

查询:

INSERT INTO员工(时间,名称)VALUES(?,?)