忍者ブログ
[1]  [2]  [3]  [4
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

INSERT文をSQLFILEと自動SQL作成を使用して実行してみる。

まずはDaoから

TableDao.java

package s2dao.test.dao;

import java.util.List;

import s2dao.test.dto.Tran;
import s2dao.test.dto.TranDto;

public interface TableDao {

 public static final Class BEAN = TranDto.class;

 public static final String getAllColumn_SQL_FILE = "s2dao/test/sql/TableDao_getAllColumn.sql";

 public List<TranDto> getAllColumn();

 public List<TranDto> getAllColumnAuto();

 public String getAllColumnAutoId_ARGS = "id";

 public List<TranDto> getAllColumnAutoId(int id);

 public int insert(TranDto tran); 

public static final String insertTran_SQL_FILE = "s2dao/test/sql/TableDao_insertTran.sql";

 public int insertTran(TranDto tran);
}


んでINSERT用のSQLファイル

TableDao_insertTran.sql

INSERT INTO TRAN VALUES ( /*id*/7788,/*tname*/'aaa',/*mstno*/20 )

/**/で囲まれた部分に引数のプロパティ名と同じものが入ります。

/*プロパティ名*/リテラルの書式

/*の後ろに半角スペースを入れるとコメントになっちゃうので入れないように!!

リテラルはよくわからない(=ω=)

まぁ適当な数値や文字列を入れれば問題なさそう。(入れなくてもうまくいったしw)

んで最後のSqlStater.java

package s2dao.test.stat;

import java.util.List;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;

import s2dao.test.dao.TableDao;
import s2dao.test.dto.Tran;
import s2dao.test.dto.TranDto;

public class SqlStater {

 private static final String PATH = "mysql.dicon";

 public static void main(String[] args) {
  S2Container container = S2ContainerFactory.create(PATH);
  container.init();

  try {
   TableDao dao = (TableDao)container.getComponent(TableDao.class);

   System.out.println("======ALL RECODE========");
   List<TranDto> tableDtoList = dao.getAllColumn();

   for( int i = 0; i < tableDtoList.size(); ++i ) {
    System.out.println(tableDtoList.get(i));
   }

   System.out.println("======Auto========");

   tableDtoList = dao.getAllColumnAuto();

   for( int i = 0; i < tableDtoList.size(); ++i ) {
    System.out.println(tableDtoList.get(i));
   }

   System.out.println("======Auto ID========");

   tableDtoList = dao.getAllColumnAutoId(1);

   for( int i = 0; i < tableDtoList.size(); ++i ) {
    System.out.println(tableDtoList.get(i));
   }

   System.out.println("======Insert SQLFILE========");

   TranDto trandto = new TranDto();
   trandto.setId(7);
   trandto.setTname("TRANNAME7");
   trandto.setMstno(20);

   int count1 = dao.insertTran(trandto);
   System.out.println("INSERT SUCCESS COUNT : " + count1 );

   System.out.println("======Insert AUTO========");
   trandto = new TranDto();
   trandto.setId(8);
   trandto.setTname("TRANNAME8");
   trandto.setMstno(21);

   int count2 = dao.insert(trandto);
   System.out.println("INSERT SUCCESS COUNT : " + count2 );

   System.out.println("======ALL RECODE========");
   tableDtoList = dao.getAllColumnAuto();

   for( int i = 0; i < tableDtoList.size(); ++i ) {
    System.out.println(tableDtoList.get(i));
   }
  } finally {
   container.destroy();
  }
 }
}

これで実行すると・・・

======ALL RECODE========
1, TRANNAME1, 20, { 20. MSTNAME1 }
2, TRANNAME2, 20, { 20. MSTNAME1 }
3, TRANNAME3, 21, { 21. MSTNAME2 }
4, TRANNAME4, 21, { 21. MSTNAME2 }
======Auto========
1, TRANNAME1, 20, { 20. MSTNAME1 }
2, TRANNAME2, 20, { 20. MSTNAME1 }
3, TRANNAME3, 21, { 21. MSTNAME2 }
4, TRANNAME4, 21, { 21. MSTNAME2 }
======Auto ID========
1, TRANNAME1, 20, { 20. MSTNAME1 }
======Insert SQLFILE========
INSERT SUCCESS COUNT : 1
======Insert AUTO========
INSERT SUCCESS COUNT : 1
======ALL RECODE========
1, TRANNAME1, 20, { 20. MSTNAME1 }
2, TRANNAME2, 20, { 20. MSTNAME1 }
3, TRANNAME3, 21, { 21. MSTNAME2 }
4, TRANNAME4, 21, { 21. MSTNAME2 }
7, TRANNAME7, 20, { 20. MSTNAME1 }
8, TRANNAME8, 21, { 21. MSTNAME2 }

こんな感じに出ます。

PR

簡単なSQLなからCRUDができるそうなのでとりあえずSELECT文を・・・。

TableDao.java

 public List<TranDto> getAllColumnAuto();

 public String getAllColumnAutoId_ARGS = "id";

 public List<TranDto> getAllColumnAutoId(int id);


んで、SqlStater.javaに下を追加すると


   System.out.println("======Auto========");

   tableDtoList = dao.getAllColumnAuto();

   for( int i = 0; i < tableDtoList.size(); ++i ) {
    System.out.println(tableDtoList.get(i));
   }

   System.out.println("======Auto ID========");

   tableDtoList = dao.getAllColumnAutoId(1);

   for( int i = 0; i < tableDtoList.size(); ++i ) {
    System.out.println(tableDtoList.get(i));
   }


コレで実行すると・・・

1, TRANNAME1, 20, { 20. MSTNAME1 }
2, TRANNAME2, 20, { 20. MSTNAME1 }
3, TRANNAME3, 21, { 21. MSTNAME2 }
4, TRANNAME4, 21, { 21. MSTNAME2 }
======Auto========
1, TRANNAME1, 20, { 20. MSTNAME1 }
2, TRANNAME2, 20, { 20. MSTNAME1 }
3, TRANNAME3, 21, { 21. MSTNAME2 }
4, TRANNAME4, 21, { 21. MSTNAME2 }
======Auto ID========
1, TRANNAME1, 20, { 20. MSTNAME1 }

結果が出ます。


現在はDtoを引数で自動SQLをやろうとしてるんだけどうまくいかなく悩み中・・・(=_=;)

UrumaのサイトでDBアクセス用にS2Daoってのが使えるって書いてあったので普通にPreperedStatment使ってもつまらないので早速使ってみる。

使用するDBはPostgreSQL8.2

テーブルは

CREATE TABLE TRAN ( id INTEGER, tname VARCHAR(20), mstno INTEGER );
CREATE TABLE MST (mstno INTEGER, mname VARCHAR(20) );

でTRANのid、MSTのmstnoをPKに設定。

内容はこんな感じ?

TRAN
id |   tname           | mstno
 1 | TRANNAME1 |    20
 2 | TRANNAME2 |    20
 3 | TRANNAME3 |    21
 4 | TRANNAME4 |    21

MST
 mstno |  mname
        20 | MSTNAME1
        21 | MSTNAME2

とりあえずPostgreSQLのjarファイルをlibに配置しビルド・パスに通す。

SeasarのサイトのからS2Daoをダウンロード(S2Dao1.0.47)

ダウンロードしたファイルを解凍し、S2Daoのlibフォルダの中のs2-dao-1.0.47.jarと、とりあえずs2-dao-1.0.47-sources.jarをビルド・パスに通す。

それとSeasarのサイトからS2Containerを落とし、libからgeronimo-jtr_1.1_spec-1.0.jarを取得する。

これがないとClassNotFoundException javax/transaction/TransactionSynchronizationRegistryが発生してしまいました。

先ほど落としたS2Daoフォルダ内にもgeronimo-j2ee_1.4_spec-1.0.jarっていう似たものがあるけどうまくいかない。

j2eeって書いてあるからSeasar2.3以前だったらよかったのかな?

次はdiconファイル。

S2Daoのresourcesフォルダからjdbc.diconをとってくる。(Seasar2.3ではj2ee.dicon)

jdbc.diconのhsqlの部分の<component>タグをコメントアウトしpostgreSQLの<component>タグをコメントを解除しDB名とユーザ名、パスワードを指定する。

これでjdbc.diconの設定は完了。


次はDTO

TranDto.java

package s2dao.test.dto;

public class TranDto {

 public static final String TABLE = "TRAN";

 public static final int mstdto_RELNO = 0;

 private int id;

 private String tname;

 private int mstno;

 private MstDto mstdto;

 public TranDto() {
 }

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getTname() {
  return tname;
 }

 public void setTname(String tname) {
  this.tname = tname;
 }

 public int getMstno() {
  return mstno;
 }

 public void setMstno(int mstno) {
  this.mstno = mstno;
 }

 public MstDto getMstdto() {
  return mstdto;
 }

 public void setMstdto(MstDto mstdto) {
  this.mstdto = mstdto;
 }

 @Override
 public boolean equals(Object obj) {
  if( ! ( obj instanceof TranDto ) ) {
   return false;
  }
  TranDto other = (TranDto)obj;
  return this.getId() == other.getId();
 }

 @Override
 public int hashCode() {
  return this.getId();
 }

 @Override
 public String toString() {
  StringBuffer sb = new StringBuffer();
  sb.append(id).append(", ");
  sb.append(tname).append(", ");
  sb.append(mstno).append(", { ");
  sb.append(mstdto).append(" }");
  return sb.toString();
 }
}


クラス名とテーブル名が等しい場合は

public static final String TABLE = "TRAN";

が必要ないらしい。

public static final int mstdto_RELNO = 0;

は2つ以上のテーブルを使用する場合に必要になる。

今はTRANとMSTのみなので値は0だけ。

もうひとつ必要な場合は0と1を指定する。

テーブルのカラム名とDTOのカラム名が等しいとき以外は

public static final String mstdto_RELKEYS = "mstno:mstno";

を記述する。

"多側のカラム名1:1側のカラム名1,カラム名2:1側のカラム名2,・・・"

で複数記述も可

他にもあるけどあとはS2DaoのExampleをみてください。


同じようにMstDto.java

package s2dao.test.dto;

public class MstDto {

 public static final String TABLE = "MST";

 private Integer mstno;

 private String mname;

 public MstDto(){
 }

 public Integer getMstno() {
  return mstno;
 }

 public void setMstno(Integer mstno) {
  this.mstno = mstno;
 }

 public String getMname() {
  return mname;
 }

 public void setMname(String mname) {
  this.mname = mname;
 }

 @Override
 public boolean equals(Object obj) {
  if( ! ( obj instanceof MstDto ) ) {
   return false;
  }
  MstDto other = (MstDto)obj;
  return this.getMstno() ==  other.getMstno();
 }

 @Override
 public int hashCode() {
  return (int)mstno;
 }

 @Override
 public String toString() {
  StringBuffer sb = new StringBuffer();
  sb.append(mstno).append(". ");
  sb.append(mname);
  return sb.toString();
 }
}


次にDaoを・・・。

これはインターフェースになります。

package s2dao.test.dao;

import java.util.List;

import s2dao.test.dto.TranDto;

public interface TableDao {

 public static final Class BEAN = TranDto.class;

 public static final String getAllColumn_SQL_FILE = "s2dao/test/sql/TableDao_getAllColumn.sql";

 public List<TranDto> getAllColumn();
}


メソッド名_SQL_FILEでDaoと別の位置に配置したSQLファイルとは別に配置できる。

S2DaoのExampleにはpublic List getAllColumn();で値が取得できていたけどうまくいかない。

散々悩んだ挙句List<TranDto>にしたらうまくいった。

Listだけでうまくいくのかなぁ?


さて次はSQLファイルの作成。

これはresourceに配置します。

命名規則はDao名_メソッド名.sqlになってます。

TableDao_getAllColumn.sql

SELECT TRAN.*, MST.mname AS mname_0 FROM TRAN, MST WHERE TRAN.mstno = MST.mstno


MST.mname AS mname_0の_0はTranDto.javaのRELNOの値を指定します。


次はDaoを登録するためのdiconファイルの設定をします。

mysql.dicon

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">

<components>
 <include path="dao.dicon"/>
 <component class="s2dao.test.dao.TableDao">
  <aspect>dao.interceptor</aspect>
 </component>
</components>


最後に起動用のJava

SqlStater.java

package s2dao.test.stat;

import java.util.List;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;

import s2dao.test.dao.TableDao;
import s2dao.test.dto.TranDto;

public class SqlStater {

 private static final String PATH = "mysql.dicon";

 public static void main(String[] args) {
  S2Container container = S2ContainerFactory.create(PATH);
  container.init();

  try {
   TableDao dao = (TableDao)container.getComponent(TableDao.class);

   List<TranDto> tableDtoList = dao.getAllColumn();

   for( int i = 0; i < tableDtoList.size(); ++i ) {
    System.out.println(tableDtoList.get(i));
   }
  } finally {
   container.destroy();
  }
 }
}


これで実行すれば

1, TRANNAME1, 20, { 20. MSTNAME1 }
2, TRANNAME2, 20, { 20. MSTNAME1 }
3, TRANNAME3, 21, { 21. MSTNAME2 }
4, TRANNAME4, 21, { 21. MSTNAME2 }

な結果が返ってくるはず!!

Urumaでのウィンドウの削除、表示、非表示なんか

Urumaでは画面のShellオブジェクトが自動的にshellって名前でインジェクションされるらしい。

つまり各画面のアクションに

public Shell shell;

でShellオブジェクトができるっと。

まずは画面の削除

shell.close();

次に画面の非表示

shell.setVIsible(false);

表示はtrueにするだけ。

shell.setVisible(treu);


コレを使えばサブウィンドウが表示されている間はメインウィンドウを表示したくないときなんかに使えます。

MenuAction.java

package gui.test;

import org.eclipse.swt.widgets.Shell;
import org.seasar.framework.container.annotation.tiger.Component;
import org.seasar.uruma.annotation.EventListener;
import org.seasar.uruma.core.UrumaWindowManager;

@Component(name="menuAction")
public class MenuAction {
 public Shell shell;
 public UrumaWindowManager windowManager;
 

 @EventListener(id="button")
 public void button(){
  shell.setVisible(false);
  windowManager.openWindow("gui/test/subDisp.xml", true);
  shell.setVisible(true);
 }
}


subDisp.xml

<?xml version="1.0" encoding="UTF-8"?>
<template xmlns="http://uruma.sandbox.seasar.org">
 <window title="メインメニュー" background="white" width="800" height="600">
  <gridLayout numColumns="1" >
   <gridData horizontalAlignment="FILL" widthHint="150"/>
  </gridLayout>

  <text id="title"/>
  <button id="button" text="ボタン"/>
  <button id="close" text="閉じる"/>
 </window>
</template>


SubDispAction.java

package gui.test;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.seasar.framework.container.annotation.tiger.Component;
import org.seasar.uruma.annotation.EventListener;
import org.seasar.uruma.annotation.Form;

@Component(name="subDispAction")
@Form(SubDispForm.class)
public class SubDispAction {
 public Shell shell;
 public SubDispForm subDispForm;

 public Text title;

 @EventListener(id="button")
 public void dispTitleValue() {
  title.setBackground(new Color(shell.getDisplay(), 255, 255, 80));
  title.setForeground(new Color(shell.getDisplay(), 255, 0, 0));
  MessageDialog.openInformation(shell, "TitleValue", subDispForm.getTitle());
 }

 @EventListener(id="close")
 public void subDispClose() {
  shell.close();
 }
}


これでサブウィンドウが表示されているときはメインメニューは非表示になって閉じるボタンが押下されるか×が押下されたらサブウィンドウが閉じて、メインメニューが表示されるようになります。

ボタンを押したら背景色が変化するようにしてみる。

アクションにコンポーネントを記述する。

Urumaではウィジット・インジェクションって言ってるやつ

SubDispAction.java
package gui.test;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.seasar.framework.container.annotation.tiger.Component;
import org.seasar.uruma.annotation.EventListener;
import org.seasar.uruma.annotation.Form;

@Component(name="subDispAction")
@Form(SubDispForm.class)
public class SubDispAction {
 public Shell shell;
 public SubDispForm subDispForm;

 public Text title;

 @EventListener(id="button")
 public void dispTitleValue() {
  title.setBackground(new Color(shell.getDisplay(), 255, 255, 80));
  MessageDialog.openInformation(shell, "TitleValue", subDispForm.getTitle());
 }
}


public Text title;がコンポーネントの記述(正確には違うんだろうが・・・。)

title.setBackground(Color color)で背景色を設定できる。

title.setForeground(Color color)で文字の色が設定できる。



この前の記事のフォームを使用しないでテキストフィールドを取得、セットする方法。

public Text title;

 @EventListener(id="button")
 public void dispTitleValue() {
  MessageDialog.openInformation(shell, "TitleValue", title.getText());
  title.setText("てすとだよ(=ω=)");
 }

これでボタンを押下したら入力した内容がダイアログに表示されて、OKを押下すると「てすとだよ(=ω=)」がテキストフィールドにセットされる。

実際フォームを使うのと使わないのどっちがいいんだろう・・・?

まぁフォームは使いまわしできるからそういうときはフォームを使用したほうがいいのかな??

カレンダー
02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
ブログ内検索
忍者ブログ [PR]

Graphics by Lame Tea / designed by 26℃