intra-mart e Builder for Accel Platform アプリケーション開発ガイド 第16版 2023-10-01

Seasar S2JDBC DtoとService生成

概要

この業務スケルトンは、SQLファイルからDtoクラスとServiceクラスを生成します。
エンティティ生成の業務スケルトンと異なり、SQLファイルのSQLを実行するServiceを生成します。このため、複雑なSQLの場合に有効です。
ここでは、この業務スケルトンの使用方法と制限事項について説明します。

対応データベース

OracleとPostgreSQLに対応しています(Oracle Database 12c Release 1とPostgreSQL 9.4で動作確認しています。)

使用方法

  1. アプリケーションルートパッケージ、アプリケーションパスを決定します。

  2. データベースにSQLファイルで使用するテーブルをあらかじめ作成しておきます。

  3. SQLファイルを配置します。
    SQLファイルの命名方法と配置場所については、「SQLファイル」を参照してください。
  4. 業務スケルトンを実行し、「DtoとService生成」を選択します。

  1. アプリケーションルートパッケージ、アプリケーションパスを入力します。

    基本情報の設定
  2. スキーマを選択します。

    スキーマ選択

    データベース接続先を選択してからスキーマを選択します

  3. 終了をクリックします。

    • エラーがある場合は、メッセージが示しているSQLファイルを修正してください。
  4. 入力Dto、出力Dto、Serviceクラスが出力されます。
    出力ファイルの形式については、「出力ファイル」を参照してください。

SQLファイル

SQLファイルの配置場所やファイル名が、出力するDtoクラスやServiceクラスのクラス名、メソッド名に対応します。
  • SQLファイルの配置場所
    src/main/resources配下に、以下の形式のディレクトリの下にsqlファイルを配置します。
    META-INF/sql/アプリケーションパス/クラス名
    
    「クラス名」の部分がServiceのクラス名「クラス名Service」、Dtoのクラス名「クラス名InDto」、「クラス名OutDto」になります。
    クラス名部分は、Javaのクラス名として正しい名前を付けてください。
  • SQLファイルの形式
    「メソッド名」の部分がServiceクラスの当SQLを発行するメソッドのメソッド名になります。
    メソッド名部分はアルファベットと数値のみが使用できます。
    Serviceクラスのメソッド名に対応しますので、Javaのメソッド名として正しい名前を付けてください。
    ファイル名のサフィックスは「.sql」とします。
    メソッド名.sql
    
    SQLファイル

    SQLファイル配置の例

SQL文は、2way SQLで記述します。「S2JDBC SQLファイルによる操作」を参照してください。
2way SQLの例
SELECT
   id,
   category,
   name
FROM
   tbl_item
WHERE
   category IN /*categories*/('computer')
ORDER BY
   /*$order*/id

出力ファイル

出力するファイルは、入力、出力Dto、Serviceクラスです。 各クラスのパッケージ、クラス名などは以下の通りです。

  • 入力、出力Dtoクラス

    • パッケージ
      「アプリケーションルートパッケージ.dto.アプリケーションパス」形式
    • クラス名
      入力Dtoクラス名: SQLファイルのクラス名部分 + メソッド名(Pascal形式) + InDto
      出力Dtoクラス名: SQLファイルのクラス名部分 + メソッド名(Pascal形式) + OutDto
    • 内容
      プロパティのアクセス修飾子はpublicです。getter、setterはありません。
  • Serviceクラス

    • パッケージ
      「アプリケーションルートパッケージ.service.アプリケーションパス」形式
    • クラス名
      SQLファイルのクラス名部分 + Service
      出力ファイル

      出力ファイルの例

以下の設定、SQLファイルがある場合

アプリケーションルートパッケージ jp.co.sample
アプリケーションパス item
sqlファイル
META-INF/sql/item/List/findByName.sql
META-INF/sql/item/List/findByCategories.sql

出力されるクラスは以下の通りです。

Serviceクラス jp.co.sample.service.item.ListService
findByNameのDtoクラス
jp.co.sample.dto.item.ListFindByNameInDto
jp.co.sample.dto.item.ListFindByNameOutDto
findByCategoriesのDtoクラス
jp.co.sample.dto.item.ListFindByCategoriesInDto
jp.co.sample.dto.item.ListFindByCategoriesOutDto

対応するデータ型

データベースのカラムの型とそれに対応するDtoクラスのプロパティの型は以下の通りです。
カラムの型 Javaの型
  oracle postgresql
文字列型
varchar
varchar2
char
varchar
char
text
String
数値型  
bigint
integer
smallint
java.math.BigInteger
number(n,0) numeric(n,0) java.math.BigInteger
number(n,m)
m != 0
numeric(n,m)
m != 0
java.math.BigDecimal
  real Float
  double precision Double
日付型 date date java.util.Date
  time java.sql.Time
timestamp timestamp java.sql.Timestamp
上の表にない型(論理型、通貨型、ラージオブジェクト型)は対応していません。Stringクラスとして出力されます。

制限事項

  • SELECT文のみに対応しています。INSERTやUPDATEなどは対象外です。

  • 条件句の左辺のコメント変数を取得できません。 右辺にコメント変数を記述してください。

    WHERE
       id = /*id*/1                  -- ok
       AND /*name*/'aoyagi' = name   -- ng
    
  • サブクエリのカラムの型を解決できません。

    • 例1 SELECT句中の例
      SELECT
         id,
         -- item_nameを型解決できない
         (SELECT name FROM item_table WHERE id = base.id) AS item_name,
         ...
      
    • 例2 WHERE句中の例
      -- totalを型解決できない
      (SELECT SUM(price) FROM item WHERE item_type = base.item_type) > /*total*/100
      
  • CASE式のカラムの型を解決できません。

    • 例1 SELECT句中の例
      SELECT
         id,
         -- item_nameの型解決できない
         CASE item_type
         WHEN /*itemTypeA*/'A' THEN name,
         WHEN /*itemTypeB*/'B' THEN detail_name,
         ELSE short_name END AS item_name
      
    • 例2 WHERE句中の例
      -- thresholdの型解決できない
      CASE item_type WHEN 'A' THEN height ELSE width END > /*threshold*/100
      
  • 日付型 + 数値型の型解決について

    colA + colB = /*var*/10 のようにした場合、varの型は左辺の1番目のカラムの型で解決します。

    date1 + 7 = /*var*/'2000-01-01'  -- varは日付型になる
    7 + date1 = /*var*/100           -- varは数値型になる
    
  • 対応している関数について

    以下の関数に対応しています。また、その型の扱いは以下の通りです。

    関数
    SUM パラメータと同じ型
    AVG パラメータと同じ型
    CHAR String
    CEILING java.math.BigInteger
    CEIL java.math.BigInteger
    FLOOR java.math.BigInteger
    MOD java.math.BigInteger
    POWER
    パラメータが整数の場合java.math.BigInteger
    それ以外の場合Double
    ROUND パラメータと同じ型
    SIGN
    パラメータが整数の場合java.math.BigInteger
    それ以外の場合Double
    CONCAT String
    CORRELATION Double
    CORR Double
    COUNT java.math.BigInteger
    MAX パラメータと同じ型
    MIN パラメータと同じ型
    STDDEV Double
    VARIANCE Double
    ABS パラメータと同じ型
    ACOS Double
    ASCII java.math.BigInteger
    ASIN Double
    ATAN Double
    ATAN2 Double
    CHR String
    COALESCE String
    COS Double
    COSH Double
    COT Double
    DEGREES Double
    EXP Double
    LOWER パラメータと同じ型
    LENGTH java.math.BigInteger
    LN Double
    LOG Double
    LTRIM パラメータと同じ型
    NULLIF パラメータと同じ型
    RTRIM パラメータと同じ型
    SIN Double
    SINH Double
    SQRT Double
    TAN Double
    TANH Double
    TO_DATE java.sql.Timestamp
    TRUNC パラメータと同じ型
    UPPER String

    SELECT
       -- 出力される型はcol_numberに対応するJavaの型となる
       SUM(col_number1) AS total
    ...
    HAVING
       -- 出力されるlower_limitの型はcol_number2に対応するJavaの型となる
       MAX(col_number2) > /*lower_limit*/10
    
  • ネストしたコメント変数には対応していません。 以下の様なネストした変数は対応していません。

    -- department.attach.user.user_cd のようなネストした変数には対応していません
    user_cd = /*department.attach.user.user_cd*/'aoyagi'
    -- paging.orderのようなネストした変数には対応していません
    ORDER BY /*$paging.order*/user_cd