Mybatis와 ibatis의 반복문에 대해서 알아보도록 하겠습니다.
보통 SQL 쿼리에서 IN절에 사용되는 방법입니다.
기본적으로 한 종류의 타입의 리스트 객체를 이용합니다.
Mybatis와 ibatis 태그를 나누어서 사용방법을 포스팅하겠습니다.
기본 ibatis 연동법에서 POM.XML의 IBATIS 관련 DEPENDENCY 설정부분을 빼고
포스팅을 하였습니다.
2014/11/17 - [개발에필요한연동법/스프링연동] - Spring3 + ibatis(아이바티스) 연동해보고 쿼리결과값 콘솔에 출력해보기
pom.xml에 추가해주실 DEPENDENCY 부분은 다음과 같습니다.
<dependency> <groupId>org.apache.ibatis</groupId> <artifactId>ibatis-sqlmap</artifactId> <version>2.3.4.726</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring-framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring-framework.version}</version> </dependency>
샘플테이블은 MySQL의 information_schema DB의 'TABLES' 테이블 기준으로 설명드리도록 하겠습니다.
※ 해당 샘플을 따라해보시려면 application-config.xml파일내에 존재하는
datasource태그의 url 값의 db명을 "information_schema"로 변경하시면 되겠습니다.
@RequestMapping("/list") public void list(){ try { Map<String, Object> hmap = new HashMap<String, Object>(); ArrayList<String> dbList = new ArrayList<String>(); dbList.add("mysql"); dbList.add("test"); hmap.put("dbList", dbList); studyDao.list(hmap); } catch (Exception e) { e.printStackTrace(); } }
public void list(Map<String, Object> hmap) throws SQLException;
@Override public void list(Map<String, Object> hmap) throws SQLException { query.selectList("query.list",hmap); }
@Override public void list(Map<String, Object> hmap) throws SQLException { query.queryForList("query.list",hmap); }
위코드를 보시면 DaoImpl에서 별도로 return 을 해주지 않았습니다.
그 이유는 단순하게 IN절내에 정상적인 Parameter값들이 들어가는지
쿼리로그로 확인을 하기위하여 별도의 return 타입을 작성하지 않았습니다.
마지막으로 Mybatis(foreach 태그)와 IBATIS(iterate 태그) 별 쿼리 XML 태그는 다음과 같습니다.
<select id="list" parameterType="java.util.Map" resultType="java.util.Map"> SELECT * FROM TABLES WHERE TABLE_SCHEMA IN <foreach item="item" index="index" collection="dbList" open="(" close=")" separator=","> #{item} </foreach> </select>
<select id="list" parameterClass="java.util.Map" resultClass="com.spring.study.vo.ListVo"> SELECT table_name FROM TABLES WHERE TABLE_SCHEMA IN <iterate property="dbList" open="(" close=")" conjunction=","> #dbList[]# </iterate> </select>
mybatis의 경우는 collection에 넘겨준 단일타입의 List객체명을 작성해주시면 되겠으며
ibatis의 경우는 property에 넘겨준 단일타입 List 객체명을 작성해주시면됩니다.
실행을 해보도록 하겠습니다.
List객체로 넘긴 Parameter가 정상적으로 구분자를 통하여 IN PARAMETER에 넘어왔으면
총 28개의 결과값을 출력한 것을 확인 할 수 있었습니다.
※ ibatis의 경우는 별도의 로그가 출력되지 않을것입니다.
에러가 안나면 정상적으로 쿼리조회가 완료 된것이므로 신경쓰지 않으셔도 되겠습니다.
mybatis처럼 resultClass를 Map타입으로 받아오지 못하는 관계로
임의로 VO 객체를 RESULTCLASS로 받게끔 처리해두었습니다.
by 개발로짜
Spring3 + Mybatis 연동 후 DBMS 종류별(MySQL,MSSQL,Oracle) 데이터 insert 후 시퀀스 가져오기 (0) | 2014.11.19 |
---|---|
mybatis와 ibatis별 동적태그 비교문 알아보도록 하자 (5) | 2014.11.17 |
Mybatis 이전버전인 ibatis + Spring3 에 대한 기본적인 연동법을 소개해보고자 합니다.
Spring 기본 연동법은 하단 포스팅을 참조해 주세요
2014/11/06 - [개발에필요한연동법/스프링연동] - STS 이클립스를 이용하여 UTF-8 인코딩 설정 및 Spring3 MVC 연동해보기
2014/11/06 - [개발에필요한연동법/스프링연동] - Spring3 한글깨짐 방지를 위한 UTF-8 인코딩 설정하기
2014/11/14 - [개발에필요한연동법/스프링연동] - Spring3 Maven을 이용하여 pom.xml에 oracle,mysql,mssql jdbc 라이브러리 등록하기
위 링크 기준으로 이어서 DB 설정에 대하여 포스팅 하도록 하겠습니다.
저는 Mybatis 연동법에 소개드렸듯이 MySQL 기준으로 아이바티스 연동을 하도록 하겠습니다.
2014/11/14 - [개발에필요한연동법/스프링연동] - Spring3 + MyBatis 기본설정 + 연동테스트 후 쿼리로그 확인해보기
/resources/spring/application-config.xml 설정부분을 보도록 하겠습니다.
<context:component-scan base-package="com.spring"/> <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://도메인:포트/db명" /> <property name="username" value="계정" /> <property name="password" value="비밀번호" /> </bean> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="classpath:sqlmap-config.xml"/> <property name="dataSource" ref="dataSource"/> </bean> </beans>
위와같이 설정을 하셨다면
"/resources/sqlmap-config.xml 파일을 하나 생성하고 다음 코드를 덮어씌워주세요
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" useStatementNamespaces="true" /> <sqlMap resource="query/query.xml" /> </sqlMapConfig>
"/resources/query/" 디렉토리 생성 후 query.xml파일을 생성 한 다음
하단 코드를 덮어씌워보도록 하겠습니다.
<?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="query"> <select id="ibatisSelect" resultClass="String"> SELECT 'TEST' </select> </sqlMap>
이번 포스팅은 간단하게 DB SELECT 테스트를 하기 위함으로써 Service 영역을 제외하고
Controller -> Dao 로 바로 호출하는 샘플 코드를 작성해보겠습니다.
@Autowired private StudyDao studyDao; @RequestMapping("/ibatisSelect") public void ibatisSelect(){ try { studyDao.ibatisSelect(); } catch (Exception e) { e.printStackTrace(); } }
public void ibatisSelect() throws SQLException;
@Repository public class StudyDaoImpl implements StudyDao { @Autowired private SqlMapClient query; public void ibatisSelect() throws SQLException { String result= (String)query.queryForObject("query.ibatisSelect"); System.out.println("결과값:"+result); } }
샘플코드들에 대한 작성이 완료되었다면 한번 실행결과를 확인해보도록 하겠습니다.
쿼리로그는 Mybatis와 다르게 출력되지않지만 결과값이 나왔다는 것은 Spring과 ibatis 와 연동이 되었다는 결과 입니다.
다음장은 logback.xml 파일로 쿼리출력을 하는것이 아닌
log4j 를 이용하여 쿼리로그 출력하는 포스팅을 하도록 하겠습니다 .
그다음 이어서 스프링 + 아이바티스 기본 연동에 추가로 트랜잭션 관련 포스팅을 다루겠습니다.
by 개발로짜
Spring3 MVC + HttpClient를 이용하여 GET/POST/Multipart API 웹서버 구축해보기 (2) | 2014.12.07 |
---|---|
Spring3 spring-task를 이용하여 스케줄러 연동 및 동작시켜보기 + DB연동(MySQL기준) (0) | 2014.11.24 |
Spring3 + Mybatis 여러개 Datasource 연동법(다중 트랜잭션 포함) (0) | 2014.11.16 |
Spring3 + Mybatis연동에 추가로 트랜잭션 설정 하여 실패시 Rollback 처리하기 (2) | 2014.11.14 |
Spring3 + MyBatis 기본설정 + 연동테스트 후 쿼리로그 확인해보기 (8) | 2014.11.14 |
이번에 다루고자 하는 Spring + Mybatis 포스팅은 다중DB 설정에 대하여 작성해보도록 하겠습니다.
SqlSession 객체에 "@Resource" 어노테이션을 이용하여 Datasource 구분을 지어 여러개의 DB 호출이 가능합니다.
이전 Mybatis 연동설정법은 다음 포스팅을 참고해주세요
2014/11/14 - [개발에필요한연동법/스프링연동] - Spring3 Maven을 이용하여 pom.xml에 oracle,mysql,mssql jdbc 라이브러리 등록하기
2014/11/14 - [개발에필요한연동법/스프링연동] - Spring3 + MyBatis 기본설정 + 연동테스트 후 쿼리로그 확인해보기
2014/11/14 - [개발에필요한연동법/스프링연동] - Spring3 + Mybatis연동에 추가로 트랜잭션 설정 하여 실패시 Rollback 처리하기
@Resource 어노테이션을 위해서는 pom.xml에 하단 dependency를 추가해주도록 합니다.
<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.2</version> </dependency>
기존 application-config.xml 내에 Datasource 설정코드가 하나 설정 되어있었습니다.
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="드라이버클래스" /> <property name="url" value="jdbc:mysql://도메인:포트/db명" /> <property name="username" value="계정" /> <property name="password" value="패스워드" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath*:query/**" /> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory" /> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" rollback-for="Exception"/> <tx:method name="update*" rollback-for="Exception"/> <tx:method name="delete*" rollback-for="Exception"/> </tx:attributes> </tx:advice>
기존 설정되어있는 위 4가지 bean 태그와 tx:advice 태그를 복사하여 붙여넣기를 합니다.
각 태그들의 id / ref를 변경해주도록 합니다.
추가로 tx:advice 의 transaction-manager속성같을 변경합니다.
<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="드라이버클래스" /> <property name="url" value="jdbc:mysql://도메인:포트/db명" /> <property name="username" value="계정" /> <property name="password" value="패스워드" /> </bean> <bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource2" /> <property name="mapperLocations" value="classpath*:query/**" /> </bean> <bean id="sqlSession2" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory2" /> </bean> <bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource2"/> </bean> <tx:advice id="txAdvice2" transaction-manager="transactionManager2"> <tx:attributes> <tx:method name="save*" rollback-for="Exception"/> <tx:method name="update*" rollback-for="Exception"/> <tx:method name="delete*" rollback-for="Exception"/> </tx:attributes> </tx:advice>
기존 aop:config 태그내에 다음 태그 추가를 해주도록 합니다.
<aop:advisor id="transactionAdvisor2" pointcut-ref="serviceOperation" advice-ref="txAdvice2"/>
본인이 사용하고자 하는 db의 가상호출 테이블은 다음과 같습니다.
위 테이블의 COUNT 쿼리를 실행하여 콘솔창에 카운트 수를 출력해보고자 합니다.
위처럼 각 테이블마다 카운트가 이클립스 콘솔창에 동일하게 출력된다면 mybatis 다중 db 연동이 성공한 것일 겁니다.
Controller/Service/Dao 부분 샘플코드를 작성해보도록 합니다.
@RequestMapping("/multipledb") public void multipledb(){ try { studyService.multipledb(); } catch (SQLException e) { e.printStackTrace(); } }
public void multipledb() throws SQLException;
public void multipledb() throws SQLException { dao.multipledb1(); dao.multipledb2(); }
public void multipledb1() throws SQLException; public void multipledb2() throws SQLException;
public void multipledb1() throws SQLException { int count = query.selectOne("query.multipledb1"); System.out.println("test.mybatis_table COUNT 결과:"+count); } public void multipledb2() throws SQLException { int count = query2.selectOne("query.multipledb2"); System.out.println("sample.grid_sample COUNT 결과:"+count); }
DaoImpl 기존 Sqlsession 인터페이스부분을 다음처럼 변경을 해줍니다.
@Autowired @Resource(name="sqlSession") private SqlSession query; @Autowired @Resource(name="sqlSession2") private SqlSession query2;
마지막 query.xml에 다음 코드를 추가로 결과 확인을 해보도록 하겠습니다.
<select id="multipledb1" resultType="Integer"> SELECT COUNT(*) FROM mybatis_table </select> <select id="multipledb2" resultType="Integer"> SELECT COUNT(*) FROM grid_sample </select>
위처럼 @Resource 어노테이션별로 실행한 결과를 콘솔상에서 확인이 되었습니다.
실행결과, 상단 DB툴에서 조회한 COUNT 갯수와 동일한 결과가 나온것을 확인 할 수 있었습니다.
by 개발로짜
Spring3 spring-task를 이용하여 스케줄러 연동 및 동작시켜보기 + DB연동(MySQL기준) (0) | 2014.11.24 |
---|---|
Spring3 + ibatis(아이바티스) 연동해보고 쿼리결과값 콘솔에 출력해보기 (5) | 2014.11.17 |
Spring3 + Mybatis연동에 추가로 트랜잭션 설정 하여 실패시 Rollback 처리하기 (2) | 2014.11.14 |
Spring3 + MyBatis 기본설정 + 연동테스트 후 쿼리로그 확인해보기 (8) | 2014.11.14 |
Spring3 Maven을 이용하여 pom.xml에 oracle,mysql,mssql jdbc 라이브러리 등록하기 (0) | 2014.11.14 |