이제 db부분을 만들어봅시다.
Source Packages에서 New -> Java Packages해서 com.phpschool.guestbook.db를 추가합시다.
New -> Other해서 Java -> Java Interface를 선택하고 GuestbookDao라는 Interface를 추가합시다.








GuestbookDao.java
[code]package com.phpschool.guestbook.db;

import com.phpschool.guestbook.vo.GuestbookVo;
import java.util.List;

public interface GuestbookDao {

    public List<GuestbookVo> getContents();
}[/code]

이 인터페이스를 구현해봅시다.
db Package에 New -> Java Class를 선택하고 GuestbookDaoImpl 클래스를 추가합시다.

GuestbookDaoImpl.java
[code]package com.phpschool.guestbook.db;

import com.phpschool.guestbook.vo.GuestbookVo;
import java.util.List;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

public class GuestbookDaoImpl extends SqlMapClientDaoSupport
                 implements GuestbookDao {

    @SuppressWarnings("unchecked")
    @Override
    public List<GuestbookVo> getContents() {
        return (List<GuestbookVo>)
             getSqlMapClientTemplate().queryForList("getContents");
    }
}[/code]
우선 SqlMapClientDaoSupport클래스를 상속받습니다. 이게 sqlMapClient를 가져오게 하는 것 같습니다. getSqlMapClientTemplate()라는 메소드로 sqlMapClient를 가져오는군요. 이걸로 이제 queryForList메소드를 호출해서 getContents라는 sql을 실행합니다.
그럼 SQL작성을 하는 MYSQLGuestbook.xml파일을 생성해봅시다.
db Package에 new -> xml Document를 선택하고, MYSQLGuestbook.xml을 생성합시다.

MySQLGuestbook.xml
[code]<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sqlMap     
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"     
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Guestbook">
    <resultMap id="resultGuestbook" class="GuestbookVO">
        <result property="no" column="no" />
        <result property="name" column="name" />
        <result property="subject" column="subject" />
        <result property="content" column="content" />
        <result property="ip" column="ip" />
        <result property="datetime" column="datetime" />
    </resultMap>
   
    <select id="getContents" resultMap="resultGuestbook">
        SELECT no, name, subject, content, ip, datetime
        FROM guestbook ORDER BY no DESC
    </select>
</sqlMap>[/code]
iBATIS에서 사용하는 방식입니다. 우선 resultMap을 만드는데 db에 있는 column을 java에 있는 bean에 매핑하기 위해서 만듭니다. 아래는 getContents는 Dao에서 호출하는 이름과 같아야 합니다.

Dao를 만들었으니 Manager클래스를 만들어봅시다.
com.phpschool.guestbook.service 패키지를 만듭시다.
New -> Java Interface를 선택 후 GuestbookManager라는 interface를 만듭시다.

GuestbookManager.java
[code]package com.phpschool.guestbook.service;

import com.phpschool.guestbook.vo.GuestbookVo;
import java.util.List;

public interface GuestbookManager {

    public List<GuestbookVo> getContents();
}
[/code]
getContents부분을 구현해봅시다.
New -> Java Class를 선택 후 GuestbookManagerImpl라는 class를 만듭시다.

GuestbookManagerImpl.java
[code]package com.phpschool.guestbook.service;

import com.phpschool.guestbook.db.GuestbookDao;
import com.phpschool.guestbook.vo.GuestbookVo;
import java.util.List;

public class GuestbookManagerImpl implements GuestbookManager{

    GuestbookDao guestbookDao;

    public void setGuestbookDao(GuestbookDao guestbookDao) {
        this.guestbookDao = guestbookDao;
    }
   
    public List<GuestbookVo> getContents() {
        return guestbookDao.getContents();
    }
}[/code]
Dao인터페이스를 하나 선언해주고 setter를 만들어줍니다. 이게 스프링에서 말하는 DI입니다. 저기에 값을 셋팅하는 건 applicationContext.xml이 해줍니다.
그리고 getContents메소드는 특별한 로직이 없어서 그냥 Contents만 리턴합니다.

Controller는 다음시간에-_-;

 
Posted by 머드초보

댓글을 달아 주세요

 

간단하게 DB에 있는 방명록 정보를 가져오는 정도를 해보겠습니다.

개발환경 : NetBeans6.0 + JDK6u3 + NetBeans내장Tomcat6.0 + iBATIS 2.3.0.677 + MySQL(버전모름-_-) + Spring Framework 2.5

우선 NetBeans6.0이 있어야겠고, Plugin으로 SpringFramework Support를 설치해야합니다.
메뉴에서 Tools -> Plugins클릭하면 Available Plugins를 선택하면 Spring Framework Support가 있는데 체크해서 설치를 하도록 합시다.

그런다음 프로젝트를 생성해봅시다.
File -> New Project선택 후 Web -> Web Application을 선택하고 Server는 Tomcat밖에 사용할 줄 모르니 Tomcat을 선택합니다(GlassFish사용할 줄 아는사람은 고거 선택하고^^)Next를 클릭하고
Project Name은 SpringIbatisExample 이라고 해봅시다. Next를 하면
Framework를 선택하라고 나옵니다. Spring Framework 2.5를 선택하고 Finish를 클릭합시다.

lib를 추가해야합니다. 따로 사용할 것은 iBATIS와 MySQL Connector입니다.
iBATIS는 www.ibatis.com 에서 받으면 되구요. MySQL Connector는 NetBeans에 내장되어있습니다.
프로젝트이름에 대고 오른쪽버튼 클릭 -> Properties -> Libraries -> Add Library 선택 후
MySQL JDBC Driver를 선택해서 추가합니다.
iBATIS는 아무 폴더에 설치 후에 Add JAR로 추가합시다.
넷빈즈에 Manage Libraries에 추가해서 사용하고 싶을 때 추가하게 할 수도 있습니다.

DB URL과 ID, PW를 설정해봅시다.
WEB-INF폴더 아래 jdbc.properties파일이 있는데 보면 어떤걸 설정해야할지 알껍니다.
driverClassName에는 com.mysql.jdbc.Driver를 넣고, url, id, pw를 넣으면 됩니다.

※DB구조입니다.
[code]CREATE TABLE `guestbook` (
  `no` int(11) NOT NULL auto_increment,
  `password` varchar(20) default NULL,
  `name` varchar(250) default NULL,
  `subject` varchar(2000) default NULL,
  `content` text,
  `ip` varchar(15) default NULL,
  `datetime` datetime default NULL,
  PRIMARY KEY  (`no`)
)[/code]

간단하게 F6을 눌러서 실행되는지 확인해봅시다.
this is the /WEB-INF/jsp/index.jsp 라고 뜨면 된 것입니다.

이제 설정을 해봅시다.
Configuration Files 밑에 applicationContext.xml파일을 열어봅시다.

applicationContext.xml
<!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) --> 요고 밑에다가 작성해봅시다.
[code]<bean id="sqlMapClient"
       class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="/WEB-INF/SqlMapConfig.xml"/>
</bean>

<bean id="guestbookDao" class="com.phpschool.guestbook.db.GuestbookDaoImpl">
    <property name="sqlMapClient" ref="sqlMapClient" />
</bean>
   
<bean name="guestbookManager"
      class="com.phpschool.guestbook.service.GuestbookManagerImpl">
    <property name="guestbookDao" ref="guestbookDao" />
</bean>[/code]
iBATIS에서 sqlMap을 생성하는 부분입니다. 오...3줄이면 끝나는군요.
아래는 Dao를 하나 선언해줍니다. 이 Dao는 sqlMapClient를 받습니다. 그래서 이 sqlMapClient를 통해
sql문에 접근할 수 있습니다. 그리고 그 아래에 있는 bean은 Manager입니다. Dao를 이용해서 service로직을 구현하는 부분입니다.

그러면 저기 sqlMapClient property에 있는 configLocation에 SqlMapConfig.xml파일을 만들어봅시다.
Web Pages -> WEB-INF에 대고 New -> Other하고 XML Document를 선택하고 SqlMapConfig.xml파일을 생성한 뒤 다음과 같이 씁시다.

SqlMapConfig.xml

[code]<?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>
    <typeAlias alias="GuestbookVO" type="com.phpschool.guestbook.vo.GuestbookVO"/>
   
    <sqlMap resource="com/phpschool/guestbook/db/MySQLGuestbook.xml" />
</sqlMapConfig>
[/code]
다음과 같이 sqlMapConfig를 생성합니다. alias는 아래 resource에서 사용할 클래스 이름의 별명을 사용하게 하는 것입니다. 예를 들어 ResultClass 등에서 패키지명까지 다 입력해주어야하는데 alias를 지정해주면 클래스명만 써도 됩니다.
그리고 아래는 resource, 즉 sql들을 모아둔 xml파일입니다.
우선 제끼고 ValueObject를 만들어봅시다.
Source Packages에 대고 New -> Java Package선택 후 Package Name을 com.phpschool.guestbook.vo 라고 줘서 vo라는 패키지를 만듭시다.
그리고 New -> Java Class선택 후 Class Name을 GuestbookVo라고 합시다.

GuestbookVo.java
[code]private int no;
private String password;
private String name;
private String subject;
private String content;
private String ip;
private Timestamp datetime;[/code]
위 까지만 타이핑하고, Alt + Ins 하면 Getter And Setter가 나오는데 선택하고 전체를 다 선택하면 자동으로 setter와 getter가 만들어집니다.

아 힘들어-_-; 다음 이시간에-_-;

 
Posted by 머드초보

댓글을 달아 주세요

 

아...계속 게시판만 만드네요-_-; 그래도 데이터연동의 가장 기본이 되는것을 해야하니깐-_-;

테스트환경은 TOMCAT6.0 + JDK 6.0 + Struts 1.3.8 + iBATIS 2.3.0 + Flex3 Beta 2 에서 했습니다.

저번엔 RemoteObject로 삽질했는데 이제 HTTPService로 삽질하네요.
우선 RemoteObject는 해당클래스를 직접 호출해서 가져다가 쓰는 것이구요.
HTTPService는 말그대로 http를 통해 주소값을 넣으면 그것을 실행하게 되는 것인데요.
그 실행해서 나오는 값이 xml형태이면 xml태그에 있는 값을 가져올 수 있습니다.

그렇다는 얘기는 서버단에서는 Struts와 iBATIS를 통해서 DB와 연동해서 데이터를 xml형태로 리턴해주면 그것을 FLEX에서 값을 가져다가 DataGrid에 넣든 쇼를 하든 할 수 있다는 얘기죠.

그리 대단한 건 아니지만, HTTPService로 삽질하시는 분들께 도움이 되고자-_-;

FlexBoard.war

Struts + iBATIS를 이용한 xml을 리턴하는 게시판입니다.

즉 http://localhost:8080/FlexBoard/list.do 을 실행하게 되면 결과값이 xml코드를 리턴한다는 얘기죠.
그런식으로 나타낸 xml코드를 flex에서 가져다가 DataGrid에 넣도록 되어있습니다.

ClientFlexBoard.zip

Flex Project Archive로 export한 프로젝트입니다.

이거는 저 위에 있는 FlexBoard.war에 포함되어있는 swf를 만들어주는 프로젝트입니다.
즉, 그냥 서버단에서 리턴하는 xml을 가져와서 DataGrid에 넣기도하고, http서비스를 이용하여 파라메터를 던져서 해당 DB를 컨트롤하기도 하고 그런거하는 겁니다.


DB구조는.....
CREATE TABLE `Board` (
  `b_id` int(11) NOT NULL auto_increment,
  `b_name` varchar(10) NOT NULL,
  `b_pwd` varchar(10) NOT NULL,
  `b_title` varchar(30) NOT NULL,
  `b_content` mediumtext NOT NULL,
  PRIMARY KEY  (`b_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=euckr AUTO_INCREMENT=115 ;
입니다-_-;

설명은 나중에-_-; 아.....졸려-_-;
 
Posted by 머드초보

댓글을 달아 주세요

  1. 나그네 2007.11.19 17:24  댓글주소  수정/삭제  댓글쓰기

    iBatis 에서 자바빈을 통한 데이터전달 말고

    예를 들어 select 같은 경우에는 결과값을 바로

    ResultSet으로 받아올 수는 없을까요?

    Update 나 Insert 나 Delete 같은 경우는 그럼

    자바빈 없이 할려면

    필요값들을 어떻게 xml에 전달을 해야 될까요?


    답변 부탁드립니다. 예제가 있다면 더욱 감사하구요.

    koogoon@naver.com

    • BlogIcon 머드초보 2007.11.20 21:20  댓글주소  수정/삭제

      음....ResultSet으로 받으려는 이유가 궁금하네요 ^^
      친구한테 물어보니까 ResultClass를 java.util.Map으로 하면 받을 수 있다고 하네요.
      Map에서 get어쩌구 함수를 사용할 수 있다고 하네요
      저도 안해봐서 잘모르겠네요 ^^

  2. 초보 2008.01.17 00:53  댓글주소  수정/삭제  댓글쓰기

    금방 예제http://mudchobo.tomeii.com/FlexBoard/에서 글쓰기가 안되네요...?

    faultCode:Server.Error.Request faultString:'HTTP request error' faultDetail:'Error: [IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="Error #2032: 流错误。 URL: http://mudchobo.tomeii.com/FlexBoard/write.do"]. URL: http://mudchobo.tomeii.com/FlexBoard/write.do'

    위와 같은 에러가 나옴니다.

    그리고 지금은 개발언어로 JAVA를 메인으로 하지만,
    곧 Flash가 JAVA자리를 차지한다는 소문이 있는데요.
    머드초보님은 이방면에서 어덯게 생각하는지요...
    Struts 이후는 어덯게 될는지....의견듣고 싶네요.

    • BlogIcon 머드초보 2008.01.17 09:03  댓글주소  수정/삭제

      방금고쳤어요-_-; 아....제가 삽질하다가 DB를 날려먹어서 DB구조가 바뀌었네요^^
      이제 될껍니다.

      음 adobe가 java대신에 Action Script를 더욱 향상 시켜서 자바를 대처할 모양인가보네요.
      뭔가 가능할 것 같은데요 ^^

      Struts는 글쎄요. 제가 java로 현업을 뛰는게아니라서-_-;
      앞으로 더 좋은 프레임워크가 나오면서 Struts는 사라질 듯 해요.
      이미 많은 업체들이 Spring이라는 프레임워크로 옮긴 것처럼요 ^^

      결론은....끊임없는 공부입니다 ㅠㅠ

      좋은 의견 감사합니다 ^^

  3. BlogIcon 류승범 2008.01.23 02:07  댓글주소  수정/삭제  댓글쓰기

    우연히 들리게 되었습니다.

    Struts는 View Control이라할 수 있고 Spring은 Business Logic단이라고 알고 있습니다.
    여기다가 Hibernate를 추가하면 DB에 독립적으로 프로그램이 가능하고. Spring을 일본에서는 Caesar2 로 쓰이기도 합니다. Struts -> Spring으로 옮겨지는게 아니라, 다 같이 결합해서 쓰이게 되겠죠. Flex가 기능이 막강하긴 합니다만, 너무 무거워서 다소 하이브리드 형태로 JSF나 Applet, Component형태로 쓰일꺼 같은 생각이 듭니다.

    다소 개인적인 의견을 말씀드렸네요. 그럼 수고하세요.

    • BlogIcon 머드초보 2008.01.23 08:17  댓글주소  수정/삭제

      오 그렇군요^^
      좋은 의견감사해요^^ 다 같이 결합을 하는거군요.
      Flex가 좀 무겁긴해요^^ 앞으로 더욱 개선되겠죠?^^

  4. 석창호 2008.07.31 12:00  댓글주소  수정/삭제  댓글쓰기

    잘보고 갑니다~
    이제막 struts + ibatis + flex
    공부시작하는데.. 많은 도움이 되었네요~ ㅎㅎ
    근데... 위에 승범이도 왔었네.. ㅋㅋ 은근히 반갑다는 ㅋ

    • 머드초보 2008.07.31 13:12  댓글주소  수정/삭제

      앗! 안녕하세요!
      도움이 되셨다니 다행이네요.
      저거 제가 잘 모르던시절에 짠거라-_-;
      암튼 방문해주셔서 감사해요~

  5. 박영민 2008.09.26 17:15  댓글주소  수정/삭제  댓글쓰기

    안녕하세요..플렉스를 막 시작한 초보입니다.
    소스를 임포트하여
    톰캣, mysql 환경에서 게시판을 돌렸는데

    org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failure

    이런 메세지가 뜨네요...해결 방법을 알수 있을까요?

    • 머드초보 2008.09.26 18:20  댓글주소  수정/삭제

      안녕하세요~
      그건 저도 잘모르겠네요 ㅠ
      검색해보니 MySQL연결이 끊어졌다라고만 얘기가 나옵니다만-_-;
      MySQL의 설정을 조금 바꿔보세요 ^^
      dbms는 저도 잘몰라서 ㅠ

  6. 박영민 2008.10.07 12:02  댓글주소  수정/삭제  댓글쓰기

    안녕하세여....^^ 올려주신 소스 감사합니다.

    소스를 임포트하여 톰캣, mysql 환경에서 게시판을 돌렸는데

    list.do에서 디비에서 갖고온 데이터를 xml로 변환을 못한 듯 합니다.

    http://localhost:8080/FlexBoard/list.do 이렇게 페이지를 열러보면

    <?xml version="1.0" encoding="UTF-8" ?>
    - <result_set>
    <pagenum>${pagenum}</pagenum>
    <totalpage>${totalpage}</totalpage>
    - <record>
    <id>${list.id}</id>
    <name>${list.name}</name>
    <title>${list.title}</title>
    <content>${list.content}</content>
    </record>
    </result_set>

    이런식으로 나오고 맙니다...

    http://localhost:8080/FlexBoard/ClientFlexBoard.swf를 보면

    게시판의 번호,이름,제목란에 데이터 대신 ${list.id}, ${list.title},${list.content} 으로 나옵니다.

    물론 디버깅해서 데이타를 갖고 오는건 확인했습니다만..list.do에서 데이터를 볼 수가 없네여. write는 되는것을 확인했구여.

    그리고 jstl태그 라이브러리도 확인해봤구여.....

    왜 그런건지 알수 있을까여?^^

    • 머드초보 2008.10.07 13:43  댓글주소  수정/삭제

      ${}이것은 el표기법이라고 해서 jsp에서 사용하는 문법입니다.
      근데 8080인것으로 봐서 톰캣으로 돌리신게 맞는것같은데-_-;
      왜 안되죠?-_-;
      저 코드가 왜 그냥 나오지-_-; 저...저도 잘모르겠네요-_-;
      환경을 직접 봐야지 알 것 같아요 ^^

  7. 공대아름 2008.12.03 17:27  댓글주소  수정/삭제  댓글쓰기

    올려주신 자료 감사하게 보고 있습니다.^^*
    근데 저도 위에 님하고 같은 현상이 일어나네요...
    <?xml version="1.0" encoding="UTF-8" ?>
    - <result_set>
    <pagenum>${pagenum}</pagenum>
    <totalpage>${totalpage}</totalpage>
    - <record>
    <id>${list.id}</id>
    <name>${list.name}</name>
    <title>${list.title}</title>
    <content>${list.content}</content>
    </record>
    </result_set>

    게시판의 번호,이름,제목란에 데이터 대신 ${list.id}, ${list.title},${list.content} 으로 나옵니다.
    이유가 뭘까요??? 오늘도 삽질에 삽질입니다...ㅜㅜ

    • 머드초보 2008.12.04 18:39  댓글주소  수정/삭제

      음......이상하네요.
      톰캣에서 돌리시는 거 맞죠?
      저도 왜그런지 모르겠네요 ㅠㅠ
      저건 톰캣에서 제공하는 걸로 알고있는데 ㅠ

  8. 장건웅 2009.04.20 16:43  댓글주소  수정/삭제  댓글쓰기

    요즘 플렉스에 관심이 생겨 이것저것 검색하다가 머드초보님 블로그까지 오게 되었습니다.
    여러가지 많이 배우고 가네요~ 자료 정말 감사드립니다.
    위에 분들 el태그가 그대로 출력되는 현상 해결하셨을지 모르지만 일단 해결책을 올려드리려구요.
    <%@ page isELIgnored="false" contentType="text/xml; charset=UTF-8" %>
    isElIgnored="false"를 추가해 주시면 el태그를 사용하실 수 있으실 겁니다.

    • 머드초보 2009.04.23 23:49  댓글주소  수정/삭제

      앗! 답변 달아주셔서 감사합니다 ㅠ
      윗분 4달전에 올리신 질문을 ㅠ
      감사합니다 ^^

  9. BlogIcon 쟝또루푸 2009.04.27 17:22  댓글주소  수정/삭제  댓글쓰기

    웹개발에 뛰어든지 4개월째 근무하는 곳에서 기획중인 웹서비스에 주 View단이 플렉스로 정해져 공부를 시작한 나그네 입니다..^ㅡ^... 다른 무엇 보다 머드초보님께서 정리해서 올려주신 게시판 소스가 너무 큰 도움이 되는 듯 합니다 ㅠ_ㅠ... 아직 버닝을 시작하진 않았지만 듬직하네요'ㅡ'/ 멋져요^0^/

    • 머드초보 2009.04.27 23:57  댓글주소  수정/삭제

      아.....안녕하세요~
      저 허접한 소스를...-_-
      벌써 1년도 더 된....ㅠㅠ
      그냥 참조만 해주세요 ㅠ
      방문해주셔서 감사해요~ ^^

  10. 이관형 2010.03.29 14:54  댓글주소  수정/삭제  댓글쓰기

    FLEX관련 자료를 찾다가 들르게됐네여~
    자료 감사합니다~
    게시판돌려봤는데여~도무지 FLEX의 데이터를 다룰방법을 모르겠었는데
    많은 도움이되네요~
    좋은자료 감사합니다~^^
    글와중에
    <?xml version="1.0" encoding="UTF-8" ?>
    - <result_set>
    <pagenum>${pagenum}</pagenum>
    <totalpage>${totalpage}</totalpage>
    - <record>
    <id>${list.id}</id>
    <name>${list.name}</name>
    <title>${list.title}</title>
    <content>${list.content}</content>
    </record>
    </result_set>
    라고나오신분들은 Table에 데이타가 없을경우 나네요~
    데이타를 집어넣어주면 에러는 발생하지 않습니다~

    암튼 좋은 자료 감사해요~

 

iBATIS를 이용해서 간단한 예제를 만들어봅시다.

웹이랑 섞으면 복잡하니까 콘솔에서 아주 간단하게 해보겠습니다-_-;

iBATIS를 들어보기만 하고 저처럼 어려울 것 같아서 거부하신분들에게 바칩니다-_-; 저는 처음에 상당히 어려울 줄 알았는데 공식홈페이지가니까 이동국님이 번역해 놓으신 문서가 있더라구요. 약간 이상하게(?) 번역해 놓긴 했지만 영어울렁증이 있는 저에게는 정말 도움이 되는 자료 였습니다 ^^

iBATIS공식홈페이지입니다.( 개발자 가이드와 튜토리얼 메뉴얼도 있습니다.)
for Java를 클릭하면 자바용이 나옵니다.
http://ibatis.apache.org/

접근하기 쉽게 하기 위해서 원더걸스멤버를 DB에 저장해놓고 해봅시다-_-;

[code]
CREATE TABLE `WONDERGIRLS` (
  `NUM` int(11) NOT NULL,
  `NAME` varchar(10) NOT NULL,
  `AGE` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=euckr;

INSERT INTO `WONDERGIRLS` (`NUM`, `NAME`, `AGE`) VALUES
(1, '선예', 18),
(2, '선미', 15),
(3, '소희', 15),
(4, '예은', 18),
(5, '유빈', 99);
[/code]

사실 원더걸스가 이렇게 어린지 몰랐습니다-_-; 자 우선 넘어가고-_-;

이클립스를 실행하고 JAVA PROJECT로 프로젝트를 하나 만듭시다.
그리고 패키지를 jyp라고 해서 만듭시다-_-;
iBATIS lib파일인 ibatis-2.3.0.677.jar과 OracleJDBC를 LIB으로 추가합시다.

iBATIS를 사용하기 위한 설정파일을 구성해봅시다.
jyp에다가 new해서 xml파일을 하나 만듭시다. 이름은 SqlMapConfig.xml 이라고 합시다.

SqlMapConfig.xml
[code]
<?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>

 <properties resource="./jyp/SqlMapConfig.properties" />
 
 <settings
     cacheModelsEnabled="true"
     enhancementEnabled="true"
     lazyLoadingEnabled="true"
     maxRequests="32"
     maxSessions="10"
     maxTransactions="5"
     useStatementNamespaces="false"
 />
   
 <transactionManager type="JDBC" >
    <dataSource type="SIMPLE">
      <property name="JDBC.Driver" value="${driver}" />
      <property name="JDBC.ConnectionURL" value="${url}" />
      <property name="JDBC.Username" value="${username}" />
      <property name="JDBC.Password" value="${password}" />
    </dataSource>
 </transactionManager>
 
 <sqlMap resource="./jyp/WonderGirls.xml" />
 
</sqlMapConfig>
[/code]
내용을 보면 환경을 설정하고 JDBC와 연결하기 위한 작업을 하는 듯 합니다. JDBC연결작업은 SIMPLE이라고 되어있는데 DBCP로도 됩니다. 메뉴얼에 보시면 개발자가이드 부분에 보면 하는 법이 있습니다.
그리고 마지막에 sqlMap의 resource를 WonderGirls.xml을 추가해놨는데요 차후 설명하겠습니다.

그다음에 저기 JDBC설정에 ${driver}등 변수형식으로 되어있는데 맨위에 properties파일을 하나 설정한게 있는데 저기에 정의 하면 됩니다.

SqlMapConfig.properties
[code]
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:XE
username=MUDCHOBO
password=1234
[/code]
오라클은 저렇게 하면 되구요. mysql은 mysql에 맞게 바꾸면 돼요.
만약 한 프로그램에서 여러개의 db를 접근한다면 저 파일들을 또 만들면 되겠죠?

그 다음 클래스를 하나 만듭시다. MyAppSqlmapConfig라는 클래스를 만듭시다.
[code]
package jyp;

import java.io.Reader;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public class MyAppSqlMapConfig {

 private static final SqlMapClient sqlMap;
 
 static {
  try {
   String resource = "./jyp/SqlMapConfig.xml";
   Reader reader = Resources.getResourceAsReader(resource);
   sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
  } catch (Exception e) {
   e.printStackTrace();
   throw new RuntimeException("Error initializing class. Cause:" + e);
  }
 }

 public static SqlMapClient getSqlMapInstance() {
  return sqlMap;
 }
}
[/code]
방금 설정한 설정파일을 이용해서 sqlMapClient를 만드는 듯 합니다. 저 sqlMap객체를 통해서 db에 접근할 수 있는 듯 합니다. 저도 잘은 모르겠네요 ^^

원더걸스 getter, setter를 만들어 봅시다. WonderGirls라는 이름으로 클래스를 만듭니다.
WonderGirls.java
[code]
package jyp;

public class WonderGirls {

 private int num;
 private String name;
 private int age;
 
 public int getNum() {
  return num;
 }
 public void setNum(int num) {
  this.num = num;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
}
[/code]
이제 가장 중요한 부분인 Wondergirls에 관련된 sqlMap을 작성해봅시다.
이름은 아까 정의한 WonderGirls.xml파일로 만듭시다.
[code]
<?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="WonderGirls">
 
 <resultMap id="WondergirlsResult" class="jyp.WonderGirls">
  <result column="NUM" property="num" />
  <result column="NAME" property="name" />
  <result column="AGE" property="age" />
 </resultMap>
 
 <select id="getWondergirls" resultMap="WondergirlsResult">
  SELECT NUM, NAME, AGE
  FROM WONDERGIRLS
  ORDER BY NUM
 </select>

 <select id="selectWondergirl" parameterClass="Integer"
             resultClass="jyp.WonderGirls">
  SELECT NUM, NAME, AGE
  FROM WONDERGIRLS
  WHERE NUM = #num#
 </select>
 
 <insert id="insertWondergirl" parameterClass="jyp.WonderGirls">
  INSERT INTO
  WONDERGIRLS (NUM, NAME, AGE)
  VALUES (#num#, #name#, #age#)
 </insert>
 
 <update id="updateWondergirl" parameterClass="java.util.Map">
  UPDATE WONDERGIRLS SET
  NAME = #name#,
  AGE = #age#
  WHERE NUM = #num#
 </update>
 
 <delete id="deleteWondergirl" parameterClass="Integer">
  DELETE FROM WONDERGIRLS
  WHERE NUM = #num#
 </delete>
 
</sqlMap>
[/code]
sql문을 xml로 뺐습니다. 나중에 고칠 때 편할 듯 싶네요.
sql이 총 5가지가 있네요.
전체리스트가져오기, 멤버번호받아서 한명멤버정보 가져오기, 멤버추가하기, 멤버수정하기, 멤버삭제하기

select해서 List를 가져올 때에는 원래 자동맵핑이 되서 알아서 가져오지만 그래도 명시적으로 맵핑을 해줘야돼요. 그래서 resultMap태그를 이용해서 명시해준뒤에 select를 선언해서 그 resultMap의 id를 resultMap속성값에 넣어주면 됩니다.
insert할 때에도 WonderGirls클래스형으로 받아서 넣어주면 되구요.
update할 때 좀 틀린게 parameterClass를 Map으로 선언합니다. 이름, 나이, 번호를 각각 객체로 받아서 Map에 저장한 것을 받아서 사용하는 것이죠.
delete할 때에는 Integer클래스형으로 숫자하나 받아서 해당 멤버를 지우게 됩니다.

이번엔 DAO를 만들어봅시다. WondergirlsDao라는 이름의 클래스를 만들어봅시다.
[code]
package jyp;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import com.ibatis.sqlmap.client.SqlMapClient;

public class WondergirlsDao {

 @SuppressWarnings("unchecked")
 public void viewMember(SqlMapClient sqlMap) throws SQLException {
  List<WonderGirls> wonderGirlsList = (List<WonderGirls>) sqlMap
    .queryForList("getWondergirls");
  for (int i = 0; i < wonderGirlsList.size(); i++) {
   WonderGirls wonderGirl = (WonderGirls) wonderGirlsList.get(i);
   System.out.print("번호 : " + wonderGirl.getNum());
   System.out.print("   이름 : " + wonderGirl.getName());
   System.out.println("   나이 : " + wonderGirl.getAge());
  }
 }

 public void insertMember(SqlMapClient sqlMap, WonderGirls wonderGirls)
    throws SQLException {  
  sqlMap.insert("insertWondergirl", wonderGirls);
  System.out.println("추가에 성공했습니다.");
 }

 public void modifyMember(SqlMapClient sqlMap, Map<String, Object> map)
    throws SQLException {
  sqlMap.update("updateWondergirl", map);
  System.out.println("수정에 성공했습니다.");
 }

 public void deleteMember(SqlMapClient sqlMap, int num) throws IOException,
   SQLException {
  sqlMap.delete("deleteWondergirl", num);
  System.out.println("삭제에 성공했습니다.");
 }
 
 public boolean validateMember(SqlMapClient sqlMap, int num) throws SQLException {
  WonderGirls wonderGirls =
   (WonderGirls) sqlMap.queryForObject("selectWondergirl", num);
 
  if (wonderGirls == null) {
   return false;
  }
  return true;
 }
}
[/code]
DAO를 보면 이상하게 간단합니다. 위에 xml에 다 쿼리를 선언해줬기때문에 그냥 파라메터만 넘겨주면 됩니다.
List보기는 sqlMap.queryForList("getWondergirls"); getWondergirls는 위에 선언한 쿼리의 id입니다.
insert할 때에는 객체를 받아서 넘겨주고, 수정할 때에는 Map을 넘겨주고, 삭제 할때에는 숫자를 넘겨주면 됩니다.
아 간단해요. 한줄이면 끝나요-_-;
예전에 Connection을 close()안해줬더니 서버가 다운되려고 한 경험이 있는데 이런일은 절대 없을 것 같군요.

이제 main함수를 작성해봅시다. 이름은 WondergirlsApplication으로 해봅시다.
public static void main(String[] args)에 체크해주시는 것 잊지 마시구요-_-;
WondergirlsApplication.java
[code]
package jyp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import com.ibatis.sqlmap.client.SqlMapClient;

public class WondergirlsApplication {

 public static void main(String[] args) throws SQLException, IOException {

  BufferedReader bufferedReader = new BufferedReader(
    new InputStreamReader(System.in));
  SqlMapClient sqlMap = MyAppSqlMapConfig.getSqlMapInstance();
  WondergirlsDao wondergirlsDao = new WondergirlsDao();
  WonderGirls wonderGirls = new WonderGirls();
 
  Integer age, num;
  String name;
 
  while (true) {
   try {
    System.out.println("\n1.멤버출력\n2.멤버추가\n3.멤버수정\n4.멤버삭제\n5.종료");
    System.out.print("--> ");
    String temp = bufferedReader.readLine();
    int MenuNum = Integer.parseInt(temp);
    switch (MenuNum) {
    case 1:
     wondergirlsDao.viewMember(sqlMap);
     break;
     
    case 2:
     wonderGirls = new WonderGirls();
     System.out.print("번호을 입력하세요 : ");
     wonderGirls.setNum(Integer.parseInt(bufferedReader.readLine()));
     System.out.print("이름을 입력하세요 : ");
     wonderGirls.setName(bufferedReader.readLine());
     System.out.print("나이을 입력하세요 : ");
     wonderGirls.setAge(Integer.parseInt(bufferedReader.readLine()));
     wondergirlsDao.insertMember(sqlMap, wonderGirls);
     break;
     
    case 3:
     Map<String, Object> map = new HashMap<String, Object>(3);

     System.out.print("수정할 번호을 입력하세요 : ");
     num = new Integer(Integer.parseInt(bufferedReader.readLine()));
     if (!wondergirlsDao.validateMember(sqlMap, num)) {
      System.out.println("없는 멤버번호입니다.");
      break;
     }
     System.out.print("이름을 입력하세요 : ");
     name = bufferedReader.readLine();
     System.out.print("나이을 입력하세요 : ");
     age = new Integer(Integer.parseInt(bufferedReader.readLine()));

     map.put("num", num);
     map.put("name", name);
     map.put("age", age);
     wondergirlsDao.modifyMember(sqlMap, map);
     break;
     
    case 4:
     System.out.print("삭제할 멤버번호를 입력하세요 : ");
     num = Integer.parseInt(bufferedReader.readLine());
     if (!wondergirlsDao.validateMember(sqlMap, num)) {
      System.out.println("없는 멤버번호입니다.");
      break;
     }
     wondergirlsDao.deleteMember(sqlMap, num);
     break;
     
    case 5:
     System.exit(0);
     
    default:
     System.out.println("1~5중에서 선택하세요!");
     break;
    }
   } catch (NumberFormatException e) {
    System.out.println("잘못 입력했습니다. 다시 입력하세요");
   }
  }
 }
}
[/code]
자세히 보시면 뭐 별거없는데 거창하게 만들어놨군요(제가 좀 허접해서-_-) 아 참고로 예외처리 잘 안해놨으니 알아서 버그많아요 알아서 보세요-_-;

1번은 멤버 리스트를 가져오는군요.
[code]
1.멤버출력
2.멤버추가
3.멤버수정
4.멤버삭제
5.종료
--> 1
번호 : 1   이름 : 선예   나이 : 18
번호 : 2   이름 : 선미   나이 : 15
번호 : 3   이름 : 소희   나이 : 15
번호 : 4   이름 : 예은   나이 : 18
번호 : 5   이름 : 유빈   나이 : 5

1.멤버출력
2.멤버추가
3.멤버수정
4.멤버삭제
5.종료
-->
[/code]
2번은 멤버를 추가하는데 추가해봅시다-_-;
[code]
1.멤버출력
2.멤버추가
3.멤버수정
4.멤버삭제
5.종료
--> 2
번호을 입력하세요 : 6
이름을 입력하세요 : 성종천
나이을 입력하세요 : 25
추가에 성공했습니다.

1.멤버출력
2.멤버추가
3.멤버수정
4.멤버삭제
5.종료
--> 1
번호 : 1   이름 : 선예   나이 : 18
번호 : 2   이름 : 선미   나이 : 15
번호 : 3   이름 : 소희   나이 : 15
번호 : 4   이름 : 예은   나이 : 18
번호 : 5   이름 : 유빈   나이 : 5
번호 : 6   이름 : 성종천   나이 : 25

1.멤버출력
2.멤버추가
3.멤버수정
4.멤버삭제
5.종료
-->
[/code]
아 멤버가 추가되었어요-_-; (이거 욕먹겠군요-_-;)
멤버를 수정해봅시다. 유빈양의 나이가 잘못 되었으니 수정해봅시다.
[code]
1.멤버출력
2.멤버추가
3.멤버수정
4.멤버삭제
5.종료
--> 3
수정할 번호을 입력하세요 : 5
이름을 입력하세요 : 유빈
나이을 입력하세요 : 20
수정에 성공했습니다.

1.멤버출력
2.멤버추가
3.멤버수정
4.멤버삭제
5.종료
--> 1
번호 : 1   이름 : 선예   나이 : 18
번호 : 2   이름 : 선미   나이 : 15
번호 : 3   이름 : 소희   나이 : 15
번호 : 4   이름 : 예은   나이 : 18
번호 : 5   이름 : 유빈   나이 : 20
번호 : 6   이름 : 성종천   나이 : 25

1.멤버출력
2.멤버추가
3.멤버수정
4.멤버삭제
5.종료
-->
[/code]
아.... 유빈양이 제일 마지막에 들어왔는데 나이가 제일 많군요-_-;
그리고 이제 말도 안되는 성종천이라는 멤버를 지워봅시다-_-;
[code]
1.멤버출력
2.멤버추가
3.멤버수정
4.멤버삭제
5.종료
--> 4
삭제할 멤버번호를 입력하세요 : 6
삭제에 성공했습니다.

1.멤버출력
2.멤버추가
3.멤버수정
4.멤버삭제
5.종료
--> 1
번호 : 1   이름 : 선예   나이 : 18
번호 : 2   이름 : 선미   나이 : 15
번호 : 3   이름 : 소희   나이 : 15
번호 : 4   이름 : 예은   나이 : 18
번호 : 5   이름 : 유빈   나이 : 20

1.멤버출력
2.멤버추가
3.멤버수정
4.멤버삭제
5.종료
-->
[/code]
아.....잘 되는군요-_-; 난 왜 이짓을 하고 있는거지-_-;

 
Posted by 머드초보

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. BlogIcon 머드초보 2007.10.20 09:09  댓글주소  수정/삭제  댓글쓰기

    새벽 5시까지 뭐한거야-_-; 어쨌든 자네가 칭찬해줘서 고맙구먼. 다 자네덕분이지-_-;

  3. 초보입니다. 2008.07.18 19:18  댓글주소  수정/삭제  댓글쓰기

    완전 멋지네요...나도 이런 장난도 칠수있는 여유가 있었음 좋겠스빈다 ㅠ

    • 머드초보 2008.07.21 08:24  댓글주소  수정/삭제

      아...저예제의 잘못된 점이 참 많은데....-_-;
      고마워요 ^^ 저도 사실 초보에요 ㅠ
      방문해주셔서 감사해요~

  4. BlogIcon 지니랜드 2009.01.05 17:29  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다.

    • 머드초보 2009.01.07 02:21  댓글주소  수정/삭제

      아넵 방문해주셔서 감사합니다 ^^
      도움이 되셨다니 다행이네요^^
      헉...이거 너무 오래전에 짠거라-_-;

  5. 지나가는초보 2009.12.31 11:48  댓글주소  수정/삭제  댓글쓰기

    ㄳ 속쉬원하네요
    소스도 다 잘되고요
    다만 WonderGirls.xml에서 DELETE FROM WONDERGIRLS WHERE NUM = #num# 이렇게 해줘야지 되네요 FROM빠졌다고 에러나던데...

  6. BlogIcon 선화 2010.07.22 02:36  댓글주소  수정/삭제  댓글쓰기

    감사합니다..도움이 많이 되었네요...

    블로그로 살포시 복사해갑니당..

  7. BlogIcon 누리군 2010.09.01 14:13  댓글주소  수정/삭제  댓글쓰기

    앗...이렇게 좋은 예제가...

    감사해요^^

  8. BlogIcon 박일권 2012.01.18 10:38  댓글주소  수정/삭제  댓글쓰기

    사랑해요

  9. BlogIcon 웅담 2012.02.09 09:59  댓글주소  수정/삭제  댓글쓰기

    오우 .. 왜 이짓을 하긴요 무지한 저같은 사람을 위해서?

  10. BlogIcon 박민규 2012.03.13 22:17  댓글주소  수정/삭제  댓글쓰기

    DB와의 연동을 매끄럽게 해주는군요!!
    프로젝트에 써먹어야겠네요 ㅎㅎㅎㅎ
    감사합니다.
    근데 HIBERNATE라는 놈이랑iBatis는 어떤관계지요 ?

    • BlogIcon 머드초보 2012.03.22 11:35 신고  댓글주소  수정/삭제

      Hibernate는 Object Relation Mapper구요. 즉 객체와 디비의 관계형을 매핑하는 것이죠. 그래서 그냥 디비가 프로그래밍에 녹는 느낌? iBatis는 지금은 많이 바뀌었지만, 그때 당시만해도 그냥 sqlmapper였습니다. sql이 미리 정의되어있고, 그걸 손쉽게 함수로 꺼내쓰는 그런 존재였습니다^^

  11. 차메 2012.06.11 17:48  댓글주소  수정/삭제  댓글쓰기

    아주 좋은 예제입니다.
    웹과 postgresql 연동할때 필수지침처럼 항상 참고합니다.
    군더더기없고 깔끔한 코딩이십니다.

  12. BlogIcon 노진우 2012.06.25 15:57  댓글주소  수정/삭제  댓글쓰기

    감사해요 많은 도움이 되었습니다 :)

  13. 웹웹 2013.02.05 02:08  댓글주소  수정/삭제  댓글쓰기

    감사합니다^^
    재밌게 보았습니다 ㅎㅎㅎ

  14. 1 2013.03.07 17:51  댓글주소  수정/삭제  댓글쓰기

    이것은 좋은 예제다.

  15. 26살 동정 2013.03.11 21:15  댓글주소  수정/삭제  댓글쓰기

    님아 사랑해요

  16. 2013.04.12 09:36  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  17. 똥광이 2013.08.21 15:31  댓글주소  수정/삭제  댓글쓰기

    재밋게 잘 봤습니다..^^ 큰 도움이 됬습니다!!

  18. 덜덜 2014.01.06 15:43  댓글주소  수정/삭제  댓글쓰기

    잘보고 갑니다.선예 아아.

  19. 레베 2014.01.10 09:26  댓글주소  수정/삭제  댓글쓰기

    잘 보았씁니다~~

  20. ㅇㅇ 2014.04.11 09:52  댓글주소  수정/삭제  댓글쓰기

    감사합니다 머릿속에 정리가 딱 되네요

  21. 호박 2015.09.04 00:47  댓글주소  수정/삭제  댓글쓰기

    감사합니다.
    초짜로 아무것도 모르고 예제를 따라만 쳐봤어요^^
    이제 분석해야될 것 같습니다.^^