SqlMapClientDaoSupport
1181804571.bmp
MySQL에 만들어둔 Member 테이블에 iBatis를 사용해서 SQL을 날리는 Member.xml에 있는 sql의 ID를 호출하는 SqlmapMemberDao가 상속받고 있는 SqlMapClientDaoSupport에 대해서 조사해 봅니다.
스프링 레퍼런스 12.5 를 참고하면 다음과 같은 표를 볼 수 있습니다.
1363766640.bmp
저는 iBATIS 2,0을 사용하기에 DAO 클래인 SqlmapMemberDao가 SqlMapClientDaoSupport 클래스를 상위 클래스로 상속받도록 했습니다.
1072221328.bmp
그리고 SqlMapClientDaoSupport에서 사용되는 SqlMapClient 객체를 DI(dependency injection)하기 위해 daocontext-member.xml에 다음과 같이 코딩합니다.
1361370266.bmpsqlMapClient 객체는 사용할 SqlMap을 다음과 같이 sql-map-config.xml 에 코딩해 둡니다.
1122443480.bmp여기서 사용하기로 한 Member.xml 파일을 보면 다음과 같습니다.
[#M_ more.. | less.. |
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Member">
<!-- alias -->
<typeAlias alias="member" type="net.webapp2.member.domain.Member" />
<!-- result map -->
<resultMap id="memberMap" class="member">
<result property="id" column="id" />
<result property="name" column="name" />
<result property="messengerId" column="messengerId" />
<result property="email" column="email" />
<result property="blugAddress" column="blugAddress" />
<result property="phone" column="phone" />
</resultMap>
<!-- insert -->
<insert id="insert" parameterClass="member">
INSERT INTO Member(name, email
<isNotNull property="messengerId">, messengerId</isNotNull>
<isNotNull property="phone">, phone</isNotNull>
<isNotNull property="blugAddress">, blugAddress </isNotNull>)
VALUES(#name#, #email#
<isNotNull property="messengerId">, #messengerId#</isNotNull>
<isNotNull property="phone">, #phone#</isNotNull>
<isNotNull property="blugAddress">, #blugAddress#</isNotNull>);
</insert>
<!-- select -->
<select id="count" resultClass="int">
SELECT COUNT(id)
FROM Member;
</select>
<select id="getMember" resultMap="memberMap">
SELECT id, name, messengerId, email, blugAddress, phone
FROM Member
WHERE id = #id#;
</select>
<select id="getByName" resultMap="memberMap">
SELECT id, name, messengerId, email, blugAddress, phone
FROM Member
WHERE name = #name#;
</select>
<select id="getAllMember" resultMap="memberMap">
SELECT id, name, messengerId, email, blugAddress, phone
FROM Member;
</select>
<!-- update -->
<update id="update" parameterClass="member">
UPDATE Member
<dynamic prepend="SET">
<isNotNull property="name" prepend=",">
name = #name#
</isNotNull>
<isNotNull property="messengerId" prepend=",">
messengerId = #messengerId#
</isNotNull>
<isNotNull property="email" prepend=",">
email = #email#
</isNotNull>
<isNotNull property="blugAddress" prepend=",">
blugAddress = #blugAddress#
</isNotNull>
<isNotNull property="phone" prepend=",">
blugAddress = #blugAddress#
</isNotNull>
</dynamic>
WHERE id = #id#;
</update>
<!-- delete -->
<delete id="deleteById" parameterClass="int">
DELETE from Member WHERE id = #id#
</delete>
</sqlMap>
_M#]
이렇게 설정파일에 해당하는 iBatis Sql Map 2.0 과 JDBC인 datasource를 SqlMapClientFactoryBean 타입의 객체인 sqlMapClient의 속성으로 DI 시킵니다.
[#M_ more.. | less.. |
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- DataSource -->
<!-- MySQL -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/adressbook?autoReconnect=true" />
<property name="username" value="keesun" />
<property name="password" value="keesun" />
</bean>
<!-- SqlMap setup for iBATIS Database Layer -->
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation"
value="file:conf/sql-map-config.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- Transaction Manager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
_M#]
글로 정리하다 보니까 이제 눈에 조금 보이네요.
SqlMapClientDaoSupport라는 클래스에서 SqlMapClient 객체를 사용하기 때문에 이것을 와이어링 해주는데.. SqlMapClieint는 org.springframework.orm.ibatis.SqlMapClientFactoryBean 이 타입이며 SqlMapClientFactoryBean을 정의 할때는 configLocation 이것과 dataSource 를 와이어링 해줘야 한다.
configLocation은 이곳에서 사용할 iBATIS sql map에 대한 정보를 가지고 있는 sql-map-config.xml 파일로 지정해주고 sql-map-config.xml에는 member.xml파일이 지정되어 있고 member.xml은 iBATIS를 사용하고 있다.
datasource는 db connection객체를 생성하기 위한 네 가지 정보에 값을 setting한다.