Javaに関する様々な情報をご紹介します。

6Standard Taglibs:SQLタグライブラリ

Javaに関する様々な情報をご紹介します。

Standard Taglibs:SQLタグライブラリ

ここでは、Standard Taglibsで定義されている、SQLタグライブラリについて解説します。SQLタグライブラリでは、DBとの接続、DBへのデータ検索、挿入、更新、削除を行うタグが定義されています。

実行環境
  • ・WindowsXP Home Edition
  • ・J2SDK 1.4.2_04
  • ・Tomcat 5.0.18
  • ・Standard Taglib 1.1.0

SQLタグライブラリの一覧

SQLタグライブラリで定義されているタグを以下に記載します。

タグ 内容
<sql:setDataSource> DBへの接続情報を持つ、DataSourceオブジェクトを作成する。
<sql:query> SQL文を実行し、DB内のデータを検索する。
<sql:update> 挿入、更新、削除、テーブル作成など検索以外のSQL文を実行する。<sql:update>タグ単位でSQL文はコミットされる。
<sql:transaction> <sql:transaction>タグ内に記載される<sql:query>タグ、<sql:update>タグを1トランザクションとして管理し、いずれかのタグの処理が失敗した場合、<sql:transaction>タグ内のすべての処理がロールバックされる。
<sql:dateParam> <sql:query>タグ、<sql:update>タグのサブタグとして使用し、SQL文の?を置き換える値を指定する。値はテーブル内のDATE型、TIME型、TIMESTAMP型のカラムに適用される。
<sql:param> <sql:query>タグ、<sql:update>タグのサブタグとして使用し、SQL文の?を置き換える値を指定する。?が複数ある場合は<sql:param>タグの設定順に適用される。

SQLタグライブラリの使用例

<sql:setDataSource>

構文1

<sql:setDataSource {dataSource="DB接続設定" | url="JDBCドライバへのURL"
   [driver="JDBCドライバのクラス"]
   [user="ユーザID"]
   [password="パスワード"]}
   [var="変数名"]
   [scope=”{page|request|session|application}”]/>

属性
属性 内容 必須
var DBへの接続情報として作成されたDataSourceオブジェクトを代入する変数。他のタグでDataSourceオブジェクトを指定する際に使用する。 ×
scope DateSourceオブジェクトが代入された変数のスコープを設定する。スコープはpage、request、session、applicationのいずれかを設定できる。デフォルトでは、pageが設定されている。 ×
dataSource あらかじめDBへの接続設定が行われている場合に、その接続設定情報を指定する。接続設定はDataSourceオブジェクト、JNDIリソース、JDBCパラメータのいずれかが設定できる。 ×
driver JDBCドライバのクラスを指定する。 ×
url JDBCドライバに接続するためのJDBC準拠のURLを指定する。 ×
user データベースに接続するためのユーザIDを指定する。 ×
password データベースに接続するためのパスワードを指定する。 ×

サンプルコード: DataSourceオブジェクトを作成する際の典型的な設定例です。

<sql:setDataSource var="example" driver="RmiJdbc.RJDriver"
        url="jdbc:rmi://localhost:1099/jdbc:cloudscape:CloudscapeDB;create=true"/>

<sql:query>

構文1

<sql:query sql="SQL文"
  var="変数名"
  [scope=”{page|request|session|application}”]
  [dataSource=”DB接続設定”]
  [maxRows="最大返信行数"]
  [startRow="返信開始行"]/>

構文2

<sql:query sql="SQL文"
    var="変数名"
    [scope=”{page|request|session|application}”]
    [dataSource=”DB接続設定”]
    [maxRows="最大返信行数"]
    [startRow="返信開始行"]>
  <sql:param>SQL文のパラメータ
</sql:query>

構文3

<sql:query var="変数名"
    [scope=”{page|request|session|application}”]
    [dataSource=”DB接続設定”]
    [maxRows="最大返信行数"]
    [startRow="返信開始行"]>
  SQL文
  <sql:param>SQL文のパラメータ
</sql:query>

属性
属性 内容 必須
var SQL文の実行結果が代入される変数を指定する。
scope SQL文の実行結果が代入された変数のスコープを設定する。スコープはpage、request、session、applicationのいずれかを設定できる。デフォルトでは、pageが設定されている。 ×
sql 実行するSQL文を指定する。 ×
dataSource あらかじめDBへの接続設定が行われている場合に、その接続設定情報を指定する。接続設定はDataSourceオブジェクト、JNDIリソース、JDBCパラメータのいずれかが設定できる。 ×
startRow 実行結果の何行目から返すかを指定する。 ×
maxRows 実行結果が返す最大行数を指定する。デフォルトの設定ではすべての実行結果が返される。 ×

サンプルコード: SQL文(SELECT * FROM mytable)の実行結果を変数deejaysに代入しています。

<sql:query var="deejays">
    SELECT * FROM mytable
</sql:query>

サンプルコード2: DataSourceオブジェクトを指定して、SQL文を実行しています。実行結果は、変数rsSelectに設定されます。実行結果の1行目(firstName)を取得する場合は、rsSelect.rows[0].firstNameと指定します。

<sql:query var="rsSelect" dataSource="${example}"
    sql="select firstName, address from member where id = 'aiueo';" />
<c:set var="firstName" value="${rsSelect.rows[0].firstName}" />

サンプルコード3: SQLの実行結果の数を取得するサンプルです。count(*)を別名(countNum)で指定しているのがポイントです。別名の実行結果を、rsCount.rows[0].countNumで取得しています。

<sql:query var="rsCount" dataSource="${example}"
    sql="select count(*) countNum from member where address = 'Tokyo';" />
<c:set var="countNum" value="${rsCount.rows[0].countNum}" />

サンプルコード4: SQLの実行結果を<c:forEach>タグを使用して表示するサンプルです。items属性で指定された値を順に表示しています。

<sql:query var="rsSelect" dataSource="${example}"
        sql="select firstName, address from member where id = 'aiueo';" />
<c:forEach var="rowSelect" items="${rsSelect.rows}">
    ${rowSelect.firstName}${rowSelect.address}<br>
</c:forEach>

<sql:update>

構文1

<sql:update sql="SQL文"
   [dataSource=”DB接続設定”]
   [var="変数名"]
   [scope=”{page|request|session|application}”]/>

構文2

<sql:update sql="SQL文"
     [dataSource=”DB接続設定”]
     [var="変数名"]
     [scope=”{page|request|session|application}”]>
  <sql:param>SQL文のパラメータ
</sql:update>

構文3

<sql:update [dataSource=”DB接続設定”]
     [var="変数名"]
     [scope=”{page|request|session|application}”]>
  SQL文
  <sql:param>SQL文のパラメータ
</sql:update>

属性
属性 内容 必須
var SQL文の実行結果が代入される変数を指定する。変数の型はInteger型になる。 ×
scope SQL文の実行結果が代入された変数のスコープを設定する。スコープはpage、request、session、applicationのいずれかを設定できる。デフォルトでは、pageが設定されている。 ×
sql 実行するSQL文を指定する。 ×
dataSource あらかじめDBへの接続設定が行われている場合に、その接続設定情報を指定する。接続設定はDataSourceオブジェクト、JNDIリソース、JDBCパラメータのいずれかが設定できる。 ×

サンプルコード: SQL文(INSERT INTO mytable VALUES (1,'Paul Oakenfold'))をしています。

<sql:update var="updateCount">
    INSERT INTO mytable VALUES (1,'Paul Oakenfold')
</sql:update>

<sql:transaction>

構文1

<sql:transaction [dataSource=”DB接続設定”] [isolation=isolationレベル]>
   <sql:query>タグ、<sql:update>タグ
</sql:transaction>

属性
属性 内容 必須
dataSource あらかじめDBへの接続設定が行われている場合に、その接続設定情報を指定する。接続設定はDataSourceオブジェクト、JNDIリソース、JDBCパラメータのいずれかが設定できる。 ×
isolation isolationレベルを指定する。isolationレベルは「read_committed」、「read_uncommitted」、「repeatable_read」、「serializable」のいずれかが指定できる。デフォルトではDB接続設定に指定されているisolationが適用される。 ×

サンプルコード: <sql:transaction>タグ内で実行される<sql:update>タグが失敗した場合はすべての<sql:upsate>タグの実行結果がロールバックされます。

<sql:transaction dataSource="${example}">
    <sql:update var="updateCount">
        INSERT INTO mytable VALUES (1,'Paul Oakenfold')
    </sql:update>
    <sql:update var="updateCount">
        INSERT INTO mytable VALUES (2,'Timo Maas')
    </sql:update>
    <sql:update var="updateCount">
        INSERT INTO mytable VALUES (3,'Paul van Dyk')
    </sql:update>
</sql:transaction>

<sql:dateParam>

構文1

<sql:dateParam value=”パラメータ値” [type=”{timestamp|time|date}”]/>

属性
属性 内容 必須
value テーブル内のDATE型、TIME型、TIMESTAMP型のカラムに対して、SQL文の?を置き換える値を指定する。
type value属性で指定された値の型を指定する。date、time、timestampのいずれかを指定する。 ×

<sql:param>

構文1

<sql:param value=”パラメータ値”/>

構文2

<sql:param>
  パラメータ値
</sql:param>

属性
属性 内容 必須
value SQL文の?を置き換える値を指定する。 ×

サンプルコード: SQL文内の?を該当する<sql:param>タグの値に置き換えて実行しています。

<sql:update var="updateCount">
    INSERT INTO mytable VALUES (?,?)
    <sql:param value="3"/>
    <sql:param value="${newName}"/>
</sql:update>

6Standard Taglibs:SQLタグライブラリ