Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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
在JavaJDBC中将数据插入到许多列中_Java_Jdbc_Insert_Hashmap - Fatal编程技术网

在JavaJDBC中将数据插入到许多列中

在JavaJDBC中将数据插入到许多列中,java,jdbc,insert,hashmap,Java,Jdbc,Insert,Hashmap,我有一个50列的表,我想将HashMap变量中的所有项插入其中(HashMap键和表列名相同)。 我怎么能不写50行代码就做到这一点呢 获取HashMap的密钥集。迭代该键集以生成包含insert语句的字符串。使用结果字符串创建PreparedStatement。然后再次迭代该键集,使用从HashMap检索的对象按名称设置参数 如果您的任何值属于JDBC驱动程序不确定如何映射的类,那么您可能需要额外编写几行特殊情况代码。我建议您不闻不问,只需编写一个包含50行参数设置代码的方法就可以了。这并不坏

我有一个50列的表,我想将
HashMap
变量中的所有项插入其中(
HashMap
键和表列名相同)。

我怎么能不写50行代码就做到这一点呢

获取HashMap的密钥集。迭代该键集以生成包含insert语句的字符串。使用结果字符串创建PreparedStatement。然后再次迭代该键集,使用从HashMap检索的对象按名称设置参数


如果您的任何值属于JDBC驱动程序不确定如何映射的类,那么您可能需要额外编写几行特殊情况代码。

我建议您不闻不问,只需编写一个包含50行参数设置代码的方法就可以了。这并不坏,你只需要写一次。我希望你没有那么懒;-)

顺便问一下,表中的50列不是有点多吗?也许规范化过程可以帮助您降低数据库和操作它的代码的复杂性

另一种方法是使用类似ORM的方法,或者使用类似ORM的更轻量级的方法

  • 调用
    map.keySet()
    获取所有列的名称
  • 通过迭代密钥集创建INSERT语句。
    • 该列来自键集中的项(键)
    • 数据来自
      map.get(key)

  • 有几件事对我来说似乎有点不对劲:1。在HashMap中,键没有任何排序方式,因此您不知道将首先获得哪个键;PreparedStatement只允许您根据索引值设置其参数;2.列名没有关于其类型的附加元信息,因此我不确定是否为每个参数调用
    setObject
    。在HashMap的键集中迭代总是按一个顺序吗?我的意思是,如果我得到SQL insert代码的create列部分,那么这些值的顺序是相同的?+1到darioo。。在这两方面你都是绝对正确的。我要做的更改是使用键集实例化ArrayList,然后使用它来构建PreparedStatement的sql字符串,然后按索引设置参数。@darioo:1)可以通过基于它构造一个
    LinkedHashMap
    来抑制
    HashMap
    的无序性质。2) 如果使用适当的值类型,例如
    String
    Integer
    Date
    等,则调用
    setObject()
    肯定会起作用。JDBC驱动程序将进行类型检查。@BalusC:感谢您清除这些。尽管我觉得使用这种方法不太安全,因为您的意图在代码方面没有清楚地表达出来,如果不够小心的话,这可能会导致将来很难找到bug。