Я пытаюсь выяснить, возможно ли использовать одну и ту же функцию вставки каждый раз с новыми различными параметрами в 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, пожалуйста?
Да, вы можете сделать это почти так же, как и с php, как прокомментировал @lexicore, общий шаблон для параметризованных SQL-запросов в Java — использовать 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();
}
Я написал это около года назад, но я думаю, это то, что вы ищете.
Я верю, что вы хотите изменить List<Object
и используйте оператор switch с instanceOf
проанализировать это.
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
зная, что я знаю сейчас, я бы выбрал последнее.