com.manager.dao.ManagerDAOImpl.java


@Repository
public class ManagerDAOImpl implements ManagerDAO{
		private Logger logger = Logger.getLogger(getClass());
		@Resource(name = "sqlMapClientTemplate")
		private SqlMapClientTemplate sqlMapClientTemplate;

		@SuppressWarnings("unchecked")
		public List<VcardInformation> select(){
		List<VcardInformation> vlist = null;
		try{
			vlist = (List<VcardInformation>)sqlMapClientTemplate.queryForList("vcard.select");
			if(vlist == null){
				return new ArrayList<VcardInformation>();
			}
		}catch(Exception e){
			e.printStackTrace();
			logger.fatal(e.getMessage());
		}
		
		return vlist;
	}
}

- DB조회 select() 함수. VcardInformation 객체로 여러 컬럼의 객체를 List화하여 받아온다.

- 칼럼별 데이터를 resultMap에 맵핑된 데이터 변수에 맞게 맵핑되어 객체화 된다.

- 위의 경우 조회된 DB데이터들을 VcardInformation 리스트화하여 처리가능한 정보로 가공한다.



'DB > iBatis' 카테고리의 다른 글

iBatis 구현 - 6 Xml맵핑- .vo.xxx.java  (0) 2012.03.29
iBatis 구현 - 5 xxxDAO.xml  (0) 2012.03.29
iBatis 구현 - 4 sqlMapConfig.xml  (0) 2012.03.29
iBatis에서 HashMap의 활용  (2) 2012.03.29
iBatis 구현 - 3 xxx-servlet.xml 작성  (0) 2012.03.28

이것은 iBatis라기 보다는 jaxb 마샬링구현이기는 하나 일단 iBatis변수 맵핑에 중요한 주제이므로 

iBatis로 일단 설명하겠다.

om.manager.vo.vcard.VcardInformation.java

package com.manager.vo.vcard;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="VcardInformation",
		propOrder ={"name","addr","cell","tel","fax","email"})
public class VcardInformation {
	@XmlElement(name="name")
	private String name;
	@XmlElement(name="addr")
	private String addr;
	@XmlElement(name="cell")
	private String cell;
	@XmlElement(name="tel")
	private String tel;
	@XmlElement(name="fax")
	private String fax;
	@XmlElement(name="email")
	private String email;
	
	public VcardInformation(){		
	}
	public VcardInformation(VcardInformation vc){
		this.name = vc.name;
		this.addr = vc.addr;
		this.cell = vc.cell;
		this.tel = vc.tel;
		this.fax = vc.fax;
		this.email = vc.email;		
	}
	public String getName(){
		return this.name;
	}
	public String getAddr(){
		return this.addr;
	}
	public String getCell(){
		return this.cell;
	}
	public String getTel(){
		return this.tel;
	}
	public String getFax(){
		return this.fax;
	}
	public String getEmail(){
		return this.email;
	}
	public void setName(String name){
		this.name = name;
	}
	public void setAddr(String addr){
		this.addr = addr;
	}
	public void setCell(String cell){
		this.cell = cell;
	}
	public void setTel(String tel){
		this.tel= tel;
	}
	public void setFax(String fax){
		this.fax = fax;
	}
	public void setEmail(String email){
		this.email = email;
	}
}


중요한점은 @ 어노테이션 들이다.

@XmlType으로 객체안에 쓰일 변수의 수만큼 propOrder를 순서에 맞게 배열한다.

@XmlElement로 DB수납시 쓰일 변수의 이름을 설정한다. 즉 이 이름이 앞서 나온 #strVar#이 되는것이다.

위의 경우 #name#을 쓰게 되면 String name이 선택되게 된다. 어노테이션을 맞게 써준다면  변수의 이름은 관련없다.

get/set 함수를 알맞게 써줌으로 인해 xxxDAO.xml에서 가져오는 데이터를 원하는곳에 뿌려주고, 전달할수 있게 된다.

ex) setName("정영민") -> .insert호출 #name# 에는 정영민이 담김. 

.select ->VcardInformation객체 받아옴. var= getName()  var에 정영민이 담겨오게됨

(많은부분 생략)






'DB > iBatis' 카테고리의 다른 글

iBatis구현 7 - xxxDAO.java  (0) 2012.03.29
iBatis 구현 - 5 xxxDAO.xml  (0) 2012.03.29
iBatis 구현 - 4 sqlMapConfig.xml  (0) 2012.03.29
iBatis에서 HashMap의 활용  (2) 2012.03.29
iBatis 구현 - 3 xxx-servlet.xml 작성  (0) 2012.03.28

com.manager.dao.sql.VcardDAO.xml




	
	
		
		
		
		
		
		
	
	
	
		insert into VcardTable(name, addr, cell, tel, fax, email)
			values(#name#, #addr#, #cell#, #tel#, #fax#, #email#)
	
	
		update VcardTable
			set addr=#addr#,cell=#cell#,tel=#tel#,fax=#fax#,email=#email#
			where name=#name#
	
	



예제로 설명하겠다.

<sqlMap namespace="vcard">

sqlMap으로 선언되며 

<typeAlias alias="VcardInformation" type="com.manager.vo.vcard.VcardInformation"/>

뒤에있을 resultMap에 사용할 class를 정의한다. 해당클래스에는 Xml파싱을 위한 어노테이션들이 기록되어있다. (다음장에서 설명)

<resultMap id="resultMapVcardInformation" class="VcardInformation">

VcardInformation 클래스의 인자를 sql쿼리에 쓰일 데이터와 맵핑해준다. resultMap은 select문 등 칼럼 맵핑이 필요할때 사용된다.

ex) <result property="varName" column="DB_NAME"/>

varName이라는 변수를 DB_NAME 칼럼에 맵핑

<select id="select" resultMap="resultMapVcardInformation" parameterClass="VcardInformation">

select

name, addr, cell, tel, fax, email

from

VcardTable

</select>

".select"로 호출된다. 

select시  parameterClass는 위에 선언한 resultMap의 class의 선언 어노테이션에 맞는 값을 찾아서 넣는다.

Column  | -> |StringVal

NAME칼럼의 DBVAL1 -> property에 해당하는 class의 어노테이션을찾아맵핑 -> name(변수)로 들어오게 된다.

말이 어려운데 맵핑 맵핑을 잘생각해보면 이해할 수 있다.

구현해보면 더 쉽게 이해할 수 있고..


<insert id="insert" parameterClass="VcardInformation">

insert into VcardTable(name, addr, cell, tel, fax, email)

values(#name#, #addr#, #cell#, #tel#, #fax#, #email#)

</insert>

마찬가지로 ".insert"로 선언된다.

parameterClass에 VcardInformation 객체로 되어있는데 필요한경우 HashMap, String 등 간단하게 사용도 가능하다.

VcardInformation 객체의 내부선언된 어노테이션의 변수에 ##으로 변수를 삽입, sql문에 사용 할 수 있다.


<select id="count" resultClass="Integer">

select count(uid) as total from VcardTable where name=#name#

</select>

위의 예제와 비슷하나 이것은 리턴값이 integer이다. resultClass를 보면 쉽게 구분 가능한데, 갯수를 구하여 리턴해야 하기때문에 굳이  객체선언 등 필요가 없다. 

이번 포스트는 좀.. 많이 난해하다. 남한테 설명하기란 어렵구나


'DB > iBatis' 카테고리의 다른 글

iBatis구현 7 - xxxDAO.java  (0) 2012.03.29
iBatis 구현 - 6 Xml맵핑- .vo.xxx.java  (0) 2012.03.29
iBatis 구현 - 4 sqlMapConfig.xml  (0) 2012.03.29
iBatis에서 HashMap의 활용  (2) 2012.03.29
iBatis 구현 - 3 xxx-servlet.xml 작성  (0) 2012.03.28
xxx-servlet.xml에서 설정한 위치에 해당하는  sqlMap을 설정해야한다.
간단한 설정 예이다.


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
  "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
	<settings
		cacheModelsEnabled="true"
		enhancementEnabled="true"
        lazyLoadingEnabled="true"
        maxRequests="32"
        maxSessions="10"
        maxTransactions="5"
        useStatementNamespaces="true"/>
	<sqlMap resource="com/manager/dao/sql/VcardDAO.xml"/>
	
	
</sqlMapConfig>


간단한 설정, 그리고 사용할 sql문의 위치로 구성된다.

위의 경우 VcardDAO.xml에는 프로젝트에서 사용할 sql문이 담겨져있다.

.이 아니라 /로 패키지를 구분한다.



'DB > iBatis' 카테고리의 다른 글

iBatis 구현 - 6 Xml맵핑- .vo.xxx.java  (0) 2012.03.29
iBatis 구현 - 5 xxxDAO.xml  (0) 2012.03.29
iBatis에서 HashMap의 활용  (2) 2012.03.29
iBatis 구현 - 3 xxx-servlet.xml 작성  (0) 2012.03.28
iBatis 구현 - 2 web.xml 수정  (0) 2012.03.28

HashMap은 간단하게 말해 key와 value의 집합이다. 즉 key로 value를 찾아갈수 있게한다.

iBatis에서 적용예로 알아보자.

public void delete(String email, Calendar time) throws Exception {
			Map<String, Object> parameters = new HashMap<String, Objec>();
			parameters.put("calendarTime", time);
			parameters.put("emailAddress", email);
			sqlMapClientTemplate.update(".delete", parameters);
}

위의 경우 인자로 들어온 2개의 파라메터값을 put 한다. 

즉    String  // "calendarTime"  

 Object // time

이 되는것이다. 

이렇게 되면 HashMap에는

String            | Object

calendarTime | time

emailAddress | email

이런 형태로 key | value 쌍의 데이터가 들어간다.


이를 따라서 sqlMap의 .delete 까지 따라들어가면

<sqlMap>
 ~설정~
			<update id="delete" parameterClass="HashMap">
			update
						account
			set
						delete_mark=1,
						modified_time=#calendarTime#
			where
						email_address=#emailAddress#
			</update>
</sqlMap>


왜 쿼리가 delete가 아닌 update인것은 account를 실제 삭제하는것이 아니라 삭제된 것으로 표기하기 때문이다. (정하기나름)

중요한것은 parameterClass가 HashMap으로 들어왔기 때문에 해당 key를 #key#형태로 써줌으로서 내부에 값을 가져올수 있다는 것이다.

여기서는 calendarTime과 emailAddress Key로 소스의 데이터 time과 email 값을 쿼리문에 사용할수 있게되었다.



'DB > iBatis' 카테고리의 다른 글

iBatis 구현 - 5 xxxDAO.xml  (0) 2012.03.29
iBatis 구현 - 4 sqlMapConfig.xml  (0) 2012.03.29
iBatis 구현 - 3 xxx-servlet.xml 작성  (0) 2012.03.28
iBatis 구현 - 2 web.xml 수정  (0) 2012.03.28
iBatis 구현 - 1 대략적 개념  (0) 2012.03.28

[샘플코드 : manager-servlet.xml]

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" 

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:p="http://www.springframework.org/schema/p" 

    xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:context="http://www.springframework.org/schema/context"

xmlns:tx="http://www.springframework.org/schema/tx"

    xmlns:oxm="http://www.springframework.org/schema/oxm"    

    xsi:schemaLocation="

        http://www.springframework.org/schema/beans 

        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

        http://www.springframework.org/schema/tx    

http://www.springframework.org/schema/tx/spring-tx-3.0.xsd

        http://www.springframework.org/schema/aop 

    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

        http://www.springframework.org/schema/context 

        http://www.springframework.org/schema/context/spring-context-3.0.xsd

        http://www.springframework.org/schema/oxm

     http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd">

<context:component-scan base-package="com.manager" />


<tx:annotation-driven transaction-manager="transactionManager"/>

<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://61.109.146.35:3306/test"/>     

    <property name="username" value="testid"/>

    <property name="password" value="testpwd"/>

    <property name="defaultAutoCommit" value="true"/>

    <property name="initialSize" value="5"/>

    <property name="maxActive" value="30"/>

    <property name="maxIdle" value="5"/>

    <property name="maxWait" value="30000"/>

    <property name="timeBetweenEvictionRunsMillis" value="60000"/>

</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource"/>

    </bean>


    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

        <property name="configLocation" value="classpath:config/sqlMapConfig.xml"/>

        <property name="dataSource" ref="dataSource"/>

    </bean>

    

    <bean id="sqlMapClientTemplate"

class="org.springframework.orm.ibatis.SqlMapClientTemplate"

p:sqlMapClient-ref="sqlMapClient"/>

<bean

class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" p:alwaysUseFullPath="true" >

<property name="messageConverters">

<list>

<ref bean="stringHttpMessageConverter" />

<ref bean="marshallingHttpMessageConverter" />

</list>

</property>

</bean>

<bean id="stringHttpMessageConverter"

class="org.springframework.http.converter.StringHttpMessageConverter">

<property name="writeAcceptCharset" value="true" />

</bean>

<bean id="marshallingHttpMessageConverter"

class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"

p:marshaller-ref="jaxb2Marshaller" p:unmarshaller-ref="jaxb2Marshaller" />

<oxm:jaxb2-marshaller id="jaxb2Marshaller" contextPath="com.manager.vo.vcard"/>

<bean id="viewResolver"

class="org.springframework.web.servlet.view.UrlBasedViewResolver">

<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>

<property name="prefix" value="/WEB-INF/view/"></property>

<property name="suffix" value=".jsp"></property>

</bean>


</beans>

manager-servlet.xml

-- servlet의 모든것이 중요하지만 체크해야 할점을 빨간색 마킹처리했다.

dataSource에는 dbproperties 파일로 빼놓는 경우도 있으나 DB접속 정보를 저장한다.

transactionManager를 선언 하고 DB를 설정한다.

sqlMapClient bean을 선언하고 sqlMapConfig.xml위치를 설정한다. 위의경우 소스폴더의 config패키지 아래에 생성된다.


'DB > iBatis' 카테고리의 다른 글

iBatis 구현 - 4 sqlMapConfig.xml  (0) 2012.03.29
iBatis에서 HashMap의 활용  (2) 2012.03.29
iBatis 구현 - 2 web.xml 수정  (0) 2012.03.28
iBatis 구현 - 1 대략적 개념  (0) 2012.03.28
iBatis 구현 (개인적)  (0) 2012.03.28


<servlet> 부분이 중요. 입력들어오는 주소를 허용하는 범위이다. * 이 아니라 정확한 주소를 치면 그 외의 입력은 모두 무시한다. 

현재는 목록불러들어오기(get), 목록 넣기(insert) 두개의 기능을 쓰기 때문에 *로 지정



'DB > iBatis' 카테고리의 다른 글

iBatis에서 HashMap의 활용  (2) 2012.03.29
iBatis 구현 - 3 xxx-servlet.xml 작성  (0) 2012.03.28
iBatis 구현 - 1 대략적 개념  (0) 2012.03.28
iBatis 구현 (개인적)  (0) 2012.03.28
iBatis란?  (0) 2012.03.28

일반적으로 프로젝트는 크게 biz, dao, model 로 구현한다.

dao - DB연결부를 담당

biz - 가져온 정보를 가공

model - 정보를 객체화

엄밀히 말하면 iBatis구현에는  dao만 있어도 된다.

1)sqlMapConfig.xml에 sqlMap을 선언하고

2)선언된 xxxDao.xml에서는 sql문을 서술하여 선언하고

ex) <insert id="insert" parameterClass="hashMap">

insert tableA(columnA,columnB)

values(#dataA#,#dataB#)

3)xxxDao.java에서 구현해주면된다.(일반적으로 추상클래스로 구분 DaoImpl)

ex)@Resource(name="sqlMapClientTemplate")

private SqlMapClientTemplate sqlMapClientTemplate;

public class xxxDaoImpl implements xxxDao{

public void insert(String strvalA, String strvalB) {

Map<String, Object> parameters = new HashMap<String, Object>();

parameters.put("dataA",  strvalA);

parameters.put("dataB",  strvalB);

return sqlMapClientTemplate.delete(".insert", parameters);

}

}

4)완료

'DB > iBatis' 카테고리의 다른 글

iBatis에서 HashMap의 활용  (2) 2012.03.29
iBatis 구현 - 3 xxx-servlet.xml 작성  (0) 2012.03.28
iBatis 구현 - 2 web.xml 수정  (0) 2012.03.28
iBatis 구현 (개인적)  (0) 2012.03.28
iBatis란?  (0) 2012.03.28

지극히 개인적인 메모 중심으로 iBatis 구현을 정리

dynamic web project - xxx 프로젝트 생성

xxx-servlet.xml 설정

 - transactionManager 설정

 - web.xml 등록

sqlMapConfig.xml 사용 sqlMap 배치

 - oooDao.xml 쿼리 저장, 소스와 연결


'DB > iBatis' 카테고리의 다른 글

iBatis에서 HashMap의 활용  (2) 2012.03.29
iBatis 구현 - 3 xxx-servlet.xml 작성  (0) 2012.03.28
iBatis 구현 - 2 web.xml 수정  (0) 2012.03.28
iBatis 구현 - 1 대략적 개념  (0) 2012.03.28
iBatis란?  (0) 2012.03.28

Java에서 사용되는 ORM툴 중 Hibernate와 iBatis중 국내 많은 업체들이 iBatis를 선택한 이유는 여러 설정이 필요한 Hibernate에 비해 iBatis는 직관적이여서(SQL문을 직접 쓰기때문) 이해가 빠르기 때문일것이다.

 하지만 세계적 추세는 Hibernate를 중시하며 추진하는 분위기며 (제7회 공감 개발자세미나)  유연한 확장성과 대처에는 Hibernate가 좋다고 한다. 

 하지만 국내 개발환경(협의 후 테이블 구축 유지)에는 iBatis가 좀더 유용하며 주류가 되는 추세이다. 쿼리문의 처리에는 iBatis가 조금더 성능이 우세하다.

  2010년 6월16일 이후 구글코드로 이전함에 따라 myBatis로 개명하였다*. 하지만 편의와 대중성을 위해 iBatis로 진행하겠다.

*창시자인 Clinton Begin이 iBatis의 모든 코드를 apache재단 에 기부함에 따라 이름도 바꾸었다고한다.

1. iBatis의 특징

1) 간결함, 쉬운 접근성

sql문을 xml에 그대로 서술하기 때문에 기존 sql문처리에 익숙한 개발자들이 다가가기 쉽다.

그에 따른 장점으로 개발자와 DB관리의 양쪽 모두 이해에 용이하다.

2) 생산성의 향상

JDBC의 많은 설정을 간결하게 줄여줌으로 인해 개발자의 작성분량을 줄여준다.

3) 성능

성능최적화 기법을 지원한다.

ex)예를 들어 가장 중요한 기능이라면 페이징 처리된 데이터 리스트를 읽어와서 사용할 때 불필요한 수천개의 행을 한꺼번에 데이터베이스로부터 가져오는것이 아니기 때문에 어플리케이션의 성능을 향상시킬수있다. 

(이해가안되서 그냥 그대로 타이핑하였다. 코드상 처리의 장점을 말하는것 같다.)

'DB > iBatis' 카테고리의 다른 글

iBatis에서 HashMap의 활용  (2) 2012.03.29
iBatis 구현 - 3 xxx-servlet.xml 작성  (0) 2012.03.28
iBatis 구현 - 2 web.xml 수정  (0) 2012.03.28
iBatis 구현 - 1 대략적 개념  (0) 2012.03.28
iBatis 구현 (개인적)  (0) 2012.03.28

+ Recent posts