Unknown column in where clause

Wenn man in seinem SQL-Statement seine Attributwerte in Backticks (`) anstatt in Hochkommata (‚) zusammen fasst, dann führt das zur SQL Fehlermeldung 1054.

Beispiel:
Die folgende Anfrage liefert den Fehler #1054 – Unknown column ‚M‘ in ‚where clause‘.

SELECT `KundenNr` FROM `stammkunde` WHERE `Rechnungsart` = `M`

Dagegen liefert diese Anfrage ein gültiges Ergebnis:

SELECT `KundenNr` FROM `stammkunde` WHERE `Rechnungsart` = 'M'

Hibernate Tutorial in Kurzform

Hibernate Tutorials sind oft schwergewichtig und komplex. Aus diesem Grund möchte ich einen kleinen Beispiel-Code veröffentlichen, wie man in Hibernate die Attribute (Variablen) einer Java Klasse (Plain Old Java Object) in einer relationalen Datenbank (MySQL) abspeichert. Weil Hibernate ein Thema für fortgeschrittene Java-Entwickler ist, gehe ich davon aus, dass man anhand des Codes sich die Zusammenhänge erschließen kann.

Hibernate Tutorial in Kurzform weiterlesen

Failed to read auto-increment value from storage engine

Der Fehler „Failed to read auto-increment value from storage engine“ wird durch einen Bug in MySQL-Datenbanken der Version 5.x verursacht. Mir ist dieser Fehler bei der Verbindung von Hibernate mit einer InnoDB-Datenbank-Tabelle aufgefallen. Beim Datenbanktyp „MyISAM“ tritt dieser Bug wohl weniger häufig auf.

Man kann das Ganze wieder in Ordnung bringen, indem man folgenden SQL-Befehl ausführt:
ALTER TABLE `tabellen_name` AUTO_INCREMENT =1

SQL-Statements als Prepared Statements

Ein PreparedStatement besteht ist ein SQL-Statement mit Platzhaltern. Das Besondere daran ist, dass das Statement überprüft wird, bevor die Platzhalter gesetzt werden. Dadurch werden SQL-Injections verhindert. Eine SQL-Injection basiert darauf, dass ein „normales“ SQL-Statement verlängert wird. Zum Beispiel um ein „; DROP TABLE“. Durch das „;“ wird an das eigentliche SQL-Statement ein zweites Statement (nämlich DROP-Table) angehangen. Dadurch werden zwei SQL-Statements ausgeführt, was aber nicht im Sinne des Betreibers ist. Mit Prepared Statements kann dies nicht passieren, da hier das „;“ durch die vorherige Überprüfung schon missbilligt wird.

Beispiel für ein PreparedStatement:

repository.JdbcConnection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
    public void findById(int nummer)
    {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sqlStr = "SELECT * FROM cd WHERE id=?";
        LinkedList<cd_VO> voList = new LinkedList<cd_VO>();
        CD_VO vo;
 
        try
        {
            con = getConnection();
            ps = con.prepareStatement(sqlStr);
            ps.setInt(1, nummer);
            rs = ps.executeQuery();
 
            while(rs.next())
            {
                vo = new CD_VO();
                vo.setId( rs.getInt("id") );
                vo.setInterpret( rs.getString("interpret") );
                vo.setTitel( rs.getString("titel") );
                vo.setVeroeffentlichung( rs.getDate("veroeffentlichung") );
                vo.setCoverDatei( rs.getString("coverdatei") );
                voList.add(vo);
                // Testausgabe:
                System.out.println( vo.getId() );
                System.out.println( vo.getInterpret() );
                System.out.println( vo.getTitel() );
                System.out.println( vo.getVeroeffentlichung() );
                System.out.println( vo.getCoverDatei() );
            }
        }
        catch(SQLException sqlex)
        {
            sqlex.printStackTrace();
        }
        finally
        {
            try
            {
                if( ps != null )    ps.close();
                if( con != null )   con.close();
            }
            catch(SQLException excSQL)
            {
                System.out.println("Fehler beim Abbau der SQL-Verbindung:");
                excSQL.printStackTrace();
            }
        }
    }

JDBC Datenbankanbindung mit MySQL

MySQL-Datenbankabfrage mit der Java Database Connectivity aus der Java Enterprise Edition. Für die Verwendung wird die Bibliothek mysql-connector-java-5.1.5-bin.jar benötigt, damit der MySQL Driver für die JDBC zur Verfügung steht. Das Kürzel „VO“ bezeichnet die Value Objects, welche die Datensätze in der Datenbank sind.

data.CD_VO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package data;
 
import java.sql.Date;
import java.util.ArrayList;
 
public class CD_VO
{
    int id;
    String titel;
    String interpret;
    Date veroeffentlichung;
    String coverDatei;
    ArrayList<song_VO> songs;
 
    public CD_VO()
    {
        this.id = 0;
        this.titel = "";
        this.interpret = "";
        this.veroeffentlichung = new java.sql.Date(2010-10-10);
        this.coverDatei = "";
        songs = new ArrayList<song_VO>();
    }
 
    public CD_VO(String titel, String interpret, Date veroeffentlichung, String coverDatei)
    {
        setID();
        this.titel = titel;
        this.interpret = interpret;
        this.veroeffentlichung = veroeffentlichung;
        this.coverDatei = coverDatei;
        songs = new ArrayList<song_VO>();
    }
 
    private void setID()
    {
        this.id++;
    }
 
    public String getCoverDatei()
    {
        return coverDatei;
    }
 
    public void setCoverDatei(String coverDatei)
    {
        this.coverDatei = coverDatei;
    }
 
    public long getId()
    {
        return id;
    }
 
    public void setId(int id)
    {
        this.id = id;
    }
 
    public String getInterpret()
    {
        return interpret;
    }
 
    public void setInterpret(String interpret)
    {
        this.interpret = interpret;
    }
 
    public String getTitel()
    {
        return titel;
    }
 
    public void setTitel(String titel)
    {
        this.titel = titel;
    }
 
    public Date getVeroeffentlichung()
    {
        return veroeffentlichung;
    }
 
    public void setVeroeffentlichung(Date veroeffentlichung)
    {
        this.veroeffentlichung = veroeffentlichung;
    }

repository.JdbcConnection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package repository;
 
import data.CD_VO;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
 
public class JdbcConnection
{
    protected Connection getConnection()
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            return DriverManager.getConnection("jdbc:mysql://localhost/jee", "root", "password");
        }
        catch(SQLException excSQL)
        {
            System.out.println("Fehler beim Aufbau der SQL-Verbindung:");
            excSQL.printStackTrace();
            return null;
        }
        catch(ClassNotFoundException excCNF)
        {
            System.out.println("Treiber-Manager nicht gefunden.");
            excCNF.printStackTrace();
            return null;
        }
    }
 
    public void findAllTest()
    {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sqlStr = "SELECT * FROM cd";
        LinkedList<cd_VO> voList = new LinkedList<cd_VO>();
        CD_VO vo;
 
        try
        {
            con = getConnection();
            ps = con.prepareStatement(sqlStr);
            rs = ps.executeQuery();
 
            while(rs.next())
            {
                vo = new CD_VO();
                vo.setId( rs.getInt("id") );
                vo.setInterpret( rs.getString("interpret") );
                vo.setTitel( rs.getString("titel") );
                vo.setVeroeffentlichung( rs.getDate("veroeffentlichung") );
                vo.setCoverDatei( rs.getString("coverdatei") );
                voList.add(vo);
                // Testausgabe:
                System.out.println( vo.getId() );
                System.out.println( vo.getInterpret() );
                System.out.println( vo.getTitel() );
                System.out.println( vo.getVeroeffentlichung() );
                System.out.println( vo.getCoverDatei() );
            }
        }
        catch(SQLException excSQL)
        {
            System.out.println("Fehler beim Abruf aus der SQL-Verbindung:");
            excSQL.printStackTrace();
        }
        finally
        {
            try
            {
                if( ps != null )    ps.close();
                if( con != null )   con.close();
            }
            catch(SQLException excSQL)
            {
                System.out.println("Fehler beim Abbau der SQL-Verbindung:");
                excSQL.printStackTrace();
            }
        }
    }
}

repository.Main

1
2
3
4
5
6
7
8
9
10
package repository;
 
public class Main
{
    public static void main(String args[])
    {
        JdbcConnection test = new JdbcConnection();
        test.findAllTest();
    }
}

Java Database Connectivity in Aktion mit phpMyAdmin und NetBeans