Java – MySql – Beim Insert die angelegte ID des Primary Keys zurück bekommen

Beim Programmieren hatte ich eine für mich neue Anforderung: Ich wollte direkt nach dem Insert in die Datenbank den Primary Key des angelegten Datensatzes zurück bekommen. Die Lösung fand sich schnell im Netz und ich will sie aber für zukünftige Recherchen meinerseits gleich hier in meinem „Knowledge-Fundus“ hier hinterlegen:

String insertQuery = "INSERT INTO TABLE (…) VALUES (?,?,?)";
PreparedStatement ps = db.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
ps.setInt(1,…);
ps.setInt(2,…);
ps.setInt(3,…);
ps.execute();
ResultSet rs = ps.getGeneratedKeys();
Integer idPrimarykey = null;
if (rs.next()){
idPrimarykey=rs.getInt(1);
}
return idPrimarykey; 

Das Kommando klappt in meinem Beispiel hervorragend mit MySql. Damit konnte ich diekt aus dem Insert den Primary Key ermitteln und direkt weiterverarbeiten.

Nicht druckbare Zeichen in Java Strings lassen .equal oder .valueOf(String) fehlschlagen

Beim Vergleichen von Strings mit equal oder Enum Parsen mit „valueOf“ gibt es keinen match, obwohl der String augenscheinlich identisch ist – Dieses Problem wird in diesem Beitrag erläutert:

Beim Parsen von CSV Dateien stößt man ab und zu auf Probleme mit der Encodierung der zu parsenden Datei.

Im konkreten Fall gestaltete sich das Problem als herausfordernd, weil auf den ersten Blick keine Ursache für das Problem erkennbar war.

Die geparste Variable nennt sich „rowTypeString“ und hat im Debugger den Inhalt „RH“

debug screenshot - String "RH" sieht aus als wäre er 2 Zeichen lang, ist aber 3 Zeichen lang wegen nicht druckbarer Zeichen - aus diesem Grund schlägt ein Equal fehl
Augenscheinlicher Inhalt der Variable „rowTypeString“ – nur zwei Zeichen mit dem Inhalt „RH

Im Quelltext wird jedoch die Variable über ein Enum mit der  „valueOf()“-Funktion geparst und einem eindeutigen Typ zugewiesen. Diese lief jedoch immer auf eine IllegalArgumentException hinaus.
Die Analyse des String ergab dann doch noch interessante Details:

  • Der String hat eine Länge von 3 Zeichen (auch wenn das dritte unsichtbar ist)
  • Ein Character Array gab auch interessante Details zurück:
char of string with hidden character
  • Die Methode rowTypeString.getBytes() gibt  zahlreiche Bytes zurück, welche auf das dritte Zeichen hindeuten:
    [-17, -69, -65, 82, 72]
  • Eigentlich dürfte das ByteArray nur [82,72] lauten für den String „RH“

Die Lösung konnte sich dann doch gut sehen lassen. Es werden alle „nicht druckbaren Zeichen“ entfernt mit dem nachfolgenden regulären Ausdruck:

stringValue.replaceAll("[^\\p{Graph}\n\r\t ]", "");

Ich danke an dieser Stelle dem Verfasser einer Antwort in StackOverFlow

Eclipse debug stoppt auch ohne eigene Breakpoints

Java-Entwickler, welche mit Eclipse arbeiten, erhalten manchmal nach einem Update von Eclipse oder der Java VM Debugfehler, welche sich nicht auf die eigenen Projektdateien beziehen, sondern auf Breakpoints im Java JDK:

Thread [main] (Suspended (exception FileNotFoundException))
URLClassPath$JarLoader.getJarFile(URL) line: 577
URLClassPath$JarLoader. (URL, URLStreamHandler, HashMap) line: 546
URLClassPath$3.run() line: 324
AccessController.doPrivileged(PrivilegedExceptionAction ) line: not
available [native method]
URLClassPath.getLoader(URL) line: 313
URLClassPath.getLoader(int) line: 290
URLClassPath.getResource(String, boolean) line: 160
URLClassPath.getResource(String) line: 213

17-02-_2016_15-35-00

Auch langes googlen hat mir diesmal nicht geholfen. Meistens gab es Empfehlungen, in den Preferences –> Debug  „Suspend execution on uncaught exceptions“ zu deaktivieren.

17-02-_2016_15-32-29Leider hatte das bei mir nicht geholfen. Was allerdings half, war bei Breakpoints die betroffene Klasse zu deaktivieren bzw. das Häkchen von „Caught locations“ zu deaktivieren.

17-02-_2016_11-20-16Ich hoffe, auch Euch hilft dieser Tipp.

 

PHP5 mittels Source Code auf einem frischen Ubuntu installieren

Das „hineinkompilieren“ eines Advantage Database-Moduls machte es für mich erforderlich, die aktuelle PHP-Version auf einem frisch installierten Ubuntu (14.04) zu installieren.

Angelehnt an diese Anleitung entstand für mich der folgende Workarround:

Nach der Installation sind zuerst die Voraussetzungen für die Verwendung von PHP notwendig:

sudo apt-get install git build-essential autoconf apache2-prefork-dev<br />

Anschließend installierte ich den Apache und zugehörige DEV-Module:

sudo apt-get install apache2 apache2-dev

Für das erfolgreiche Absolvieren benötigte ich noch die folgenden „Zusatzmodule“:

sudo apt-get php5-cli php5-mysql php5-gd php5-mcrypt php5-curl libapache2-mod-php5 php5-xmlrpc mysql-client libapache2-mod-fastcgi libxslt1.1 libxslt1-dev

 

sudo apt-get install php5-dev libbz2-dev libmysqlclient-dev libxpm-dev libmcrypt-dev libcurl4-gnutls-dev libxml2-dev libjpeg-dev libpng12-dev libfreetype6-dev libicu-dev

Wenn noch MySQL gewünscht ist, lässt sich dieses noch einfach ergänzen

sudo apt-get install mysql-server

Jetzt könnt ihr testen, ob der Apache richtig installiert wurde, indem ihr die IP-Adresse der Ubuntu-Servers im Browser aufruft:

Ubuntu Apache2 Install Confirmation SiteJetzt ist es an der Zeit den PHP Quelltext herunterzuladen:

git clone https://github.com/php/php-src.git

Checkt die von Euch gewünschte Version aus:

git checkout PHP-5.6.26

oder

git checkout PHP-5.6

Um aus dem PHP-Source nachher das makefile mit .configure zu erzeugen, benötigt ihr noch Bison, sonst bringt er folgende Fehlermeldung:

configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
configure: error: bison is required to build PHP/Zend when building a GIT checkout!

Diese Meldung umgeht ihr, indem ihr Euch bison von http://launchpadlibrarian.net herunterladet und installiert:

wget http://launchpadlibrarian.net/140087283/libbison-dev_2.7.1.dfsg-1_amd64.deb
wget http://launchpadlibrarian.net/140087282/bison_2.7.1.dfsg-1_amd64.deb
sudo dpkg -i libbison-dev_2.7.1.dfsg-1_amd64.deb
sudo dpkg -i bison_2.7.1.dfsg-1_amd64.deb

geht in den PHP-Source-Path – bei mir:./bu

cd ~/php-source

Jetzt muss das .configure-Skript erstellt werden mit

./buildconf

Als nächstes wird mit /.configure eingestellt, welche Module wir in PHP haben möchten. Ich empfehle diesen Mix aus üblichen PHP-Modulen:

./configure –with-apxs2=/usr/bin/apxs2 –with-mysql  –enable-mbstring   –with-curl   –with-openssl   –with-xmlrpc   –enable-soap   –enable-zip   –with-gd   –with-jpeg-dir   –with-png-dir   –with-mysql   –with-pgsql   –enable-embedded-mysqli   –with-freetype-dirphp    –enable-intl   –with-xsl –enable-mbstring   –with-curl   –with-openssl   –with-xmlrpc   –enable-soap   –enable-zip   –with-gd   –with-jpeg-dir   –with-png-dir   –with-mysql   –with-pgsql   –enable-embedded-mysqli   –with-freetype-dir     –enable-intl   –with-xsl –prefix=/usr/local/php

Mit den folgenden Befehlen erstellt ihr das Setup und installiert anschließend PHP auf dem Server

sudo make

sudo make install

libtool –finish /home/gustini/php-src/libs

Jetzt kopiert ihr eine der PHP-INIs (develpment oder production) an den Zielordner:

sudo cp php.ini-development /usr/local/lib/php.ini

Um PHP im Apache einzubinden, müsst ihr die Apache2.conf um folgende Zeilen ergänzen:

sudo vim /etc/apache2/apache2.conf

LoadModule php5_module /usr/local/php/lib/libphp5.so
AddType application/x-httpd-php .php

Damit PHP auch funktioniert, muss Apache2 vom ThreadSafe-Mode in den NotThreadSafeMode umgeschaltet werden:

sudo a2dismod mpm_event

sudo a2enmod mpm_prefork

cd

Jetzt müsst ihr noch den Apache2 neu starten:

sudo /etc/init.d/apache2 stop

sudo /etc/init.d/apache2 start

Anschließend sollte Apache und PHP5 erfolgreich installiert sein.

Ergänzende Hinweise:

Hinzufügen von PHP zum Pfad

sudo vim ~/.bashrc

Am Ende der Datei hinzufügen:

export PATH=$PATH:/usr/local/php/bin

Build PHP5 unter Ubuntu – Fehler: bison is required to build PHP/Zend when building a GIT checkout!

Fehlermeldung beim Kompilieren von PHP5-Source unter Ubuntu:

configure: error: bison is required to build PHP/Zend when building a GIT checkout

PHP5 benötigt für die Kompilierung bison 2.7. Dies lässt sich einfach nachinstallieren – anschließend läuft das „buildConfig“ problemlos durch.

sudo apt-get install m4
wget http://launchpadlibrarian.net/140087283/libbison-dev_2.7.1.dfsg-1_amd64.deb
wget http://launchpadlibrarian.net/140087282/bison_2.7.1.dfsg-1_amd64.deb
sudo dpkg -i libbison-dev_2.7.1.dfsg-1_amd64.deb
sudo dpkg -i bison_2.7.1.dfsg-1_amd64.deb

Fehlermeldung unter Windows
Die Fehlermeldung kann auch beim Kompilieren von PHP unter Windows auftreten.

Wenn nach dieser Anleitung kompiliert wird, erscheint sie möglicherweise automatisch.
Beheben lässt sich die Fehlermeldung, indem die PHP-Binary-Tools, welche für die Kompilierung benötigt werden, in den Pfad der Umgebungsvariablen aufgenommen werden.

Ein kurzer Weg:

  • Windows-Taste + Pause
  • Erweitere Systemeinstellungen
  • Umgebungsvariablen
  • Ergänzen der Umgebungsvariable „PATH“ um den Eintrag des bin-Verzeichnisses der PHP-Binary-Tools, nach der oben verlinkten Anleitung wäre das „c:\php-sdk\bin\“.