Java6についてくるJavaDB(Derby)では、XMLがサポートされてるそうなので、
これをS2Daoから呼び出す事にしました。
この辺りを参考にしながら、DBのセットアップ&テーブル作成。
JDBC SQL/XMLの新機能を使ってXMLデータ処理を効率化する
紅孔雀の日記 - Apache Derby における XML データの扱い
derbyではij.batを叩いてSQLコンソールにアクセスできるんですが、
ここでxalan.jarにクラスパスを通しておかないと、
SELECTとかINSERTでエラーが発生します。
一通り、ij.batからSELECTとかINSERTが出来るようになったので、
次はS2Daoからアクセスしてみます。
普通にDaoとEntityを作って、SQLファイルを作ります。
残念ながら、いまのDerbyはSQLXMLに対応していないので、
読み書きはStringで行なっています。
Article.java
public class Article { private Integer id; private String data; // setter/getterは省略 }
ArticleDao.java
import java.util.List; import org.seasar.dao.annotation.tiger.S2Dao; @S2Dao(bean = Article.class) public interface ArticleDao { public void insert(Article article); public List<Article> getAllArticleList(); }
ArticleDao_getAllArticleList.sql
SELECT ID, XMLSERIALIZE(DATA AS CLOB) AS DATA FROM ARTICLE
まずはselectを実行してみたところで、エラーが発生、、、
Throwable:org.seasar.framework.exception.SQLRuntimeException: [ESSR0071]SQLで例外(ErrorCode=30000, SQLState=42Y07)が発生しました。理由はorg.seasar.framework.exception.SSQLException: [ESSR0072]SQLで例外(SQL=[SELECT ID, XMLSERIALIZE(DATA AS CLOB) AS DATA FROM ARTICLE], ErrorCode={1}, SQLState={2})が発生しました
発生したエラーを見ても、よく分かりません (^^;
こういう場合は、S2Daoを経由せず、自前でクライアントを作るに限ります。
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import javax.sql.DataSource; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.S2ContainerFactory; public class ArticleDaoClient { private static final String PATH = "app.dicon"; private ArticleDao dao; public static void main(String[] args) throws Exception { S2Container container = S2ContainerFactory.create(PATH); DataSource source = (DataSource) container .getComponent(DataSource.class); Connection conn = source.getConnection(); PreparedStatement stmt = conn .prepareStatement("SELECT ID, XMLSERIALIZE(DATA AS CLOB) FROM ARTICLE"); stmt.execute(); } }
これで実行してみると、エラーが分かりました。
Caused by: java.sql.SQLException: Failed to locate 'Xalan' API or implementation classes. XML operations are not permitted unless these classes are in your classpath.
xalan.jarにクラスパスを通していませんでした (^^;;
xalan.jarにクラスパスを通して、再挑戦。
エラーが変わりました。
Caused by: java.sql.SQLException: Schema 'SA' does not exist
ユーザ名をsaのままにしていました (^^;;;
今回はユーザ名を空っぽにしているので、
jdbc.diconのuserを"sa"から""に修正したら、
見事に成功しました。