【问题标题】:Is it possible to insert records to MySQL with different parameter (keys & values) each time using the same insert function in Java?是否可以每次使用 Java 中的相同插入函数将具有不同参数(键和值)的记录插入 MySQL?
【发布时间】:2017-09-01 23:50:52
【问题描述】:

我试图找出是否可以在 java 8 和 MySQL 中每次都使用相同的插入函数和新的不同参数。我知道这在 PHP 中是可能的,因为我有下面的 PHP 代码:

这是数组记录:

$Customer_details=[
             'firstname' => $Firstname,
             'lastname'=> $lastname,
             'phone'  => $phone,
             'email'  => $email,
             'password'=> $hash

  ];

创建类对象 $object2 后,这是记录:

$object2->insert($pdo,'customer',$Customer_details);

以下代码为PHP插入函数代码:

function insert( $pdo, $table, $record) {
$keys = array_keys( $record);
$values = implode( ', ' , $keys);
$valuesWithColon = implode( ', :' , $keys);
$query = 'INSERT INTO '  . $table . ' ('  . $values . ') VALUES (:'  . 
$valuesWithColon . ')' ;
$stmt = $pdo->prepare( $query);
$stmt->execute( $record);
return $stmt;
}

谁能给我看一个java中相同的例子吗?

【问题讨论】:

标签: java php mysql function multiple-records


【解决方案1】:

是的,你可以用 php 实现它的方式来实现它,正如@lexicore 评论的那样,Java 中参数化 sql 查询的常见模式是使用PreparedStatements

这是一个示例..您只需将该示例中的代码包装在一个函数中,使其像您的 php 示例一样可重用.. https://alvinalexander.com/java/java-mysql-insert-example-preparedstatement

public void insert(String fname, String lname, Date created, boolean isAdmin, int points) {
    String myDriver = "org.gjt.mm.mysql.Driver";
    String myUrl = "jdbc:mysql://localhost/test";
    Class.forName(myDriver);
    Connection conn = DriverManager.getConnection(myUrl, "root", "");

    // create a sql date object so we can use it in our INSERT statement
    Calendar calendar = Calendar.getInstance();
    java.sql.Date startDate = new java.sql.Date(calendar.getTime().getTime());

    // the mysql insert statement
    String query = " insert into users (first_name, last_name, date_created, is_admin, num_points)"
      + " values (?, ?, ?, ?, ?)";

    // create the mysql insert preparedstatement
    PreparedStatement preparedStmt = conn.prepareStatement(query);
    preparedStmt.setString (1, fname);
    preparedStmt.setString (2, lname);
    preparedStmt.setDate   (3, created);
    preparedStmt.setBoolean(4, isAdmin);
    preparedStmt.setInt    (5, points);

    // execute the preparedstatement
    preparedStmt.execute();

    conn.close();
}

【讨论】:

  • 感谢您的回答。在您的示例中,他们正在使用此代码 String query = " insert into users (first_name, last_name, date_created, is_admin, num_points)" + " values (?, ?, ?, ?, ?)"; 。如果只是注意到,他们正在使用我不想要的固定键。我正在寻找一种每次都可以更改密钥的方法。
  • 你只需要用变量替换那些固定的字符串,我已经用代码 sn-p 更新了我的答案!
  • 这将限制键和值的数量,这意味着我不能向同一个函数发送不同数量的键和值。因此,我需要为每个更新语句创建一个新函数。 @斯蒂芬
  • 你明白我的问题了吗?
  • 啊,好吧,我明白你的意思了,你需要做的是传递一个像HashMap这样的Map作为参数而不是固定参数。 HashMap 包含键值对,您可以迭代此映射以构建查询。这就是您迭代映射的方式:for (Map.Entry<String, Object> entry : map.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); // ... }
【解决方案2】:

大约一年前我写了这篇文章,但我认为这就是你要找的。​​p>

我相信您想将Values 更改为List<Object 并使用带有instanceOf 的switch 语句来解析它。

private String insert(String tableName, List<String> columns, List<String> values){
    StringBuilder stringBuilder = new StringBuilder("INSERT INTO " + tableName + " (");
    for(String column :columns){
        stringBuilder.append(column + ",");
    }
    stringBuilder.deleteCharAt(stringBuilder.lastIndexOf(","));
    stringBuilder.append(") VALUES (");
    for(String value : values){
        stringBuilder.append(value + ",");
    }
    stringBuilder.deleteCharAt(stringBuilder.lastIndexOf(","));
    stringBuilder.append(")");
    return stringBuilder.toString();
}

如前所述,使用它并进行第二个循环:

for(int z =0; z < columns.size(); z++){
    stringBuilder.append("?,");
}

要与PreparedStatements一起使用,知道我现在知道什么,我会选择后者。

【讨论】:

    猜你喜欢
    • 2013-06-10
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多