<sql:query>
SYNOPSIS
| var*="変数名" |
| scope="page|request|session|application" |
| sql="SQL" |
| dataSource="データソース" |
| startRow="0|数値" |
| maxRows="-1|数値" |
| <sql:param> * | - | クエリーの SQL にパラメータを埋め込みます. |
| <sql:dateParam> * | - | クエリーの SQL に日付型のパラメータを埋め込みます. |
| sql 属性を省略した場合の SQL. | ||
説 明
タグの内部または sql 属性で定義されたクエリーを実行します。
PreparedStatement#executeQuery()
の処理に相当します。
クエリーが実行された時点で条件に一致する全ての行が読み込まれて変数に格納されます。取得するレコードの件数には十分注意してください。
SQL 条件などに可変値を埋め込みたい場合は <sql:param>
を使用してください。SQL 上に文字列として直接埋め込むと
SQL インジェクション
などを引き起こす可能性があるため危険です。
属 性
var 属性で指定した変数を格納するスコープです。
page, request, session, application
のいずれかを指定できます。
実行する SQL を指定します。文字列内のプレースホルダ ? はタグ内で定義した <sql:param>,
<sql:dateParam> とマップされます。
この sql 属性を省略した場合はタグ内の評価結果が SQL として使用されます。
このクエリーの実行で使用する java.sql.Connection のデータソースを指定します。以下のいずれかを使用できます。
-
jdbc/XXX形式のデータソース名 (文字列) -
jdbc:dbname:database形式の JDBC URL (文字列) -
<sql:setDataSource>でデータソースを設定した変数
個別にデータソースや JDBC URL を指定した場合のトランザクションスコープはこのクエリーの実行だけに限定されます (自動コミットと似た動きになります)。また JDBC URL が指定された場合はコネクションプールは使用されません。
取得する結果セットの開始位置を指定します。 0 を指定した場合は最初の行から取得を行います。
これは一致したレコードから範囲外のものを読み飛ばしているにすぎないため、大量の一致レコードから一部のみを抜き出すのには向いていません
(RDBMS レベルの最適化が行われません)。この属性を使用する前に SQL で同等の絞込み (LIMIT n OFFSET
m や FETCH FIRST n ROWS ONLY など)
が行えないか検討してください。
内 容
使用例
FOO が保持している BAR 列を列挙します。結果の列挙には <c:forEach> を使用します。
<sql:query var="rs" sql="SELECT ID,BAR FROM FOO" dataSource="jdbc/MYDS" /> <c:forEach var="r" items="${rs.rows}"> <c:out value="${r.id}" />. <c:out value="${r.bar}" /><br> </c:forEach>
1. Alpha 2. Beta 3. Gamma 4. Delta 5. Epsilon
PreparedStatement のような埋め込みパラメータが必要な場合はタグ内で <sql:param>, <sql:dateParam>
を使用します。この時、パラメータの順番は対応する ? の出現順序とあわせる必要があります。
<sql:query var="rs"
sql="SELECT ID,BAR FROM FOO WHERE ID=?" dataSource="jdbc/MYDS">
<sql:param>3</sql:param>
</sql:query>
<c:forEach var="r" items="${rs.rows}">
<c:out value="${r.id}" />. <c:out value="${r.bar}" /><br>
</c:forEach>
3. Gamma
<sql:query var="rs" dataSource="jdbc/MYDS">
SELECT ID,BAR FROM FOO WHERE ID=?
<sql:param>3</sql:param>
</sql:query>
<c:forEach var="r" items="${rs.rows}">
<c:out value="${r.id}" />. <c:out value="${r.bar}" /><br>
</c:forEach>
3. Gamma
id に該当するレコードを表示しますが、省略されている場合は全件表示を行います。
<sql:query var="rs">
SELECT ID,BAR FROM FOO
<c:if test="${not empty param['id']}">
WHERE ID=?
<sql:param>${param['id']}</sql:param>
</c:if>
</sql:query>
<c:forEach var="r" items="${rs.rows}">
<c:out value="${r.id}" />. <c:out value="${r.bar}" /><br>
</c:forEach>
</sql:transaction>
2. Beta 3. Gamma 4. Delta 5. Epsilon 1. Alpha
id=2 を指定した場合:
2. Beta
id=4+or+id%3D3 ("4 or id=3")
を指定した場合:
なし
<sql:param> を使用しないで単純な連結により生成した SQL でも実行してみました。
<sql:query var="rs">
SELECT ID,BAR FROM FOO
<c:if test="${not empty param['id']}">
WHERE ID=${param['id']}
</c:if>
</sql:query>
id=4+or+id%3D3 を指定した結果は以下の通り。
SQL インジェクションが発生しています。
3. Gamma 4. Delta