List

수요일, 12월 09, 2015

Mybatis 연동 - Spring 환경


  • 컨테이너 처리 ( XXX . xml )
    • db 연결 처리
      • org.apache.commons.dbcp.BasicDataSource
        • destroy - method : 자원 해제 메서드 호출
        • driverClassName : jdbc 드라이버 연결
        • url : db 연결 처리
        • username : 계정명
        • password : 비밀번호
    • sqlSessionFactory : mybatis 연결 처리
      • org.mybatis.spring.SqlSessionFactoryBean
        • dataSource : db 연결모듈 매핑
        • configLocation : mybatis 설정 파일 처리
    • 마이바티 default DAO단 기본 package 선언
      • org.mybatis.spring.mapper.MapperScannerConfigurer
        • bacePackage : default dao

  • 마이바티즈 설정 및 mapper xml

  • 특정 folder에 두개 파일을 생성
    • src밑에 resource package생성
    • mybatis.Spring.xml(마이바티즈 관련 설정)
    • xxx Mapper.xml ( 각 모듈별 xml 파일)
  • 공통 Repository 패키지 생성 및 interface선언
    • 패키지명.인터페이스명.메서드 -> mapper.xml의 id값에 선언


전체적인 파일 구조                               









  • 이제 DBConn 은 필요 없다 say good bye!!
  • XXXMapper.xml + Dao + Service 가 서로 합쳐져서 DBConn을 대체...
  • 왜 서비스단이 필요한가? :  컨트롤러의 주요역할은 분기작업만 값을 넘겨주는 그런 내용 조건을 넣거나 로직을 고치거나 하는게 아님 그런역할을 해주는 부분이 바로 Service단 처리 내용은 서비스단에서 전부 처리
  • 3단 매핑구조
  • config.xml  - XXXMapper.xml (dao 의 메서드 내용이 선언되어있음)
  • service 와 -Autowired- 로 dao가 엮인 상태에서 dao의 메서드들을 service가 실행함
  • Ctrl 에서 service의 method 를 호출!
  • 이제 Ctrl 와 config.xml 을 container(dispatcher-servelet)에 올린다!

  • config.xml 단 : DB연결 부분
    • DBConn 에서 setConn을 담당하는 부분
1
2
3
4
5
6
7
       <!--DB연결 모듈  -->
<bean id ="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="net.sf.log4jdbc.DriverSpy"></property>  
    <property name="url" value="jdbc:oracle:thin:@59.10.147.68:1521:orcl"></property
    <property name="username" value="scott"></property>     
    <property name="password" value="tiger"></property>     
</bean>
cs
  • config.xml 단 : config파일과 연결부분
    • property name = "configLocation"
    • 부분에  value = " config.xml파일의 주소" 를 매핑
1
2
3
4
5
      <!--mybatis 연동resource\mybatis-config.xml -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <property name="configLocation" value="classpath:resource/mybatis-config.xml"/>
</bean
cs
  • config.xml 단 : 연동 Repository 선언(dao들을 bacepackage 설정)
1
2
3
4
5
      <!-- 연동 Repository 단 서언 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="springweb.dao"/>
</bean>
         
         
cs



  • Dao 단 ( Interface )
    • 사용될 메서드들을 선언만 해놓음

1
2
3
4
5
6
7
8
9
10
11
12
13
@Repository
public interface MyEmpDao {
    //z02_dao.MyEmpDao.getEmplist
    public ArrayList<Emp> getEmplist();
    public Emp setSchEmp(int empno);
    public void uptEmp(Emp emp);
    public void delEmp(Emp emp);
    public void insEmp(Emp emp);
}
cs


  • service 단
    • autowired 로 repository 하위의 dao가 끌려옴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Service
public class EmpService {
    
    @Autowired(required=false)
    private MyEmpDao dao;//인터페이스 선언된 아이를 오토와이어
    
    public ArrayList<Emp> getEmplist(){
        return dao.getEmplist();}
    
    public Emp setSchEmp(int empno){
        return dao.setSchEmp(empno);}
    
    public void delEmp(Emp emp){
        dao.delEmp(emp);}
    public void uptEmp(Emp emp){
        dao.uptEmp(emp);}
    public void insEmp(Emp emp){
        dao.insEmp(emp);}
}
cs






  • XXXMapper.xml
    • namespace = 구분자
    • resultMap = DBConn에서 ResultSet [ while(rs.next())] 의 역할
    • type = config.xml의 typeAliases 에 선언한 vo type을 선언
    • 쿼리문 작성
      • id = " dao파일의 path + dao파일의 해당 method " 로 선언 또는!
1
2
3
4
5
6
7
8
9
10
<mapper namespace="EmpMapper">
    <!-- resultMap선언 -->
    <resultMap type="emp" id="empRst"/>
    
    <select id="springweb.dao.MyEmpDao.getEmplist" resultMap="empRst">
        select * from emp_s
    </select>
</mapper>
cs
      • 아래와 같은 방식으로
      • namespace 를 dao의 주소로 선언한뒤
      • 쿼리문의 id에 해당 method만 선언해도 같은 내용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<mapper namespace="springboard.repository.BoardDao">
    <!-- resultMap선언
    getBoard1 boardlist
     -->
    <resultMap type="board" id="boardRst"/>
    <select id="boardlist" resultMap="boardRst">
        select * from board
        order by no desc
    </select>    
  
</mapper>
cs

  • ctrl 단
    • EmpService service 를 오토와이어로 끌어옴
    • 이후 메서드를 직접선언하는게 아니라 service객체를 통해 처리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Controller
@RequestMapping("MyEmp.do")
public class A03_MyEmp {
    
    @Autowired(required=false)
    private EmpService service;
    
    @RequestMapping(params="method=list")
    public String emplist(Model d){
        
        d.addAttribute("list",service.getEmplist());
        return "a12_09/m01_MybatisEmp";
    }
    
cs


  • Annotation으로 Mapper에 선언 없이 사용하기

1
2
3
4
5
//ibaits 환경에서 mapper 호출 없이 @@@Mapper.xml 에 등록한것과 똑같은 효과
    //조건문은 , 로 구분이 필요 
    //객체도 가능!! ex) emp , board 등등
    @Update({"UPDATE BOARDSJH SET readcnt=readcnt+1" , "where no=#{no}"})
    public void readCntUpt(int no);
cs







댓글 없음:

댓글 쓰기