JSTL SQL Tags


JSTL sql 태그는 이름 그대로 sql 관련 작업을 처리하기 위한 태그 라이브러리이다.


JSP의 시작 부분에 taglib 정의를 추가한다.

1
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>



<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에 설정된 값이 사용된다.


예제)


Posted by 후니아부지
: