(今更)JDBCでMS-Accessにアクセス
自分は普段Enterprise Architectというモデリングツール(有名?)を使ってER図なんかを書いてます。で、EAはモデルからDDLを作成してくれるんですけど、残念ながらテーブルの論理名をDDLのコメントとして出力する機能がなぜかないんです。しかもJavaソースコード出力だとテンプレートでいじれるようになってるのに、DDLはなぜか内部に隠蔽されてて手の出しようがない。しょうがないのでEAのファイルに直アクセスしてやるかー、ってことでJDBCからEAファイル(中身はMS-Accessそのまま)にアクセスしたときのメモ。
まずMS-Access用のPure Java JDBCドライバというものは商用しかありません。そこでJDKについてるJDBC-ODBCブリッジを使ってODBC経由でアクセスします。んでこのSun標準実装のJDBC-ODBCブリッジ実装(sun.jdbc.odbc.JdbcOdbcDriver)ってやつを使うんですが、昔(j2sdk1.4)はマルチバイト文字列を扱えなくて、いちいち new String(rs.getBytes(i), "MS932"); とかやってたんですが、JDK5から charSet プロパティが設けられて、マルチバイトを正しく扱えるようになってました(知らんかった)。
<component name="xaDataSource" class="org.seasar.extension.dbcp.impl.XADataSourceImpl"> <property name="driverClassName"> "sun.jdbc.odbc.JdbcOdbcDriver" </property> <property name="URL"> "jdbc:odbc:ODBC-NAME" </property> <property name="user">"sa"</property><!-- 何か入れておく --> <property name="password">""</property> <initMethod name="addProperty"> <arg>"charSet"</arg> <arg>"MS932"</arg> </initMethod> </component>
1点注意で、XADataSourceImplの実装は、userプロパティに値がないと DriverManager.getConnection() するときにPropertiesを渡さないので(狙ってやってるのかは不明)、嘘でもいいから何かしら値をセットしないとcharSet指定が効きません。