Vor der Installation von phpMyAdmin sollte zuerst ein MySQL-Daemon sowie ein Apache-Webserver installiert werden. Danach ist die Installation von phpMyAdmin ein Kinderspiel:
1 2 3 | sudo apt-get install phpmyadmin sudo scp /etc/phpmyadmin/apache.conf /etc/apache2/conf.d/phpmyadmin.conf sudo /etc/init.d/apache2 reload |
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 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.
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
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(); } } } |
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(); } } |


0