java.sql.SQLException – Value can not be represented as java.sql.Date

If you receive an error that is similar to this:

java.sql.SQLException: Value ‚0000-00-00 00:00:00‘ can not be represented as java.sql.Date

Then you should check your database connection. If your connection url looks like jdbc:mysql://localhost/my_database then you should try jdbc:mysql://localhost/my_database?zeroDateTimeBehavior=convertToNull.

Other options are:
jdbc:mysql://localhost/my_database?zeroDateTimeBehavior=round
jdbc:mysql://localhost/my_database?zeroDateTimeBehavior=exception

The explanation can be found in „handling DATETIME values„.

Java und SQLite – Tutorial

Ich war überrascht, wie einfach es ist, mit Java auf einer SQLite-Datenbank zu arbeiten. Man muss lediglich einen SQLite JDBC Treiber (z.B. sqlitejdbc-v056.jar oder Xerial SQLite JDBC Driver) in seinem Java-Projekt hinzufügen und dann diesen Beispiel-Code ausführen:

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
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
 
public class Main
{
  public static void main(String[] args) throws Exception
  {
    Class.forName("org.sqlite.JDBC");
    Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
    Statement stat = conn.createStatement();
    stat.executeUpdate("drop table if exists people;");
    stat.executeUpdate("create table people (name, occupation);");
    PreparedStatement prep = conn.prepareStatement("insert into people values (?, ?);");
 
    prep.setString(1, "Gandhi");
    prep.setString(2, "politics");
    prep.addBatch();
 
    prep.setString(1, "Turing");
    prep.setString(2, "computers");
    prep.addBatch();
 
    prep.setString(1, "Wittgenstein");
    prep.setString(2, "smartypants");
    prep.addBatch();
 
    conn.setAutoCommit(false);
    prep.executeBatch();
    conn.setAutoCommit(true);
 
    ResultSet rs = stat.executeQuery("select * from people;");
    while (rs.next())
    {
      System.out.println("name = " + rs.getString("name"));
      System.out.println("job = " + rs.getString("occupation"));
    }
    rs.close();
    conn.close();
  }
}

Daraufhin wird beim erstmaligen Aufruf eine Datenbank namens „test.db“ im Projekt-Ordner angelegt und eine Tabelle „people“ mit den Spalten „RecNo“, „name“ und „occupation“. In diese Tabelle werden weiterhin drei Datensätze geschrieben. Doch Vorsicht! Beim erneuten Ausführen des Codes wird die Tabelle wieder gelöscht und neu angelegt (siehe Code-Zeile 14). Wer die SQLite-Datenbank genauer betrachten möchte, dem empfehle ich das Werkzeug SQLite Expert, welches in der „Personal Edition“ sogar kostenlos ist!

MySQL Trigger Beispiel

SQL-Trigger werden zur Überwachung von semantischen Integritätsbedingungen eingesetzt. Trigger bilden dabei eine einfache Form von ECA-Regeln. ECA steht für „Event, Control, Action“ und definiert in Zusammenhang mit Datenbanken eine Aktion, die nach der Kontrolle eines Ereignis ausgeführt werden soll.

Zur praktischen Veranschaulichung habe ich ein MySQL-Skript mit drei Tabellen und einem Trigger geschrieben. In der Tabelle „users“ können Benutzer mit einem Vor- und Nachnamen eingetragen werden. Der im Skript definierte Trigger führt nach dem Eintragen in die „users“-Tabelle einen Stringvergleich aus und schreibt alle Benutzer, deren Nachname nicht mit einem Buchstaben größer „N“ anfängt in die „users_a_m“-Tabelle. Alle Benutzer, deren Nachname mit einem „N“ oder größer beginnt, werden in die Tabelle „users_n_z“ kopiert.

Mein Beispiel demonstriert neben dem definierten After-Trigger auch noch eine Möglichkeit zur Datenbank-Skalierung. Man könnte nämlich die Tabellen „users_a_m“ und „users_n_z“ auf verschiedene Datenbank-Server auslagern und beim Lesen von Datensätzen die entsprechende Datenbank anfragen (je nachdem mit welchem Anfangsbuchstaben der Nachname des gesuchten Benutzers anfängt). Dies hätte den Vorteil, das die Datenbank-Anfragen verteilt werden und die Anfrage-Last nicht auf eine einzige Datenbank trifft.
MySQL Trigger Beispiel weiterlesen