谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

S2DaoでDerby + XML (SELECT編)

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"から""に修正したら、
見事に成功しました。