Java-Forum.org  
Zurück   Java-Forum.org > Java - Programmierung > Datenbankprogrammierung

Datenbankprogrammierung: myBatis INSERT

Fragen zur Anbindung und Programmierung von Datenbanken bzw. Datenbankabfragen

Antwort    
Themen-Optionen Thema durchsuchen Ansicht
Alt 29.12.2011, 12:09   #1
b0312
 
myBatis INSERT - Standard myBatis INSERT

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 Code: Quelltext in neuem Fenster öffnen
  1. ... <!-- Der Rest funktioniert schon (SELECT Befehle) -->
  2.     <insert id="insertVorgangStatus" parameterType="source.db.Vorgang" useGeneratedKeys="true" keyProperty="id">
  3.         INSERT INTO vorgangstatus (auftrag, vorgang, status)
  4.         values (#{auftrag}, #{vorgang}, #{status})
  5.     </insert>


Java Code: Quelltext in neuem Fenster öffnen
  1. public int setVorgangStatus(String kunde, int status) {
  2.         // TODO Vorgangstatus setzen
  3.         for(Vorgang vorgang : listVorgaenge){
  4.             if(vorgang.getKunde().equals(kunde)){
  5.                 count ++;
  6.                 vorgang.setStatus(status);
  7.                 System.out.println(vorgang.getAuftrag());
  8.                 System.out.println(vorgang.getVorgang());
  9.                 System.out.println(vorgang.getStatus());
  10.                 // In der Konsole stehen dann die richtigen Werte
  11.                 updateVorgang = sqlSession(Vorgang.INSERTSTATUS,null);
  12.                 //updateVorgang = sqlSession(Vorgang.INSERTSTATUS,vorgang); auch schon versucht
  13.             }
  14.         }
  15.         return Db.OK;
  16.        
  17.     }
  18.  
  19. //Hier noch die sqlSession
  20.     @SuppressWarnings({ "unused", "finally" }) 
  21.     private Object sqlSession(String statement, Object parameter){
  22.         Object sessioner = null;
  23.         try {
  24.             Reader reader = Resources
  25.                     .getResourceAsReader(CONFIGPATH);
  26.             SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
  27.                     .build(reader);
  28.             SqlSession sqlSession = sqlSessionFactory.openSession();
  29.            
  30.             try {
  31.                 sessionCounter++;
  32.                 if(statement.contains("insert")){
  33.                     sessioner = sqlSession
  34.                             .insert(statement, parameter);
  35.                 }else if(statement.contains("select")){
  36.                     sessioner = sqlSession
  37.                             .selectList(statement, parameter);
  38.                 }else if(statement.contains("update")){
  39.                     sessioner = sqlSession
  40.                             .update(statement, parameter);
  41.                 }
  42.                 } finally {
  43.                 sqlSession.close();
  44.                 return sessioner;
  45.             }
  46.         } catch (FileNotFoundException e) {
  47.             e.printStackTrace();
  48.             return null;
  49.         } catch (IOException e) {
  50.             e.printStackTrace();
  51.             return null;
  52.         }      
  53.     }

Es kommt dann auch das richtige SQL-Statement dort steht dann:
SQL Code: Quelltext in neuem Fenster öffnen
  1. "INSERT INTO vorgangstatus (auftrag, vorgang, status)
  2.         values (null,null,null);
nur eben null .. statt meinen Werten.
 
Alt 29.12.2011, 12:14   #2
turtle
 
myBatis INSERT - Standard AW: myBatis INSERT

Kannst Du bitte auch den Code für source.db.Vorgang posten?
 
Alt 29.12.2011, 12:18   #3
b0312
Themenstarter
 
myBatis INSERT - Standard AW: myBatis INSERT

klar...

Java Code: Quelltext in neuem Fenster öffnen
  1. //SQL Abfrage
  2.     public final static String SELECTALL        = "Vorgang.selectVorgaenge";
  3.     public final static String SELECTCOUNT      = "Vorgang.selectCountVorgang";
  4.     public final static String INSERTSTATUS     = "Vorgang.insertVorgangStatus";
  5.     public final static String UPDATESTATUS     = "Vorgang.updateVorgangStatus";
  6.    
  7.     //Variablen
  8.     private String kunde;
  9.     private String auftrag;
  10.     private String vorgang;
  11.     private int status;
  12.    
  13.     private static MyBatis db;
  14.     public static int setStatus;
  15.    
  16.     /**
  17.      * Declaration of Vorgang
  18.      */
  19.     static {
  20.         db = new MyBatis();
  21.     }
  22.  
  23.     /**
  24.      *
  25.      * @return Kunde from DB
  26.      */
  27.     public String getKunde() {
  28.         return kunde;
  29.     }
  30.  
  31.     /**
  32.      *
  33.      * @return Auftragsnummer from DB
  34.      */
  35.     public String getAuftrag() {
  36.         return auftrag;
  37.     }
  38.  
  39.     /**
  40.      *
  41.      * @return Vorgangsnummer from DB
  42.      */
  43.  
  44.     public String getVorgang() {
  45.         return vorgang;
  46.     }
  47. ...
  48.     public int setVorgangStatus(String kunde, int status) {
  49.         //TODO Vorgänge als freigegeben markieren
  50.         return db.setVorgangStatus(kunde,status);      
  51.     }
  52.  
  53.     public int getStatus() {
  54.         // TODO Auto-generated method stub
  55.         return status;
  56.     }
  57.     public void setStatus(int status){
  58.         this.status = status;
  59.     }
 
Alt 29.12.2011, 12:32   #4
turtle
 
myBatis INSERT - Standard AW: myBatis INSERT

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?
 
Alt 29.12.2011, 12:40   #5
b0312
Themenstarter
 
myBatis INSERT - Standard AW: myBatis INSERT

Zitat: turtle
Beitrag anzeigen
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 Code: Quelltext in neuem Fenster öffnen
  1. getAuftrag(); getVorgang; getStatus(), setStatus();
?
- Hab nie mit BeanKlassen gearbeitet. Wozu die dienen weiß ich auch nicht so genau.
- parametertype ?

Zitat: turtle
Beitrag anzeigen
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.
 
Alt 29.12.2011, 13:08   #6
turtle
 
myBatis INSERT - Standard AW: myBatis INSERT

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 Code: Quelltext in neuem Fenster öffnen
  1. <insert id="insertVorgangStatus" parameterType="DeineNeueKlasseMitAllenGetterSetter">
  2.         INSERT INTO vorgangstatus (auftrag, vorgang, status)
  3.         values (#{auftrag}, #{vorgang}, #{status})
  4.     </insert>
anpassen

Funzt eigentlich ein Insert über ein DB-Tool wie zum Beispiel Squirrel?
 
Alt 29.12.2011, 13:28   #7
b0312
Themenstarter
 
myBatis INSERT - Standard AW: myBatis INSERT

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 Code: Quelltext in neuem Fenster öffnen
  1. updateVorgang = sqlSession(Vorgang.INSERTSTATUS,vorgang);

und bekomme dann bei

Java Code: Quelltext in neuem Fenster öffnen
  1. 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 ?
 
Alt 29.12.2011, 15:00   #8
turtle
 
myBatis INSERT - Standard AW: myBatis INSERT

Zitat:
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?
 
Alt 30.12.2011, 12:10   #9
turtle
 
myBatis INSERT - Standard AW: myBatis INSERT

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 Code: Quelltext in neuem Fenster öffnen
  1. int insert = session.insert("insertVorgangStatus", newAuftrag);
  2. 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 Code: Quelltext in neuem Fenster öffnen
  1. SqlSession openSession(boolean autoCommit);
 
Alt 11.01.2012, 06:24   #10
b0312
Themenstarter
 
myBatis INSERT - Standard AW: myBatis INSERT

Hallo turtle,
ein frohes neues!

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

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

Zurück   Java-Forum.org > Java - Programmierung > Datenbankprogrammierung

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen: myBatis INSERT
(iBatis) setzen des Temporären Tabellennamen in MyBatis/iBatis?
setzen des Temporären Tabellennamen in MyBatis/iBatis?: Hallo, ich hoffe, mir kann einer von euch hier...
myBatis und komplexe Abfragen
myBatis und komplexe Abfragen: Hallo ich bin es mal wieder Meine Frage...
MyBatis - Update Problem
MyBatis - Update Problem: Hallo, ich hoff, hier kann mir jemand helfen:...




Sie betrachten gerade myBatis INSERT