ひがやすを技術ブログ

電通国際情報サービスのプログラマ

S2Dao

バッチ更新

S2Daoでバッチ更新をサポートします。 int insertBatch(Employee[] employees);のように更新系のメソッドで引数を配列もしくはListで 定義するだけです。

複数のDBMSの切り替え

皆様のおかげで、情報を集めることができ、どうもありがとうございました。 DatabaseProductNameとDBMSの関係は次のような感じです。 dbms.properties =org.seasar.dao.dbms.Standard Oracle=org.seasar.dao.dbms.Oracle PostgreSQL=org.seasar.dao.dbms.Pos…

S2DaoTestCase

テストめちゃくちゃ楽っていうか一撃。 public class EmployeeDaoTest extends S2DaoTestCase { private EmployeeDao dao_; public EmployeeDaoTest(String arg0) { super(arg0); } public static void main(String[] args) { junit.textui.TestRunner.run(E…

V1.0.1のリリースは多分明日

http://seasarproject.g.hatena.ne.jp/abhrsh/20040718 を取り込んでexampleの例もテストする感じにしようと思っているので、 当初のリリースは今日だったのですが、1日、2日遅れそうです。 テストがかなり楽になるので、こうご期待。 DBまわり、これで実装…

複数のDBMSの切り替え

S2Daoでは、java.sql.DatabaseMetaData#getDatabaseProductName() を使ってどのDBMSなのかを判断し、動作を切り替えています。 OracleとHSQLDBは手元にあるので、確かめられるのですが、 それ以外のDBMSは良く分かっていない状態です。 MS SQLServer,DB2,Pos…

複数のRDBMS

質問!OracleにもHSQLDBにも対応したアプリを書きたいのですけど、これって対応可能でしょうか? SQLファイルにサーフィックスとかがついていればいけそうだけど・・・ getEmployees_oracle.sql getEmployees_hsqldb.sql のような感じで対応しようと検討中で…

EA2 リリース準備開始

リリース準備終了

S2Dao EA2 マニュアル準備開始

マニュアル準備終了

ARGSアノテーション

引数の数が1つしかないときは、ARGSアノテーションが省略できるように なりました。 Beanのクラス名が変わっても平気です。> きむきむ 例えば、public Employee getEmployeeByEmpno(int empno)なんて場合も 省略できます。

EA2 リリース予定

できれば明日。遅くても火曜日にEA2をリリースします。 今回のリリースには、SQL自動生成が含まれます。 仕組みとしては、メソッドに関連したSQLファイルがない場合には、 S2Daoがメソッドのsignatureから自動的にSQL文を組み立てます。 たぶん、通常開発の8…

1:Nの実装案(考慮中)

1:NはS2Daoとして実装し、必要のない人は使わなければ良いし、 必要のある人は使えば良いんだと考えることにしました。 ニーズがあることには対応します。 実装案は考慮中。 以下の例はDepartmentにemployeesというプロパティがある場合です。 public static…

1:Nの実装

1:N はどう実装するのが正しいのだろう? エンティティ型に ASPECT して、N の DAO 呼ぶ? 1:Nは、N側のDaoを呼ぶでいいジャンと思ってるのだけど、だめかしら。 クライアントで、N側のデータを必要とするとき、クライアント側で SQLが発行されないように、…

マニュアル完了

これからリリース準備に入ります。

テスト完了

これからexampleとマニュアルの作成に入ります。

S2Dao EA1のリリース予定

S2Dao EA1のリリース予定は、6/26 or 6/28,29,30のいずれかになる予定です。 機能としては、2Way SQL(コメントによる動的SQLを含む)までで、 SQLの自動生成はこの後のバージョンでの実装になります。 コメントによる動的SQL static定数によるアノテーション …

S2Dao入門(1)

S2Daoではエンティティのクラスを作成するために2つの方法が提供されます。 Excelにテーブル定義を書いて、DDL, エンティティのソースを書き出す。DDLを直接データベースに適用することも可能。 作成済みのテーブルのメタデータよりExcel、エンティティのソ…

Field MetaData

プロパティ名とカラム名が異なる場合、以前のFieldMetaDataの 仕様では、プロパティ名を大文字に変換して、_COLUMNをつけていましたが、 読みやすさを考えて、大文字には変換しないようにしました。 以前 public static final String EMPLOYEENAME_COLUMN = …

many to one

S2Daoではmany to oneのデータを取得するために、 FROM句でのサブクエリと左外部結合を使おうとしてます。 どのRDBMSでも大丈夫かなぁ。 オラクル、DB2は大丈夫なんですが、その他のRDBMSって どうなんでしょ。 追加: 後、テーブル名.*, テーブル名2.*も sel…

動的なSQLのテスト

動的なSQLのテストはこんな感じ String sql = SqlFactory.create( "../EmployeeDao_getEmployeesByJobDeptnoList.sql"); //SQLの解析ツリー Node root = new SqlParserImpl(sql).parse(); CommandContext ctx = new CommandContextImpl(); //引数をいろいろ…

最終仕様案

結局、XMLなしのPOJOベース(BeanもDaoも)で考えています。 次のようなDaoのI/Fを考えます。 interface EmployeeDao BEAN_CLASS = Employee.class; GETEMPLOYEE_AUTO = "select"; GETEMPLOYEE_ARGS = "empno"; GETEMPLOYEES_AUTO = "select"; GETEMPLOYEES_AR…

ELSE

ELSEは結局ネストも可能にしました。 MySQLの仕様に合わせて--の後にブランクを入れました。 /*IF ...*/ ... -- ELSE -- /*IF ...*/ -- ... -- /*END*/ /*END*/

大量データの扱い

S2Daoでは、大量データをディスクにキャッシングする機能を 提供します。 例えば、10万件のデータにアクセスする場合でも、 メモリ上には、100件分のデータだけがあり、 必要に応じて、ディスクからデータが読み込まれ、 不要になったデータは、ディスクに待…

検索

単純な検索は、SQL文を書く必要はありません。 S2Dao#select(Class beanClass, String criteria, Object bindVariable) S2Dao#select(Class beanClass, String criteria, Object[] bindVariables) List result = dao.select(Emp.class, "empno = ?", new Int…

SQLの解析

SQLの解析は、SqlParserが行い、解析結果は、Nodeのツリーになってます。 public interface Node { public int getChildSize(); public Node getChild(int index); public void addChild(Node node); public void accept(QueryContext ctx); } public interf…

ELSE

ELSEではバインド変数は使えるが、BEGINやIFなどのENDタグを 使うものは使えないという仕様に落ち着きました。 基本は1ラインコメントになると思います。 /*IF job != null*/ job = /*job*/'CLERK' --ELSE job is null /*END*/

ELSE

以前ELSEは /*IF job != null*/ job = /*job*/'CLERK' /*ELSE job is null END*/で考えていたのですが、ELSEの部分にバインド変数 (/*hoge*/)を使おうとするとコメントがネストしてしまい、 使えないので、以下のように変更しようと思ってます。 /*IF job !=…

更新SQLの自動生成

S2Daoのうりの1つは、2Way SQLですが、更新のSQLについては、 Beanの定義から自動生成しようと思ってます。 デフォルトだとBeanのクラス名をテーブル名、 プロパティ名をカラム名とみなします。 プライマリーキーの情報は、JDBCのメタデータより取得します。…

IF

id:manholeさんとさらに検討してみました。 /*IF (foo != null)*/ foo = /*#foo*/123 /*ELSE foo is null END*/ /*IF (foo != null)*/foo = /*#foo*/123 /*ELSE foo is null END*/条件なしならこれまで同様BEGIN,END

elseはどうなる

/*BEGIN if(#bar != null)*/ bar=/*#bar*/'a' //ELSE bar is not null /*END*/複数行なら、 /*BEGIN if(#bar != null)*/ bar=/*#bar*/'a' /*ELSE bar is not null ... */ /*END*/かしら。ポイントは、else部分はSQL的には評価されないように コメントアウト…

ハイブリッドSQL

なるほど。SQLコメントでSQLデザイナーとプログラマーで分業をやるという。悪乗りしてTapestry的ならこっちか? SELECT empno, ename FROM emp WHERE empno = /*S2*/7788/*?{empno}*/ とか?トークン内部の一部置き換えはできなくなっちゃいますけど。 ちょ…