국비지원학원/MyBatis

110일차-Framework_MyBatis

초코맛 2019. 4. 15. 00:46
반응형
*Framework
  • 자주 사용될 기능을 미리 구현해 놓은 것 (Library와 같다)
    • => library도 가지는 특징 => 내가만들어 남이 편하게 쓴다 => 홍익인간정신(널리사람을 이롭게한다)
  • 배포는 jar로
    • 생명주기에 차이가 있다(생성하고 
    • library :
      • <<<개발자가 new를 할 타이밍을 잡고 사용하고>>>
      • 생명주기를 개발자가 관리한다(new에 관한걸 개발자가)
      • 제공하는 기능을 변경하지 않고 그대로 사용한다.
    • Framework :
      • <<<Framework에서 생명주기를 관리한다.>>>
      • 생명주기를 Framework가 관리한다.(new 를 개발자가 거의 안한다)
      • 제공하는 기능을 개발자가 상황에 맞게 변경(커스터마이징)하여 사용한다.
    • java는 두개의 성격을 가지고 있지만 library에 더 가깝다.
    • 내장 Library를 보면 JRE Lirary라고 나옴.
  • ///필요한것만 만들면된다. =>고생을 덜하게 됨
  • 생산성 향상
  • ///프레임워크에 사용적인 관점이 더 중요(써봤냐)

개발 방법
class
CBD(component ~Develope
=Library랑 비슷
=내가 필요하지 않은 기능도 들어가 있어서 (내가 못막)
Framework
베어본(반조립 형태)
=조립이 되서 나온다

컴퓨터 조립
cpu,ram,저항,다이오드,전선,,,
cpu,ram,d/su,m/b,
vga,케이스(완성된 부품)
반조립 형태로 cpu,?만 선정.

개발 난이도
개발 속도
느림(하)
上=>난이도 하락으로 개발속도 증가
품질
  • 최소한의 품질( 신뢰도 ) 보장 (나한테 의뢰한 클라이언트가 받고싶어 함)=>동작!!!
    • ///=>사용을 일반 사용자가 하게 되는데 (대고객 서비스(모든 사람을 대상으로)/버티컬 서비스(특정계층을 상대로))
    • 갑 : (공무원)공공기관,은행(금융권),물류회사-일주는 사람(업무를 만들어 구현 의뢰)
    • 을 : SDS,CNS,C&C,쌍용정보-관리
    • 병 : 자회사, 규모있는 회사
    • 정 : 중소기업으로 피라미드 구조가 된다.
  • Mybatis, Spring, lafJ, df,,,struts,,,등이 있다. 개발환경은 다양해 
 
 
MyBatis는 원래 Apache의 iBATIS에서 myBATIS -> MyBatis가 된것으로 크로스 플랫폼=>편해요 

*MyBatis
  • //최소한의 품질보장으로 미리 만들어진 것들로 편하게 사용할 수 있는 Framework
  • //설정을 xml로 밖에서 변경값 설정이 가능하다(장)
  • DB Mapper Framework
    • Query 를 xml에 넣어 사용
  • iBATIS(apache)->myBAITS(google)->MyBatis(독립-GIT) 가 되었다.
  • 다양한 언어에서 사용할 수 있다. (Cross Language)=>Java,.net
  • //개발자들이 가장 많이 사용해본 프레임워크 1위
  • //JDBC - 연결을 끊지 않으면 서버가 죽는 그런 문제를 다 해준다.
  • XML에 쿼리문을 정의하고 사용하는 방식(DB Mapper방식)
  • Java에서 지원하는 PreparedStatement, Procedure를 손쉽게 사용할 수 있도록 해준다.
  • ///PreparedStatement:미리생성/실행 - 반복수행될때 사용 (statement보다 안전)
  • ///JDBC : 연결~ 끊기 문법이 나오지 않는다.->언어에 대한 경력이 아니라 프레임워크에 대한 경력이 된다.
  • ///잘해도 내가 아니고 신입도 가능해짐(결과가 같음) 협상의 카드가 줄어든다
  • JDBC의 불편함(중복코드) 를 개선 =>몰라도 MyBatis사용법만 알면 가볍고 편하게 사용가능
  • //속도가 느려진다.(더많은 ...) 범용 - 누구나...
  • 구조)
  • (이미지)

    DBMS

    MyBatis-설정용xml-Query문을 가진 Mapper xml

  • 개발자의 사용 

  • 사용법)
  • 코드)
  • 1.
  • 설정용 xml에 홈페이지에 나와있는 코드 복붙
  • 2.
  • Mapper xml에도 마찬가지
  • Domain : (DB=컬럼하나(가질 수 있는 값의 범위)/web=(웹 주소)) 
    • VO처럼 작성하나 VO와는 구분하여 사용
    • 조회한 결과를 저장할 때 사용하는 객체
    • select에 대해서만.
  • VO
    • 값을 가진 객체
    • insert 추가하는 값, update 변경하는 값, where 절에 들어 가는 값.
  • <select id="식별자"   //
    • select name, age   //<=Domain - select만 나뉘어 진다. 구분해서 사용!!! VO면 안된다
    • from 테이블명
    • where 컬럼명=값   //<=VO
  • </select>

  • 사용법)
    1. 설정용 xml작성 (mybatis.config.xml)
    2. Mapper xml 작성(xxx_mapper.xml)
    3. 설정용 xml과 연결할 스트림 사용. (한글이 들어갈 수도 있기 때문에 16bit으로 사용을 권장한다)
      • Reader r=Resouries.getRewourceAsReader("설정용xml경로");    //(마이바티스에서 제공하는 class-ibatis로 되어있는 클래스도 아직 존재.)
    4. MyBatis Framework 생성
      • SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();    //빈 객체가 만들어 진것
    5. 설정파일과 연결된 Stream을 할당하여 DB가 연동된 MyBatis Framework 객체 얻기
      • SqlSessionFactory ssf=ssfb.build(r);    //ssf는 가급적 하나의 객체를 권고하고 있다. 어떻게 하면 thread에 안전하게 ? : 싱글턴패턴+syncronized
          • =>ssf는 하나의 객체로 Thread에 안전하게 사용해야 하는 객체.
    6. MyBatis Handler를 얻기
      • =>쿼리를 가진 XML의 노드의 id로 찾아 Parsing 하여 쿼리를 수행하고 결과를 얻는 일
      • SqlSession ss=ssf.openSession();
      • 추가 : ss.insert("id",VO);    //int 로 받는것도 가능하지만 쓸곳 없어 void 
      • 변경 : ss.update("namespace.id",VO);
      • 삭제 : ss.delete("namespace.id", VO);
      • 조회 - 한행 : ss.selectOne("id",VO);    //=>Domain(여기에만 쓰임)
      • 조회 - 여러행 : ss.selectList("id",VO);    //=>List<Domain>
      • ///몰라도 사용가능 알아서 연결을 끊어줌 (세세히 조절안되지만 편함)
      • ///딱 하나만 알면 그 방법이 막혔을때 그 기능을 사용할 수 없게 됨.


 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
  <!-- MyBatis의 환경설정(연동할 DB에 대한 설정)을 수행하는 xml
           설정 정보를 properties에 넣고 하는 것과
           설정 정보를 직접 Hard Coding하는 방법 2가지.
   -->
<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver"  value="oracle.jdbc.OracleDriver"/>
        <property name="url"  value="jdbc:oracle:thin:@localhost:1521:orcl"/>
        <property name="username" value="scott"/>
        <property name="password" value="tiger"/>
      </dataSource>
    </environment>
  </environments>
  <!-- 쿼리문을 가진 XML을 연결(*:0~n개) -->
  <mappers>
    <mapper resource="day0403/mapper/dept_mapper.xml"/>
  </mappers>
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <!-- Query문을 정의
        namespace=ns: XML내에서 중복된 id를 사용할 수 있도록  구분하는 것.
                             (자바의 패키지와 비슷한 용도)
           select 안에 ; 절대 사용하지 않는다!!!
  -->
<mapper namespace="kr.co.sist">
  <select id="selectAllDept" resultType="day0403.DeptDomain">
    <!-- select deptno, dname, loc from dept -->
    select deptno, dname, loc from cp_dept
  </select>
  
</mapper>
package day0403;
/**
* 조회하는 컬럼의 값을 저장하는 VO를 Domain
* @author owner
*/
public class DeptDomain {
     private int deptno;
     private String dname, loc;
     
/*   public DeptDomain() {
           System.out.println("DeptDomain기본생성자");
     }
     public DeptDomain(int deptno, String dname, String loc) {
           this.deptno = deptno;
           this.dname = dname;
           this.loc = loc;
           System.out.println("DeptDomain 인자있는 생성자");
     }//컴파일러가 생성자를 알아서 만들어줌으로 만들지 않고  사용한다.
     */
     
     public void setDetpno(int deptno) {
           this.deptno = deptno;
     }
     public void setDname(String dname) {
           this.dname = dname;
     }
     public void setLoc(String loc) {
           this.loc = loc;
     }
     public int getDeptno() {
           return deptno;
     }
     public String getDname() {
           return dname;
     }
     public String getLoc() {
           return loc;
     }
     
}
package day0403;
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class UseMyBatis {
     
     //2차 수업
     public SqlSessionFactory getSessionFactory() throws  IOException{
           //1.환경설정 xml에 stream연결
           Reader  reader=Resources.getResourceAsReader("day0403/mybatis_config.xml"); //절대경로는 필요없고 패키지경로부터 적으면된다.
                //mybatis-3.5.0.jar를 build path로 잡으면 개발은  되는데 운용이 되지 않는다.
           //2.MyBatis Framework 생성
           SqlSessionFactoryBuilder ssfb=new  SqlSessionFactoryBuilder();
           //3.MyBatis Framework과 DB연동한 객체 얻기(객체를  하나로 관리)
           SqlSessionFactory ssf=ssfb.build(reader);
           //System.out.println(ssf);
           if(reader!=null) {
                reader.close();
           }//end if
           //3번까지 한번만 해서 팩토리로....
           
           return ssf;
     }//getSessionFactory

     public void selectAllDept() throws IOException {
/*         //1.환경설정 xml에 stream연결
           Reader  reader=Resources.getResourceAsReader("day0403/mybatis_config.xml"); //절대경로는 필요없고 패키지경로부터 적으면된다.
                //mybatis-3.5.0.jar를 build path로 잡으면 개발은  되는데 운용이 되지 않는다.
           //2.MyBatis Framework 생성
           SqlSessionFactoryBuilder ssfb=new  SqlSessionFactoryBuilder();
           //3.MyBatis Framework과 DB연동한 객체 얻기(객체를  하나로 관리)
           SqlSessionFactory ssf=ssfb.build(reader);
           //System.out.println(ssf);
           if(reader!=null) {
                reader.close();
           }//end if
           //3번까지 한번만 해서 팩토리로....
*/         
           //4.MyBatis Handler 얻기
           SqlSession ss=getSessionFactory().openSession();
           //5.Handler를 사용하여 DB작업 수행
           List<DeptDomain> list=  ss.selectList("kr.co.sist.selectAllDept"); //selectAllDept도  가능하다.-id가 유일 하다면!
           DeptDomain dd=null;
           for(int i=0; i<list.size(); i++) {
                dd=list.get(i);
                System.out.println(dd.getDeptno()+"/"+dd.getDname()+"/"+dd.getLoc());
           }//end for
           //6.사용이 종료된 SqlSession을 닫는다.
           ss.close();
           
     }//selectAllDept
     public static void main(String[] args) {
           UseMyBatis umb=new UseMyBatis();
           try {
                umb.selectAllDept();
           } catch (IOException e) {
                e.printStackTrace();
           }//end catch
     }//main
}//class

*Mapper 작성법
  • //직관적
  • 추가)
    • <insert id="Handler 에서 찾은 ID" parameterType="패기지명.vo명">
    • insert into 테이블명(컬럼명,,,) values(값,,,)   
      • //이때의 값은 ${vo.getter}=>쿼리로 대체:쿼리문으로 반영 | #{vo.getter} =>bind변수로 대체=?=값(컬럼명과테이블명은 x?)
      • //따라서 값을 넣을 때 #, 컬럼명이나 테이블명은 $사용한다.
    • --쿼리로는 이 라인만 막히는게 아니라 그 뒤로 다 막혀 버린다.(내컴은 잘되지만 서버에 올라가면 안됨) /**/로는 가능하다!!!
    • </insert>
    • 사용)
    • ss.insert("id", VO);   //id에 해당하는 노드를 찾아서 파싱을 한다음에 그 값을 pstmt에 넣는데 $는 값, #은 ? 으로 실행된다. 
          • //vo는 패키지명.vo명을 찾아 값에 들어간다. 
  • 변경)
    • <update id="Handler에서 찾을 ID" parameterType="VO명">
    • update 테이블명 
    • set 컬럼명 = 값
    • where 컬럼명 = 값
    • </update>
    • 사용)
    • int cnt= ss.update("id, vo);
  • 삭제)
    • <delete id="id" parameterType="VO">
    • delete from 테이블명
    • where 컬럼명=값
    • </delete>
    • 사용)
    • int cnt=ss.delete("id",vo);
    • //vo가 픽스되어있다면 id만 넣어도 된다.
  • 조회)
    • <select id="id" parameterType="VO" resultType="Domain">
    •  select 컬럼명,,,    //Domain
    •  from 테이블명
    •  where 컬럼명=값    //VO
    • </select>
    • 한행 사용)
    • Domain d=ss.seelctOne("id", VO); //vo가 들어가고 Domain이 나온다.
    • //한행나와야할 쿼리가 여러행이 나오면 Error
    • 여러행 사용)
    • List<Domain> list=ss.selectList("id", VO);  //vo가 들어가지고 조회한 결과가 도메인을 타고 나와 저장된다.
    • //그래서 for문 사용
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <!-- Query문을 정의
        namespace=ns: XML내에서 중복된 id를 사용할 수 있도록  구분하는 것.
                             (자바의 패키지와 비슷한 용도)
           select 안에 ; 절대 사용하지 않는다!!!
  -->
<mapper namespace="kr.co.sist">
  <select id="selectAllDept" resultType="day0403.DeptDomain">
    <!-- select deptno, dname, loc from dept -->
    select deptno, dname, loc from cp_dept
  </select>
  
  <!-- 2차추가 -->
  <insert id="insertCpDept" parameterType="day0403.DeptVO">
     INSERT INTO CP_DEPT(DEPTNO, DNAME, LOC) VALUES(#{deptno},  #{dname}, #{loc})
  </insert>
  
  <update id="updateCpDept" parameterType="day0403.DeptVO">
     UPDATE CP_DEPT
     SET DNAME=#{dname}, LOC=#{loc}
     WHERE DEPTNO=#{deptno}
  </update>
  
  <delete id="deleteCpDept" parameterType="int">
  DELETE FROM CP_DEPT
  WHERE DEPTNO=#{deptno}
  </delete>
  
  
</mapper>
package day0403;
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class UseMyBatis {
     
     //2차 수업
     public SqlSessionFactory getSessionFactory() throws  IOException{
           //1.환경설정 xml에 stream연결
           Reader  reader=Resources.getResourceAsReader("day0403/mybatis_config.xml"); //절대경로는 필요없고 패키지경로부터 적으면된다.
                //mybatis-3.5.0.jar를 build path로 잡으면 개발은  되는데 운용이 되지 않는다.
           //2.MyBatis Framework 생성
           SqlSessionFactoryBuilder ssfb=new  SqlSessionFactoryBuilder();
           //3.MyBatis Framework과 DB연동한 객체 얻기(객체를  하나로 관리)
           SqlSessionFactory ssf=ssfb.build(reader);
           //System.out.println(ssf);
           if(reader!=null) {
                reader.close();
           }//end if
           //3번까지 한번만 해서 팩토리로....
           
           return ssf;
     }//getSessionFactory
     
     //2차
     public void insertCpDept(DeptVO dv) throws  IOException,SQLException{
           //4.MyBatis Handler 얻기
           SqlSession ss=getSessionFactory().openSession();
           //5.Handler를 사용하여 DB작업 수행
           int cnt=ss.insert("insertCpDept",dv);
           ss.commit(); //해주어야 보인다 실패시 rollback
           System.out.println("추가 작업"+cnt);
           //추가작업이 3줄로 끝나게 된다=>생산성 향상
     }//insertCpDept
     
     //2차
     public void updateCpDept(DeptVO dv) throws IOException,  SQLException{
           //4.MyBatis Handler 얻기
           SqlSession ss=getSessionFactory().openSession();
           //5.쿼리문 수행
           int cnt=ss.update("updateCpDept",dv);
           ss.commit();
           System.out.println("변경 성공"+cnt);
           
     }//updateCpDept
     
     //2차
     public void deleteCpDept(int deptno) throws  SQLException,IOException{
           //4.MyBatis Handler 얻기
           SqlSession ss=getSessionFactory().openSession();
           //5.Handler 사용하여 쿼리 수행
           int cnt=ss.delete("deleteCpDept",deptno);
           ss.commit();
           if(cnt==1){
                System.out.println(deptno+"번 부서 정보를 삭제  하였습니다.");
           }else {
                System.out.println(deptno+"번 해당 부서는  존재하지 않습니다.");
           }//end else
           
     }//deleteCpDept
     
     public void selectAllDept() throws IOException {
/*         //1.환경설정 xml에 stream연결
           Reader  reader=Resources.getResourceAsReader("day0403/mybatis_config.xml"); //절대경로는 필요없고 패키지경로부터 적으면된다.
                //mybatis-3.5.0.jar를 build path로 잡으면 개발은  되는데 운용이 되지 않는다.
           //2.MyBatis Framework 생성
           SqlSessionFactoryBuilder ssfb=new  SqlSessionFactoryBuilder();
           //3.MyBatis Framework과 DB연동한 객체 얻기(객체를  하나로 관리)
           SqlSessionFactory ssf=ssfb.build(reader);
           //System.out.println(ssf);
           if(reader!=null) {
                reader.close();
           }//end if
           //3번까지 한번만 해서 팩토리로....
*/         
           //4.MyBatis Handler 얻기
           SqlSession ss=getSessionFactory().openSession();
           //5.Handler를 사용하여 DB작업 수행
           List<DeptDomain> list=  ss.selectList("kr.co.sist.selectAllDept"); //selectAllDept도  가능하다.-id가 유일 하다면!
           DeptDomain dd=null;
           for(int i=0; i<list.size(); i++) {
                dd=list.get(i);
                System.out.println(dd.getDeptno()+"/"+dd.getDname()+"/"+dd.getLoc());
           }//end for
           //6.사용이 종료된 SqlSession을 닫는다.
           ss.close();
           
     }//selectAllDept
     public static void main(String[] args) {
           UseMyBatis umb=new UseMyBatis();
           try {
                //2차 추가
                //DeptVO dv=new DeptVO(11, "SM개발", "원주");
                //umb.insertCpDept(dv);
                //commit을 안하면 값이 들어간게 보이지 않는다.
                //umb.updateCpDept(dv);
                umb.deleteCpDept(1);
                
                umb.selectAllDept();
           } catch (IOException e) {
                e.printStackTrace();
           }catch (SQLException e) {
                e.printStackTrace();
           }//end catch
     }//main
}//class
package day0403;
public class DeptVO {
     //아무리 같은형태라도 일이 다르면 또만들어야 한다.(값의  사용처가 다르면!)
     private int deptno;
     private String dname,loc;
     
     public DeptVO(int deptno, String dname, String loc) {
           this.deptno = deptno;
           this.dname = dname;
           this.loc = loc;
     }//인자있는 생성자만 쓰는 이유-값이 들어가야 하는 경우가 있기  때문!!insert/update!!
     
     //전달만하면되서 getter만
     public int getDeptno() {
           return deptno;
     }
     public String getDname() {
           return dname;
     }
     public String getLoc() {
           return loc;
     }
}



 

 

반응형

'국비지원학원 > MyBatis' 카테고리의 다른 글

115일차-페이지 선택유지/dynamicQuery/procedure사용  (0) 2019.04.19
114일차-Dynamic Query조회  (0) 2019.04.19
113일차-지도 마무리/조회 마무리  (0) 2019.04.19
112일차-MyBatis  (0) 2019.04.17
111일차-MyBatis  (0) 2019.04.17