Sebastian Hempel bio photo

Sebastian Hempel

Software Crafter, Clean-Code-Developer, JEE Professional, Puppet-Master, OpenSource Fanboy, Alfisti

Email Twitter Google+ XING Instagram Github

In Java verwendet man für den Zugriff auf Datenbanken eine JDBC-Treiber. Soweit möglich und verfügbar wird man auf JDBC-Treiber vom Typ 4 zurückgreifen, die direkt ohne weitere Zwischenschichten und Abhängigkeiten zur (system-) spezifischer Software auf das ®DBMS zugreifen. In meinem aktuellen Projekt ist das leider nicht möglich. Es existiert kein JDBC-Treiber, der native auf eine MS Access “Datenbank” zugreifen kann und dabei die Möglichkeit zum Zugriff auf OLE- / BLOB-Felder bietet.

Im Internet findet man sehr schnell Anleitungen, wie man über die JDBC-ODBC Bridge von Sun (Oracle) den ODBC-Treiber für Microsoft Access nutzen kann. Nach dem Laden der Bridge sun.jdbc.odbc.JdbcOdbcDriver öffnet man über den DriverManger eine Verbindung (Connection) zur Datenbank. Beim Aufruf der Methode getConnection des DriverManger können weitere Parameter (java.util.Properties) an die Bridge bzw. den ODBC-Treiber übergeben werden. Wichtig ist hierbei vor allem der Parameter zur Konfiguration des zu verwendenden Zeichensatzes (charSet). Wird dieser Parameter nicht korrekt gewählt, erhält man statt Umlauten ? Zeichen aus der Datenbank.

Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);

Properties properties = new Properties();
properties.put("charSet", "ISO-8859-1");

String url = "jdbc:odbc:dsn1";

Connection connection = DriverManager.getConnection(url, properties);

Verwendet man – wie ich im Projekt – das Framework Spring kommt man mit einer Connection bzw. dem DriverManager nicht weit. Zur Konfiguration von Datenbankverbindungen verwendet Spring DataSource Objekte (javax.sql.DataSource). Über die von Spring zur Verfügung gestellte DriverManagerDataSource kann man die oben beschriebene Verwendung der JDBC-ODBC Bridge 1:1 nach Spring übernehmen. Nachteil dabei ist, dass man bei der DriverManagerDataSource keine Möglichkeit zur Konfiguration weiterer Parameter hat. Der Zugriff auf die Datenbank in Spring funktioniert, nur kommen die Umlaute mangels des konfigurierten Parameters charSet nicht korrekt in Java an.

<bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  destroy-method="close">
  <property name="driverClassName"
    value="sun.jdbc.odbc.JdbcOdbcDriver"/>
  <property name="url" value="jdbc:odbc:dsn1"/>
</bean>

Sun stellt neben der eigentlichen JDBC-ODBC Bridge aber auch eine DataSource (sun.jdbc.odbc.ee.DataSource) zur Verfügung. Diese kann wie jede andere Implementierung von javax.sql.DataSource in Spring verwendet werden. Verwendet man die DataSource statt der JDBC-ODBC Bridge besteht auch in Spring die Möglichkeit, weitere Parameter an den Treiber zu übergeben. Hierzu stellt die DataSource Attribute zur Verfügung. Für die Konfiguration des Zeichensatzes ist dies das Attribute CharSet.

<bean id="dataSource" class="sun.jdbc.odbc.ee.DataSource"
  destroy-method="close">
  <property name="databaseName" value="dsn1"/>
  <property name="charSet" value="ISO-8859-1"/>
</bean>

Durch die Verwendung der von Sun (Oracle) zur Verfügung gestellten DataSource wird zum einen die Konfiguration in Spring wesentlich sauberer zum anderen kann man auf diese Weise auch den benötigten Parameter zur Festlegung des Zeichensatzes angeben.