无法在运行中使用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
}
}