MySQL myBatis INSERT

b0312

Mitglied
Hallo Community!

Ich bin gerade dabei einen SQL INSERT Befehl per myBatis durchzuführen, noch erfolglos.
Ich komme einfach nicht auf den Fehler, die Übergabewerte bleiben leer (NULL).

[XML]
... <!-- Der Rest funktioniert schon (SELECT Befehle) -->
<insert id="insertVorgangStatus" parameterType="source.db.Vorgang" useGeneratedKeys="true" keyProperty="id">
INSERT INTO vorgangstatus (auftrag, vorgang, status)
values (#{auftrag}, #{vorgang}, #{status})
</insert>
[/XML]


Java:
public int setVorgangStatus(String kunde, int status) {
		// TODO Vorgangstatus setzen
		for(Vorgang vorgang : listVorgaenge){
			if(vorgang.getKunde().equals(kunde)){
				count ++;
				vorgang.setStatus(status);
				System.out.println(vorgang.getAuftrag());
				System.out.println(vorgang.getVorgang());
				System.out.println(vorgang.getStatus());
				// In der Konsole stehen dann die richtigen Werte
				updateVorgang = sqlSession(Vorgang.INSERTSTATUS,null);
				//updateVorgang = sqlSession(Vorgang.INSERTSTATUS,vorgang); auch schon versucht
			}
		}
		return Db.OK;
		
	}

//Hier noch die sqlSession
	@SuppressWarnings({ "unused", "finally" })	
	private Object sqlSession(String statement, Object parameter){
		Object sessioner = null;
		try {
			Reader reader = Resources
					.getResourceAsReader(CONFIGPATH);
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
					.build(reader);
			SqlSession sqlSession = sqlSessionFactory.openSession();
			
			try {
				sessionCounter++;
				if(statement.contains("insert")){
					sessioner = sqlSession
							.insert(statement, parameter);
				}else if(statement.contains("select")){
					sessioner = sqlSession
							.selectList(statement, parameter);
				}else if(statement.contains("update")){
					sessioner = sqlSession
							.update(statement, parameter);
				}
				} finally {
				sqlSession.close();
				return sessioner;
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return null;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}		
	}

Es kommt dann auch das richtige SQL-Statement dort steht dann:
SQL:
"INSERT INTO vorgangstatus (auftrag, vorgang, status)
		values (null,null,null);
nur eben null .. statt meinen Werten.
 

b0312

Mitglied
klar...

Java:
//SQL Abfrage
	public final static String SELECTALL 		= "Vorgang.selectVorgaenge";
	public final static String SELECTCOUNT 		= "Vorgang.selectCountVorgang";
	public final static String INSERTSTATUS		= "Vorgang.insertVorgangStatus";
	public final static String UPDATESTATUS		= "Vorgang.updateVorgangStatus";
	
	//Variablen
	private String kunde;
	private String auftrag;
	private String vorgang;
	private int status;
	
	private static MyBatis db;
	public static int setStatus;
	
	/**
	 * Declaration of Vorgang
	 */
	static {
		db = new MyBatis();
	}

	/**
	 * 
	 * @return Kunde from DB
	 */
	public String getKunde() {
		return kunde;
	}

	/**
	 * 
	 * @return Auftragsnummer from DB
	 */
	public String getAuftrag() {
		return auftrag;
	}

	/**
	 * 
	 * @return Vorgangsnummer from DB
	 */

	public String getVorgang() {
		return vorgang;
	}
...
	public int setVorgangStatus(String kunde, int status) {
		//TODO Vorgänge als freigegeben markieren
		return db.setVorgangStatus(kunde,status);		
	}

	public int getStatus() {
		// TODO Auto-generated method stub
		return status;
	}
	public void setStatus(int status){
		this.status = status;
	}
 

turtle

Top Contributor
Ich sehe auch nicht so ohne Weiteres wo das Problem liegt :-(

Ich würde an Deiner Stelle versuchen das Problem einzugrenzen.

Mir fällt auf, dass Du NICHT für die Attribute #{auftrag}, #{vorgang}, #{status} entsprechende getter/setter-Methoden hast. Das würde ich in einer eigenen Bean-Klasse mal probieren und parametertype ändern.

Danach würde ich mal useGeneratedKeys="true" keyProperty="id" aus dem Statement rausnehmen. Und welche Spalte(n) ist/sind in Tabelle vorgangstatus denn primary key?
 
Zuletzt bearbeitet:

b0312

Mitglied
Ich sehe auch nicht so ohne Weiteres wo das Problem liegt :-(

Ich würde an Deiner Stelle versuchen das Problem einzugrenzen.

Mir fällt auf, dass Du NICHT für die Attribute #{auftrag}, #{vorgang}, #{status} entsprechende getter/setter-Methoden hast. Das würde ich in einer eigenen Bean-Klasse mal probieren und parametertype ändern.
- Sind das nicht bereits
Java:
 getAuftrag(); getVorgang; getStatus(), setStatus();
?
- Hab nie mit BeanKlassen gearbeitet. Wozu die dienen weiß ich auch nicht so genau. :oops:
- parametertype ? ???:L

Danach würde ich mal useGeneratedKeys="true" keyProperty="id" aus dem Statement rausnehmen. Und welche Spalte(n) ist/sind in Tabelle vorgangstatus denn primary key?
- Hab ich schon mal draussen gehabt
- Hatte zuerst Auftrag & Vorgang als Primärschlüssel
- Habe jetzt eine eigene Spalte ID als Primärschlüssel mit AUTO INCREMENT definiert.
 

turtle

Top Contributor
Ich meine es fehlen
setAuftrag und setVorgang.Ob diese überhaupt wichtig sind, kann ich echt derzeit nicht sagen.

Deine Klasse ist eine Bean-Klasse, weil sie einen paramterlosen Konstruktor und für alle Attribute entsprechende getter/setter-Methoden hat. Dieses wird häufig auch als POJO (plain-old-java-object) bezeichnet.

In Deiner XML-Datei solltest Du
[XML]<insert id="insertVorgangStatus" parameterType="DeineNeueKlasseMitAllenGetterSetter">
INSERT INTO vorgangstatus (auftrag, vorgang, status)
values (#{auftrag}, #{vorgang}, #{status})
</insert>[/XML]
anpassen

Funzt eigentlich ein Insert über ein DB-Tool wie zum Beispiel Squirrel?
 
Zuletzt bearbeitet:

b0312

Mitglied
setAuftrag und setVorgang sind nicht notwendig, ich habe ein System.out.println() ausgeführt vorm INSERT und es sind bereits die richtigen Werte drinnen.

Habe mal den vorgang als parameter mitübergeben

Java:
updateVorgang = sqlSession(Vorgang.INSERTSTATUS,vorgang);

und bekomme dann bei

Java:
sessioner = sqlSession.insert(statement, parameter);

sessioner einen Integer Wert = 1 zurück. Etwas gegoogelt, anscheinend soll dieser Wert die Anzahl der erstellten Zeilen sein o_O . Im phpmyadmin nachgesehen, aber keinen Datensatz gefunden, in den Rechten habe ich auch auf "ALL PRIVILEGES" geschaltet.

habe das gleiche durchgeführt mit einer neuen Bean-Klasse "VorgangStatus" mit allen gettern und settern und bekomme da ebenfalls bei sessioner den Wert 1 zurück.

EDIT: Nach langem debuggen durch den myBatis Code, habe ich den fertigen SQL-String gefunden, der passt sogar, hat die richtigen Werte jetzt, lediglich tut sich trotzdem nichts in der DB ... kann es etwas mit der ID auf sich haben ? ???:L
 
Zuletzt bearbeitet:

turtle

Top Contributor
lediglich tut sich trotzdem nichts in der DB ... kann es etwas mit der ID auf sich haben ?

Leider kenne ich mit mySQL nicht gut aus, insbesondere weiss ich nicht wie mySQL sich mit AutoIncrement-Spalten verhält.

Siehst Du Debug-Ausgaben, weil Du log4j und eine entsprechende log4j.properties Datei im Classpath hast?

Meine log4j.properties sieht so aus:
Code:
log4j.rootLogger=debug, stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout

Führe das ganze Statement doch mal mit einer Tabelle durch, die die gleiche Struktur hat aber OHNE ID-Spalte. Du solltest dabei das Statement im Log sehen und dabei sollten auch die Parameter angezeigt werden. Und natürlich sollte die Zeile danach in der DB stehen.

Was verhält sich denn ein "normaler" DB-Client (Squirrel) mit dem Insert-Befehl?
 

turtle

Top Contributor
Ich habe das Problem bei mir nachvollziehen können!

Ich habe mir mySQL installiert und eine kleine Tabelle kreiert. Ich sehe beim Ausführen, dass die Parameter benutzt werden und auch bei mir sind die Werte NICHT in der DB sichtbar!

Das liegt daran, dass Du die Änderungen mit einem commit() abschliessen musst!
Java:
int insert = session.insert("insertVorgangStatus", newAuftrag);
session.commit();
Anscheinend arbeitet mySQL NICHT automatisch mit auto_commit=true (innoDB is transactional and autocommit is also off by default), sondern erwartet das sich der Client drum kümmert.

In myBATIS kannst Du dies unter anderem dadurch erreichen, dass Du eine Session mit autoCommit true öffnest, dann kannst Du Dir das abschliessende Commit() sparen. Hängt natürlich von Deinen transaktionalen Anforderungen ab:
Java:
SqlSession openSession(boolean autoCommit);
 
Zuletzt bearbeitet:

b0312

Mitglied
Hallo turtle,
ein frohes neues!

Ich war auf Urlaub und hab mir mal eine Pause gegönnt :toll: .
Nun gehts mit frischer Kraft wieder weiter.

Vielen Dank für den Hinweis, hab ich probiert, funktioniert Prima!
 

b0312

Mitglied
Nach längerer Zeit, hätte ich wieder eine Frage zu myBatis INSERT, da ich in der Dokumentation nichts gefunden habe.:

Gibt es eine möglichkeit in myBatis einen INSERT-Befehl durchzuführen und als Rückgabewert dieser Session die ID (Auto Increment) zu bekommen? Sozusagen eine Kombination von INSERT & SELECT.

Ich weiß es würde mit 2 extra Befehlen gehen, Insert ausführen und dannach ein Select, aber wir möchten doch effektiv sein :toll:

greeTz* b0312
 

turtle

Top Contributor
Es wundert mich, dass Du nichts in der Doku gefunden hast, denn bei mir steht da was zu drin ;)

Danach kann dies beim insert angegeben werden:
Java:
<insert id="insertBefehl" keyProperty="property" useGeneratedKeys="true" />
  • keyProperty: Identifies a property into which MyBatis will set the key value returned by getGeneratedKeys,or by a selectKey child elment of the insert statement
  • useGeneratedKeys: This tells MyBatis to use the JDBCgetGeneratedKeys method to retrieve keys generated internally by the database (e.g. autoincrementfields in RDBMS like MySQL or SQLServer)
Da sollte eigentlich nach einem Insert der Key in der angegebenen Property stehen.

Wenn das nicht klappt, solltest Du mal in der Doku nach selectkey schauen. Dieses Konstrukt kann man anwenden, wenn zum Beispiel der JDBC-Treiber keine generatedKeys liefern kann.

PS: Habe es jetzt auch probieren können und es funzt bei mir. Es muss, wie in der Doku geschrieben, auch in der Konfiguration useGeneratedKeys eingeschaltet sein:
[XML]<configuration>
<properties...
<settings>
<setting name="useGeneratedKeys" value="true" />
</settings>
<environments...[/XML]
 
Zuletzt bearbeitet:

b0312

Mitglied
Wenn ich dich richtig verstehe, dann meinst du das myBatis das generieren von IDs übernimmt.

Dann wirst du mich falsch verstanden haben.
Ich meinte das ich nach dem INSERT Befehl in meinem Quellcode die ID bekomme.

Java:
//Pseudocodemäßig - in etwa so
Auftrag auftrag2 = (Auftrag) sqlSession("insertNew", auftrag); //sqlSession gibt die ID zurück
auftrag.setId(auftrag2.getId()); // ID meinem Auftrag zuweisen und dann weiterverarbeiten
 

turtle

Top Contributor
Nein, ich habe Dich nicht falsch verstanden...;)

Mein Test läuft unter Derby und da habe ich folgende Tabelle erstellt
SQL:
CREATE TABLE GROUPS
(GROUP_ID SMALLINT NOT NULL GENERATED ALWAYS AS IDENTITY 
(START WITH 5, INCREMENT BY 5), ADDRESS VARCHAR(100), PHONE VARCHAR(15))
Du erkennst das die Spalte Group_id von Derby auto inkrementiert und automatisch erzeugt wird.
Mein simpler Java-Test dazu
Java:
        Reader reader = Resources.getResourceAsReader("database/conf.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(reader);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        try {
        	Group grp = new Group("Turtle", "11");
            sqlSession.insert("Group.insertGroup", grp );
            System.out.println("ID:"+grp.getId());
           
        } finally {
            sqlSession.close();
        }
Da siehst Du, dass die von Derby generierte ID in der Property id abgelegt und abgefragt werden kann.
Zur Vollständigkeit noch mein SQL-Statement
[XML] <insert id="insertGroup" keyProperty="id" useGeneratedKeys="true" parameterType="Group">
insert into GROUPS(ADDRESS, PHONE) VALUES (#{name}, #{telephone})
</insert>[/XML]

Der insert-Befehl gibt die Anzahl der eingefügten Rows zurück, also üblicherweise 1.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
L Mybatis Datenbankabfragen in Java Datenbankprogrammierung 1
F myBatis und komplexe Abfragen Datenbankprogrammierung 3
J MyBatis - Update Problem Datenbankprogrammierung 4
T compiler fehler: should be mapped with insert="false" update="false" Datenbankprogrammierung 1
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
L SQL-Statement INSERT INTO ON DUPLICATE KEY UPDATE funktioniert nicht Datenbankprogrammierung 5
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
P MySQL INSERT / UPDATE MySQL - perStoredProcedure oder direkt im Code Datenbankprogrammierung 3
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
S ID Wert von Insert über jdbcTemplate.update Datenbankprogrammierung 3
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
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
M Hibernate: Insert statt Update Datenbankprogrammierung 8
C Rückgabe ob INSERT erfolgreich Datenbankprogrammierung 11
H Batch Update/Insert Datenbankprogrammierung 4
E Insert oder Update- Prüfung Datenbankprogrammierung 3
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
M Insert Update usw. Datenbankprogrammierung 2
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

Ähnliche Java Themen

Neue Themen


Oben