MySQL INSERT / UPDATE MySQL - perStoredProcedure oder direkt im Code

Pantheos

Mitglied
Hallo zusammen!

Ich möchte ein Objekt "Ressource" in meine Datenbank speichern, einen Eintrag in der Datenbank ändern oder löschen. Dabei möchte ich auch Prüfungen vornehmen, bspw. ob schon ein Datensatz mit gleichem Namen oder gleicher ID vorhanden ist.
Java:
public class Ressource 
{
//ein Ausschnitt des Codes
// Setter / Getter vorhanden
	private int ressourceId;
	private String name;
	private String type;
	private String source;
}
Code:
CREATE TABLE `ressources` (
  `ressource_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `type` varchar(255) DEFAULT NULL,
  `source` varchar(255) DEFAULT NULL
  PRIMARY KEY (`ressource_id`),
  KEY `name_idx` (`name`)
)

Weg1:
Java:
// con sei ein benutzbares DB-Connection Objekt
// ressource sein ein Objekt der Klasse Ressource
CallableStatement cstmt = con.prepareCall(" INSERT INTO ressources SET name = ?, type = ?, source = ?");
cstmt.setString(1, ressource.getName());
cstmt.setString(2, ressource.getType());
cstmt.setString(3, ressource.getSource());
cstmt.execute;

Weg2:
Java:
cstmt = con.prepareCall("call sp_create_ressource(?,?,?,?)");
cstmt.setString(1, repRessource.getName());
cstmt.setString(2, repRessource.getType());
cstmt.setString(3, repRessource.getSource());
cstmt.registerOutParameter(4, Types.VARCHAR);
cstmt.execute();
sp_create_ressource ist eine auf dem MySQL-Server liegende StoredProcedure
Code:
CREATE DEFINER=`workbench`@`localhost` PROCEDURE `sp_create_ressource`(
	IN p_ressource_name VARCHAR(255),
	IN p_type VARCHAR(255),
	IN p_source VARCHAR(255),
	OUT p_result VARCHAR(255)
)
BEGIN
	DECLARE 
		v_ressource_id INT;
	
	SELECT ressource_id FROM ressources WHERE name = p_ressource_name INTO v_ressource_id;

	IF v_ressource_id IS NOT NULL
		THEN SELECT CONCAT("Ressource ", p_ressource_name, " existiert bereits") INTO p_result;
	ELSE 
		BEGIN
			INSERT INTO ressources 
				SET 
					name = p_ressource_name, 
					type = p_type, 
					source = p_source, 
			SELECT CONCAT("Ressource ", p_ressource_name, " wurde erfolgreich angelegt") INTO p_result;
		END;
	END IF;
END

Was sind eurer Meinung nach hier die Vorteile / Nachteil der beiden Wege bezüglich Performance, Sicherheit, Wartbarkeit, Design?

Als kurze Erklärung, ich habe die Datenbank vor dem Javacode entworden und habe die StoredProcedures verwendet um einfacher Testdaten hinzufügen zu können.
Als ich dann ans Coden ging habe ich einfach die bereits vorhandenen SP's genutzt, da in diesen auch diverse Prüfungen drin waren.

Eure Meinung?
 

turtle

Top Contributor
Performance
  • Weg 1 ordentlich
  • Weg 2 excellent
Sicherheit
  • Weg 1 ordentlich
  • Weg 2 excellent
Wartbarkeit
  • Weg 1 excellent
  • Weg 2 ordentlich
Design
  • Weg 1 excellent
  • Weg 2 ordentlich

Wie du dir wahrscheinlich vorstellen kannst, betrachten Java Entwickler store-procedures mit gemischten Gefühlen. Denn auf der einen Seite write-once-run-everywhere während auf der anderen Seite proprietärer DB-Code steht. Daher würde ich Letzteres vermeiden wenn es möglich ist.

Dies gilt umso mehr bei deinem Beispiel wo "nur" ein Datensatz eingefügt wird und dies recht einfach mit einem PreparedStatement gemacht werden kann. Andererseits sind stored-procedures "angenehm", wenn sie mehr mit Business-Logik zu tun haben, beispielsweise Validierungen vornehmen bevor die DB geändert wird.
 
Zuletzt bearbeitet:

Pantheos

Mitglied
Das ist der Punkt @ Validierungen!

Ich wollte kein zu aufwendiges / langes Beispiel einfügen um die grundsätzliche Frage nicht zu kompliziert zu machen. In einem anderen Fall tue ich bspw folgendes: Statt einem direkt Update des Datensatzes ändere ich ein "most_recent" flag von 1 auf 0 und füge die geänderten Informationen als ganz neuen Datensatz ein. Darüber hinaus ist dann die "ID" auch nicht Auto-Increment sondern wird "manuell" vergeben.
Anderes Beispiel: Anstatt einen Datensatz komplett zu löschen, möchte ich nur ein Löschkennzeichen von 0 auf 1 setzen
usw usf
Man könnte hier zwar auch einen "ON UPDATE" Trigger verwenden, aber ich finde, das kommt aufs selbe hinaus - Funktionalität befindet sich in der DB und nicht im Code

Kann ich das so zusammenfassen:
Bei einfachem UPDATE / INSERT sollte die SQL-Anweisung im Javacode geschrieben werden, bei komplexeren Validierungen / Business Logik kann man sie (oder Teile davon) in die DB Auslagern?

Vielen Dank für die Antwort!
Stefan
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T compiler fehler: should be mapped with insert="false" update="false" Datenbankprogrammierung 1
L SQL-Statement INSERT INTO ON DUPLICATE KEY UPDATE funktioniert nicht Datenbankprogrammierung 5
S ID Wert von Insert über jdbcTemplate.update Datenbankprogrammierung 3
M Hibernate: Insert statt Update Datenbankprogrammierung 8
H Batch Update/Insert Datenbankprogrammierung 4
E Insert oder Update- Prüfung Datenbankprogrammierung 3
M Insert Update usw. Datenbankprogrammierung 2
R Update und Insert Gleichzeitig? Datenbankprogrammierung 2
L SQL Datenbank INSERT INTO Datenbankprogrammierung 6
L SQL Datenbank Tabelle insert Datenbankprogrammierung 7
O HOW TO INSERT PRIMARY INTO ANOTHER TABLE AND USE IT AS FOREIGN KEY TO DISPLAY DATA IN A RELATIONSHIP Datenbankprogrammierung 3
G Eine Spalte in xampp als Typ array erstellen - ein array mit "insert" hinzufügen. Datenbankprogrammierung 3
C Problem with INSERT.............ON DUPLICATE KEY Datenbankprogrammierung 3
A MySQL Select und Insert in Java Datenbankprogrammierung 15
S PostgreSQL Bytea INSERT Datenbankprogrammierung 8
W Problem mit Insert in zwei Tabellen Datenbankprogrammierung 8
L INSERT INTO Befehl in Java Datenbankprogrammierung 8
D Insert Methode per Servlet Datenbankprogrammierung 2
D Insert Methode per Servlet Datenbankprogrammierung 0
D SQLite INSERT OR REPLACE INTO macht neuen Eintrag?! Datenbankprogrammierung 2
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
B JPA->fehler beim Insert in die Datenbank Datenbankprogrammierung 3
A Oracle insert Array in DB Datenbankprogrammierung 7
C MySQL JTable in JScrollPane nach insert aktualisieren Datenbankprogrammierung 3
X SQLite Erhalte bei Query INSERT INTO eine NullPointerException Datenbankprogrammierung 10
M JAVA Derby INSERT probleme Datenbankprogrammierung 12
Y MySQL Eclipselink Insert JSF Beispiel gesucht Datenbankprogrammierung 2
T MySQL MySQL - Insert into fügt zwei identische Datensätze ein Datenbankprogrammierung 2
M Derby/JavaDB Derby SQL Insert mit AUTO_INCREMENT, welche ID wurde vergeben? Datenbankprogrammierung 6
D HSQLDB INSERT INTO in einer For Schleife mit selber ID, machbar? Alternative? Datenbankprogrammierung 7
J SQL-Statement Meine insert befehle funktionieren nicht und ich weiß nicht wo der fehler liegt Datenbankprogrammierung 5
M INSERT-Problem = integrity constraint violation: foreign key no parent Datenbankprogrammierung 5
M MySQL Insert über mehrere Tabellen Datenbankprogrammierung 7
V HSQLDB Insert in eine Tabelle mit Autoincrement Datenbankprogrammierung 2
B MS SQL: Insert LOB Datenbankprogrammierung 4
M MySQL INSERT will einfach nicht funktionieren Datenbankprogrammierung 9
H HSQLDB insert .... values("test1",select test2 from foo) Datenbankprogrammierung 2
D JDBC insert mit select abfrage Datenbankprogrammierung 5
R vor/nach INSERT mysql-SETS absetzen Datenbankprogrammierung 2
C insert into mit between-Anweisung Datenbankprogrammierung 10
C Derby/JavaDB INSERT auf FOREIGN KEY schlägt fehl Datenbankprogrammierung 2
F Insert into Access Datenbankprogrammierung 3
S Nochmals: ID ermitteln nach Insert Datenbankprogrammierung 2
O Viele Verbindungen-Exception bei insert Daten zur MySQL-Datenbank Datenbankprogrammierung 2
B SELECT ja - INSERT nein (MySQL) Datenbankprogrammierung 3
E Derby/JavaDB Keine Reaktion von "insert into" im ActionListener Datenbankprogrammierung 22
A Oracle Unbekannter Fehler bei insert Befehl Datenbankprogrammierung 3
T MySQL Db select * und Insert schlagen fehl Datenbankprogrammierung 2
Kenan89 Insert ohne Auswirkung Datenbankprogrammierung 7
B MySQL myBatis INSERT Datenbankprogrammierung 13
E Access Datenbank mit Insert befüllen Datenbankprogrammierung 5
M Datenbankverbindung zu langsam beim Insert? Datenbankprogrammierung 6
S 2 Tabellen zu einer zusammenführen, INSERT INTO Fehler Datenbankprogrammierung 5
L H2 Auto INC Primary Key & Insert Datenbankprogrammierung 8
R Derby/JavaDB Insert Statement Probleme Datenbankprogrammierung 14
F H2:Wie kann man insert eine Reihe "int" wert als blob in table? Datenbankprogrammierung 12
S MySQL INSERT schlägt nicht fehl, fügt aber auch nichts ein Datenbankprogrammierung 13
S Probleme mit INSERT Befehl Datenbankprogrammierung 11
L MySQL Prepared Statement batch langsamer als bulk insert? Datenbankprogrammierung 10
M Insert in Table mit 250 Feldern Datenbankprogrammierung 2
E [ACCESS ODBC] INSERT INTO Fehler Datenbankprogrammierung 4
A Insert Methode Syntaxfehler Datenbankprogrammierung 2
G INSERT DATE in Oracle-DB Datenbankprogrammierung 11
G ODBC Insert und gleich danach Selects Datenbankprogrammierung 8
Iron Monkey Insert into Spalte ID AUTO_INCREMENT Datenbankprogrammierung 7
C ID-Rückgabe bei INSERT Datenbankprogrammierung 5
D mysql insert - performance/robustheit, "best practice" Datenbankprogrammierung 15
C Rückgabe ob INSERT erfolgreich Datenbankprogrammierung 11
K DB2 Insert mit Subselect Fehler Datenbankprogrammierung 2
M Derby insert, ID auslesen Datenbankprogrammierung 3
W Problem bei Insert mit JDBC auf MS-SQL-Server 2005 Datenbankprogrammierung 7
G Frage zum Insert-Statement Datenbankprogrammierung 2
R Probleme mit Insert Datenbankprogrammierung 2
D Problem: Prepared Statement (Insert) funktioniert nicht. Datenbankprogrammierung 3
P Insert into mit zwei Datenbanken Datenbankprogrammierung 3
S Insert mit Select Datenbankprogrammierung 6
G INSERT-STATEMENT Datenbankprogrammierung 6
M insert in 2 tabellen Datenbankprogrammierung 7
J Insert auf Access DB funktioniert nicht Datenbankprogrammierung 5
H Beim insert bekomme ich den Fehler missing select keyword Datenbankprogrammierung 2
V Fehlermeldung beim Insert Datenbankprogrammierung 16
S Insert into , executeupdate oder executequery Datenbankprogrammierung 3
B PrepareStatement "Insert into" fehlermeldung Datenbankprogrammierung 13
D Insert Oracle BLOB Datenbankprogrammierung 1
T ibatis + "generated p-key" nach insert? Datenbankprogrammierung 24
G Herausfinden des Primary Keys nach INSERT-Kommando? Datenbankprogrammierung 4
G INSERT abfragen ob erfolgreich? Datenbankprogrammierung 5
D INSERT String enthält ' wie kann man das Escapen? Datenbankprogrammierung 4
T INSERT-Befehl in Java für Oracle Datenbankprogrammierung 4
Y Hibernate - Datum Insert Datenbankprogrammierung 7
D ODBC Zugriff auf MDB-Datenbank, Insert Into ohne Funktion Datenbankprogrammierung 2
U INSERT INTO von 2 Textfeldern Datenbankprogrammierung 6
D Syntaxfehler in der INSERT INTO Anweisung Datenbankprogrammierung 2
F JAVA & MySQL : INSERT INTO DB ! Datenbankprogrammierung 2
D Problem mit INSERT INTO Datenbankprogrammierung 19
S insert into table Datenbankprogrammierung 8
S Insert in Datenbank Datenbankprogrammierung 15
G Insert-anweisung mehrere Varianten eine geht Datenbankprogrammierung 2
P frage zu "" bei INSERT STATEMENTS Datenbankprogrammierung 2
K frage zum ausführen eines INSERT statements Datenbankprogrammierung 16

Ähnliche Java Themen

Neue Themen


Oben