JSTL SQL Tags
JSTL sql 태그는 이름 그대로 sql 관련 작업을 처리하기 위한 태그 라이브러리이다.
JSP의 시작 부분에 taglib 정의를 추가한다.
<sql:setDataSource> Tag
DataSource를 지정한다.
<sql:setDataSource {dataSource="데이터소스" | url="jdbc Url"}
driver="드라이버 클래스 명"
user="DB 사용자 계정"
password="DB 사용자 패스워드"
var="변수에 DataSource 스펙 저장"
scope="{page | request | session | application"} />
Name |
Required |
Request-time |
Type | Desc |
var |
false |
false |
java.lang.String | 변수에 DataSource 스펙 저장 |
scope |
false |
false |
java.lang.String | 변수 공유 범위 |
dataSource |
false |
true |
java.lang.String | 컨텍스트에 JNDI 설정 시 Resource Name |
driver |
false |
true |
java.lang.String | 드라이버 클래스 명 |
url |
false |
true |
java.lang.String | JDBC URL |
user |
false |
true |
java.lang.String | DB 사용자 계정 |
password |
false |
true |
java.lang.String | DB 사용자 패스워드 |
MySQL의 경우로 예를 들어 보자.
MySQL Community Server 설치 시 기본적으로 만들어지는 world 테이블을 이용한다.
사용자 계정은 root를 사용하고 패스워드는 12345678 이다.
<sql:setDataSource url="jdbc:mysql://localhost:3306/world"
driver="com.mysql.jdbc.Driver"
user="root"
password="12345678"
var="ds"
scope="session" />
이렇게 생성한 DataSource인 ds는 <sql:query> 태그에서 사용할 수 있다.
DataSource를 얻는 다른 방법으로 DBCP를 사용할 수 있다.
※ 참고: [Servlet] DBCP(Database Connection Pool)를 사용한 DB 연결
프로젝트/META-INF/Context.xml에 다음과 같이 연결 정보를 작성한다.
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/myconn"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
driverClassName="org.gjt.mm.mysql.Driver"
url="jdbc:mysql://localhost:3306/world?AutoReconnect=true"
username="root"
password="12345678"
maxActive="100"
maxIdle="30"
maxWait="60"
removeAbandoned="true"
removeAbandonedTiemout="60" />
</Context>
DBCP를 사용할 때는 다음과 같이 dataSource 속성에 리소스 이름을 쓰면 된다.
<sql:setDataSource dataSource="jdbc/myconn" var="ds" scope="session" />
<sql:param>, <sql:dateParam> Tag
날짜 형식 파라미터에는 <sql:dataParam>을 문자열 형식 파라미터에는 <sql:param> 을 사용한다.
<sql:param value="값" />
Name | Required | Request-time | Type | Desc |
value | false | true | java.lang.String | 파라미터 값 |
<sql:dateParam value="값" type="{timestamp | time | date}" />
Name | Required | Request-time | Type | Desc |
value | true | true | java.lang.String | DATE, TIME, TIMESTAMP 값 |
type | false | true | java.lang.String | data, time, timestamp 중 하나를 쓴다. |
<sql:query> Tag
sql 태그의 속성 또는 body에 정의된 쿼리 문장을 실행한다.
<sql:qeury var="varName"
dataSource="dataSource"
sql="sqlQuery"
scope="{page | request | session | application}"
maxRows="maxRows"
startRow="startRow" />
Name |
Required |
Request-time |
Type |
Desc |
var |
true |
false |
java.lang.String |
쿼리의 결과를 저장. |
dataSource |
false |
true |
java.lang.String |
JNDI Resource Name or DriverManager를 위한 파라미터 |
sql |
false |
true |
java.lang.String |
쿼리 문장 |
scope |
false |
false |
java.lang.String |
변수 공유 범위 |
maxRows |
false |
true |
java.lang.String |
쿼리 결과에 포함될 최대 행의 수 |
startRow |
false |
true |
java.lang.String |
쿼리 결과에 포함될 시작 행 번호. 0부터 시작. |
다음은 모두 동일한 결과를 보인다.
<sql:query sql="select * from country where Continent='Asia' and Region='Middle East'"
var="rs" dataSource="${ds}" />
<c:set var="param1" value="Asia" />
<c:set var="param2" value="Middle East" />
<sql:query sql="select * from country where Continent=? and Region=?"
var="rs" dataSource="${ds}">
<sql:param value="${param1}" />
<sql:param value="${param2}" />
</sql:query>
<c:set var="param1" value="Asia" />
<c:set var="param2" value="Middle East" />
<sql:query var="rs" dataSource="${ds}">
select * from country where Continent=? and Region=?
<sql:param value="${param1}" />
<sql:param value="${param2}" />
</sql:query>
<sql:update> Tag
INSERT, UPDATE, DELETE 과 같은 데이터를 반환하지 않는 SQL 문장을 실행시키는데 사용한다.
<sql:update var="varName"
dataSource="dataSource"
sql="sqlQuery"
scope="{page | request | session | application}" />
Name | Required | Request-time | Type | Desc |
var | true | false | java.lang.String | 쿼리에 영향을 받은 rows 카운트 |
dataSource | false | true | java.lang.String | JNDI Resource Name or DriverManager를 위한 파라미터 |
sql | false | true | java.lang.String | 쿼리 문장 |
scope | false | false | java.lang.String | 변수 공유 범위 |
<sql:param> 태그 과 함께 사용하는 방법은 <sql:query> 태그와 동일하다.
<sql:transaction> Tag
transaction을 만들 때 사용한다. 한 transaction에 여러 개의 query, update를 사용할 수 있다.
<sql:transaction dataSource="dataSource" isolation="isolationLevel">
<sql:query>
<sql:update>
....
</sql:transaction>
Name |
Required |
Request-time |
Type |
Desc |
dataSource |
false |
true |
java.lang.String |
JNDI Resource Name or DriverManager를 위한 파라미터 |
isolation |
false |
true |
java.lang.String |
READ_COMMITED, READ_UNCOMMITED, REPEATABLE_READ, SERIALIZABLE 중 한 값을 가진다. 기본 값으로 dataSource에 설정된 값이 사용된다. |
예제)
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>JSTL Test7</title>
</head>
<body>
<sql:setDataSource dataSource="jdbc/myconn" var="ds" scope="session" />
<c:set var="param1" value="Asia" />
<c:set var="param2" value="Middle East" />
<sql:query var="rs" dataSource="${ds}">
select * from country where Continent=? and Region=?
<sql:param value="${param1}" />
<sql:param value="${param2}" />
</sql:query>
<table border="1">
<tr>
<c:forEach var="columnName" items="${rs.columnNames}">
<th> <c:out value="${columnName}"/> </th>
</c:forEach>
</tr>
<c:forEach var="row" items="${rs.rowsByIndex}">
<tr>
<c:forEach var="column" items="${row}" varStatus="i">
<td>
<c:if test="${column != null}">
<c:out value="${column}" />
</c:if>
<c:if test="${column == null}">
</c:if>
</td>
</c:forEach>
</tr>
</c:forEach>
</table>
</body>
</html>