InsertAndGeneratedKey.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.utils.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import org.openspcoop2.utils.TipiDatabase;
import org.openspcoop2.utils.sql.ISQLQueryObject;
/**
* Utiity che consente di effettuare una INSERT e recuperare l'id generato
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class InsertAndGeneratedKey {
public static long insertAndReturnGeneratedKey(Connection con,TipiDatabase tipoDatabase,IKeyGeneratorObject object,
InsertAndGeneratedKeyObject ... objects) throws KeyGeneratorException{
PreparedStatement stmt = null;
try{
// KeyGenerator
IKeyGenerator keyGenerator = KeyGeneratorFactory.createKeyGeneratorFactory(tipoDatabase.getNome(), con, object);
// Query di insert
ISQLQueryObject sqlQueryObject = org.openspcoop2.utils.sql.SQLObjectFactory.createSQLQueryObject(tipoDatabase.getNome());
sqlQueryObject.addInsertTable(object.getTable());
if(objects==null){
throw new Exception("Objects for insert is null");
}
if(objects.length<=0){
throw new Exception("Objects for insert is empty");
}
for (int i = 0; i < objects.length; i++) {
sqlQueryObject.addInsertField(objects[i].getName(), "?");
}
if(keyGenerator.isReturnGeneratedKeySupported()==false){
sqlQueryObject.addInsertField(keyGenerator.getColunmKeyName(), "?");
}
String insertString = sqlQueryObject.createSQLInsert();
// Eseguo Prepared Statement
if(keyGenerator.isReturnGeneratedKeySupported()){
stmt = con.prepareStatement(insertString,Statement.RETURN_GENERATED_KEYS);
}else{
stmt = con.prepareStatement(insertString);
}
int i = 0;
int indexJDBC = 1;
for ( ; i < objects.length; i++, indexJDBC++) {
switch (objects[i].getJdbcType()) {
case TIMESTAMP:
Timestamp t = null;
if(objects[i].getValue()!=null){
if(objects[i].getValue() instanceof Timestamp){
t = (Timestamp) objects[i].getValue();
}else if(objects[i].getValue() instanceof Date){
t = new Timestamp( ((Date) objects[i].getValue()).getTime());
}else if(objects[i].getValue() instanceof java.sql.Date){
t = new Timestamp( ((Date) objects[i].getValue()).getTime());
}else if(objects[i].getValue() instanceof Calendar){
t = new Timestamp( ((Calendar) objects[i].getValue()).getTime().getTime());
}
}
stmt.setTimestamp(indexJDBC, t);
break;
case INT:
Integer num = null;
if(objects[i].getValue()!=null){
if(objects[i].getValue() instanceof Integer){
num = (Integer) objects[i].getValue();
}else if(objects[i].getValue() instanceof Long){
num = ((Long) objects[i].getValue()).intValue();
}else if(objects[i].getValue() instanceof Float){
num = ((Float) objects[i].getValue()).intValue();
}else if(objects[i].getValue() instanceof Double){
num = ((Double) objects[i].getValue()).intValue();
}
}
if(num!=null) {
stmt.setInt(indexJDBC, num);
}
else {
stmt.setNull(indexJDBC, java.sql.Types.INTEGER);
}
break;
case LONG:
Long numLong = null;
if(objects[i].getValue()!=null){
if(objects[i].getValue() instanceof Long){
numLong = (Long) objects[i].getValue();
}else if(objects[i].getValue() instanceof Integer){
numLong = ((Integer) objects[i].getValue()).longValue();
}else if(objects[i].getValue() instanceof Float){
numLong = ((Float) objects[i].getValue()).longValue();
}else if(objects[i].getValue() instanceof Double){
numLong = ((Double) objects[i].getValue()).longValue();
}
}
if(numLong!=null) {
stmt.setLong(indexJDBC,numLong);
}
else {
stmt.setNull(indexJDBC, java.sql.Types.BIGINT);
}
break;
case STRING:
String s = null;
if(objects[i].getValue()!=null){
s = (String) objects[i].getValue();
}
JDBCUtilities.setSQLStringValue(stmt,indexJDBC,s);
break;
default:
throw new Exception("JDBC Type non supportato: "+objects[i].getJdbcType());
}
}
if(keyGenerator.isReturnGeneratedKeySupported()==false){
stmt.setLong(indexJDBC, keyGenerator.generateKey());
}
stmt.executeUpdate();
// Ritorno id generato
return keyGenerator.getReturnGeneratedKey(stmt);
}catch(Exception e){
throw new KeyGeneratorException ("insertAndReturnGeneratedKey failed: "+e.getMessage(),e);
}finally{
try{
if(stmt!=null)
stmt.close();
}catch(Exception eClose){
// close
}
}
}
}