Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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将setNull的空值插入MySql数据库?_Java_Mysql_Jdbc - Fatal编程技术网

无法在运行中使用Java将setNull的空值插入MySql数据库?

无法在运行中使用Java将setNull的空值插入MySql数据库?,java,mysql,jdbc,Java,Mysql,Jdbc,我想根据我得到的类型在运行时设置空值 这是我的密码 在这个回答中,我将稍微挑战你的问题。我不认为你需要做你正在做的事情,但因为有点不清楚,我会尽我所能帮助你 首先,根据变量名pstmt,我猜这是一个PreparedStatement,看起来像这样: INSERT INTO my_table (my_int, my_date, my_varchar, my_bool) VALUES (?, ?, ?, ?); 如果是这种情况,那么您根本不需要进行任何反射,因为参数1始终是整数,参数2始终是日期等

我想根据我得到的类型在运行时设置空值

这是我的密码


在这个回答中,我将稍微挑战你的问题。我不认为你需要做你正在做的事情,但因为有点不清楚,我会尽我所能帮助你

首先,根据变量名pstmt,我猜这是一个PreparedStatement,看起来像这样:

INSERT INTO my_table (my_int, my_date, my_varchar, my_bool) VALUES (?, ?, ?, ?);
如果是这种情况,那么您根本不需要进行任何反射,因为参数1始终是整数,参数2始终是日期等等。所以您知道在setNull中使用什么类型,因为您已经知道位置,因为您必须知道,因为它是setNull的第一个参数,并且您知道该语句。如果只做一些显而易见的事情并设置值,那么遵循代码通常会容易得多

if (myInt != null) {
    pstmt.setInt(1, myInt);
} else {
    pstmt.setNull(1, Types.INTEGER);
}
pstmt.setDate(2, myDate);  // already handles null
// and so on
现在,如果出于某种原因试图在循环中设置列,这可能会变得有点棘手。我建议你,这是一个坏主意,因为未来的开发者不太清楚你在做什么

然而,JDBCAPI为这种情况提供了setObject。setObject将允许null值,因此您不必分别处理null和NOTNULL情况。甚至有一个版本的setObject允许您在不指定类型的情况下执行此操作。在这种情况下,它只是:

for (int i = 0; i < myObjects.size(); ++i) {
    Object obj = myObjects.get(i);
    pstmt.setObject(i, obj);
}
没有铸造,没有记住类型,没有反思需要。上面说并不是每个数据库都支持它,但在你进行反射之前,我想尝试一下

现在回答你的问题 如果出于某种原因,您需要使用反射来实现这一点,因为您是少数几个数据库不支持非类型null的不幸者之一,那么您实际上已经非常接近了

public void apply(PreparedStatement pstmt, int param, String typeName, Object value) {
    try {
        Class<?> types = Types.class;
        Field field = types.getField(typeName);
        int typeValue = field.getInt(null);

        pstmt.setObject(param, obj, typeValue);
    } catch (Exception e) {
        // handle exceptions
    }
}

那么这里和你尝试的有什么不同?首先,字段名没有名称。在它前面。这不是字段名的一部分。其次,这里的typeName参数必须与java.sql.Types字段名完全匹配。这是区分大小写的字符串。例如,它是INTEGER而不是int。在注释中,您指出st.getType方法有一个ArrayList。我假设此方法根据其查询知识返回单个字符串。只需确保您的类型名称与java.sql.Types使用的名称相同,并且所讨论的对象实际上可以用作转换/转换为该类型。

使用Integer而不是int。int只能为0,而Integer也可以为null确定这不是问题所在。假设我想在coderun上插入for BigInt,即不手动设置为java.sql.Types.BigInt。怎么做?什么是圣?它在哪里声明,如何初始化?@IanMcLaird我有一个类Stateros。它的对象是st,而st.getType会告诉我它是varchar或Date或Integer..你想做什么?什么是圣,为什么是反射魔法?很酷的解释。谢谢:
public void apply(PreparedStatement pstmt, int param, String typeName, Object value) {
    try {
        Class<?> types = Types.class;
        Field field = types.getField(typeName);
        int typeValue = field.getInt(null);

        pstmt.setObject(param, obj, typeValue);
    } catch (Exception e) {
        // handle exceptions
    }
}