본문 바로가기
WEB/✿Spring Framework

[Spring] 🔗8) MyBatis

by W_W_Woody 2022. 3. 5.

MyBatis

 

MyBatis는 iBatis로부터 파생되었다. iBatis는 Apache에서 만든 프레임워크이지만 2010년 iBatis가 Apache에서 탈퇴하여 Google로 넘어가면서 이름이 MyBatis로 변경되었다.

 

MyBatis 사이트 : https://blog.mybatis.org/

 

MyBatis 문서 : http://www.mybatis.org/mybatis-3/ko/index.html

 

기본 공통 셋팅 + 추가된 설정

프로젝트 생성하고 java버전 맞춰준다.

pom.xml에 오라클드라이버 설정하는 repositories 넣어주고

라이브러리도 추가해준다.

(hibernate -> @Range사용할 때)

web.xml에 filter부분을 넣어준다.

board형태로 사용할 것이기 때문에 변경해주고 messageSource지정 하는 태그들을 넣어준다.

 

root-context.xml  도 이전에 쓰던 파일 넣어준다.

 

커넥션풀 설정하는 config와 유효성 체크하는 messages를 만들어준다.

 

log4.xml 에서도 spring이라는 명칭말고 board를 쓸 것이기 때문에  kr.spring.Spring에서 kr.spring 으로 변경해준다.

 

table.sql생성

정적파일이 들어가는 webapp/resources에 css파일 생성

 

index.jsp 생성 후 실행시켜서 오류 확인


셋팅법이 두가지가 있다.

1.vo 생성 유효성체크는 어노테이션 방식

2.DAO 인터페이스 생성

3.구현체(DAOImpl)만들어준다

 SqlSessionTemplate : 
  MyBatis가 제공하는 객체를 주입받아서 작업
4. xml 기본 형식을사용하자

BoardMapper.xml
0.00MB

 

 

 

Mapper밑에 메서드 단위로  SQL문장을 실행시키는데

MyBatis는 그 SQL문장을 이 xml에 명시해서 보여준다.

 

 

통합적인 MyBatis설정파일이 하나 더있다,

SqlMapConfig.xml
0.00MB

 

 

 

설정파일 된 작업들을 root-context,xml에 등록해준다.

 

생성되는 객체를 명시해주고

(이 때 생성되는 객체는 두가지로

1.sqlSessionFactoryBean

2. sqlSesion템플릿)

기본적인 설정

5.DAOImpl에서 직접 SQL문을 작성하지않고

 SpingJDBC와 달리 아이디를 설정해서 그걸가지고 xml에서 읽어와서 SQL작업하도록 한다.

6.service에 넘긴다

6-1.service인터페이스 생성(일반적으로 dao인터페이스와 동일한 명칭사용)

6-2.service클래스 생성

7.controller클래스 생성

modelAndview로 뷰 이름 저장하고, 데이터 저장한다.

8.jsp생성

 

MyBatis는 인자값을 하나로 받는다(일반적으로 Map형태로 묶어서)

 

1) SqlSessionTemplate방식 

boardMapper.xml에서 sql작성한다. 이해하기 편하게 줄바꿈하며 적기도 한다,

boardMapper.xml 식별자(namespace)있음맨위코드에

위에 1-총 레코드 수 작업

 

2-목록작업

 xml에서 <=특수문자로 인시갛기 떄문에xml에서 사용되는 특수문사로 인식하기 때문에 

xml문법으로CDATA는 문법적으로 스킵해준다 캡쳐한거참고

 

오류 메세지가 자꾸뜰 때 윈도우=프리퍼런시스 캡쳐한거 참고

파라미터 타입이 map이라서 map에 담아져서 오는데 map에 저장된 키를 #{식별자}

이 안에 넣어주는것이다

 

 

파라미터 타입은 = 전달되는 데이터가있다

리저트 타입은 = 반환하는 데이터가 있다.

2.dao impl

getboardcount()

한건의 정보를 읽어올 때 integer타입으로 반환해햐한다.

3.sevice impl

dao호출

하나의 객체를 받을 때는 selectOne이라른 메서드사용(getBoardcount())

 

4.controller

map,put("여기에넣는것들이 key")

그 key들이 xml에 #{식별자}이다.

 

mybatis는 하나의 인자만 처리하니까 map으로 묶어서 보내는 것이다.

5.jsp(view) - selectList

 

<div class="align-center">${pagingHtml}</div>

 

3-글쓰기

1.controller에서 자바빈을 초기화하고

폼을 호출하고 

2.폼jps생성

커스텀 태그를 사용해야하니까 상단에 form 태그 작성

form:태그의 path는 자바빈의 파라미터 명과 일치해야 한다.

 

vo에 @Notempty어노테이션을 명시했기 때문에

유효성 체크할 때 @Valid를 작성해야 연동이 될것이다

 

3.daomapper.xml

pramaeterRype=boardVO 으로 반환타입이 boardVO이기 떄문예

반환타입에 명시된 객체(이자바빈)의 프로퍼티가 식별자*(

(프로퍼티에 ㅈ데이터가 담겨져있기 때문에) 식별자 가 자바빈

 

4.boarddaoimpl

insert메서드  인자 넘겨준다.

 

5.serviceado

dao.부름

 

6.controller

글쓰기 처리 작업

자바빈에 데이터가 담겨서 오기 때문에@valid

없으면 무반응

 

4-글상세

1.xml

자바빈에 한꺼번에 담아서 보내려고 resulttype="boardVO"

프라이 머리 키가 전달되기 때문에

num값 (프라이머리 키) 전달

 

파라미터 타입이 인티저 일 경우엔느

dao impl쪽에서 매핑되니까 인자를 본다. 인자가 getBoard(int num)

변수가 식별자 역할을 한다.

 

2.daoimpl

한건의 레코드르 읽어올때는 selectone메서드 사용하고

식별자를 getBoard로 지정했었고 num을 전달

즉 num이 식벌자 역할을 해서 "getBoard"에 값을 전달해준다.

 

3.servied

 dao호출하고 

 

4.controller

num값을 받는 것이니 까 @requrestParma

 

5.detial.jsp

get방식으로 보ㅈ내준다.

 

5 -글 수정

1.controller에서 수정폼 명시

프라이머리키를 전달받고

한 건의 레코드를 리퀘스트에 저장해줘야 커스텀태그서 정보를 읽을 수있기에 Model을 호출하여 사용한다

Mode은 호출하기만 하면 사용하고

  addAttribute매서드로  속성명 속성값 쌍으로 넣어주면 리퀘스트에 바로 저장이된다.

즉 num을 통해서 한건의 레코드를 읽어오고  그것을 model을 통해서 request에 저장한다.

 

2.updateForm.jsp

글 수정 폼 작업

페이지 원본을 보면 히든값으로 데잍커가 들어가있느걸 볼 수 있다.

 

3.mapper.xml에가서 글 수정 작업

sql

4.boarddaoimpl

update메서드로 호출 (아이디넣어주고, 데이터넘길것)

5.serviceimpl

dao. 호출

6.contrller

글 수정 처리

데이터 가 들어오면 유효성 체크해준다

 

 

6 -글 삭제

1.controller에서 삭제 폼 작업을 한다.

보드vo를 생성해서 필요한 데이터를 넣어서 전달하느 방법이 있고

한건의레코드를 읽어와서 맵핑하는 방법이있따.

생성하는 방법으로 해보자

2.jsp deleteform.jsp

유효성 체크해야하니까 자바빈(VO)읽어온다

 이 역시 원본보기 하면 히든값으로 데이터가 들어이쓴 것을 확인할 수 이따.

 

3.boardmapper.xml

글삭제 작업해준다. 파라미터 타입은 시퀀스가 오니까  integer로 처리??? 

sql

dao에 인자명을 num이라고 했으니까 그 인자명이 식별자가되어서 값을 전달해주는 역할을 한다.

이제 명시한 id를 통해서 메서드에 매핑을 시켜준다

 

4.boarddaoimpl

delete메서드 사용하고 id넣고 전달값을 넣어준다.

 

5.serviceimpl

호출

6.controller

글 삭제 처리

유효성 체클르 하니까 자바빈에 데이터를 담아서 하니까 @valid 사용하는데

주의할점은 유효성체크하는 부분이 전부다 하고 있고

비밀번호만 유효성 체크 해야하니까

hasFieldEerror사용한다.

 

 

 

 

 

 

 

 

2) @어노테이션 방식 

우선설정방식이 조금 다르다.

config.xml을 사용했었는데 여기서는 사용하지않는다.

root-context,.xml에서 mybatis설정이 달라지낟.

설정파일삭제핶디 때문에 

typeAliaespackage르 넣고 패키지를 지정해주면 하위에있는 클래스들을 인식해서  typeAliaes를 지정해준다.

SqlSessionFactoryBean 과 MapperScannerConfigurer 설정

 

 

 

인터페이스만 만들고 쿠현하는 클래스느 마이바티스가 구현해준다.

인터페이스명칭은xml파일명과 일치시켜야한다.

1.boardmapper.java(인터페이스)

 

2.boardmaper.xml

만들어놓은 board<maper>를 네임스페이스로 사용한다,. .boardmapper.java(인터페이스)경로 넣어준다

어노테이션방식과 xml방식을 같이 병행하여 작업할 수 있따.

주의! 둘중 하나의 방식만 사용해야하며 둘다 사용하면 이중맵핑이 일어나서 에러남

이떄 id는 인터페이스(보드맵퍼인터페이스)에서의 메서드명이다.

map에있는 키값들 #{}

 

-상세페이지

1.인터페이스에서 어노테이션으로 작업(getboard())

 

-글쓰기

xml방식으로 해보자insert

1.mapper에서 메서드명을id에 넣어준다.

 

-수정하기

update는 어노테이션방법으로해본다

-삭제하기

어노테이션방법으로 해본다

 


 

public MemberVO selectMember(Integer mem_num); 에서 왜  MyBatis쓸 때는 객체형태로 사용해야 하는 것인지??

전통적으로 MyBatis는 기본 자료형 데이터 처리할 때 Wrapper 클래스 형태 즉 객체 형태로 처리했다.

그래서 int -> Integer로 명시해야 했는데 최근에는 int도 지원하고 있다!!


MyBatis / iBatis에서 조건절에 Like 검색시 처리하는 방법이다.


검색하고자 하는 필드명이 "title" 이고 해당 필드에서 검색할 내용을 파라미터를 "keyword" 라고 하면 아래와 같이 검색할 수 있다.

[MySQL]
title like CONCAT('%',#{keyword},'%')


[Oracle]
title like '%' ||  #{keyword} || '%'


[MSSQL]
title like '%' + #{keyword} + '%'



정리 : 각 DBMS에 맞게 문자열 합치기 함수를 사용하여 이용하면 된다.

 

 

mybatis를 사용하다보면 SQL문을 작성할때 전달받은 parameter 변수를 지정해주게 되는데
일반적으로으로 #{변수명} 과 같은 방식으로 작성을 많이 한다.

하지만 mybatis에서는 #{변수명} 이외에도 ${변수명} 방법도 사용할수 있다. 이 둘의 차이점은 다음과 같다.

1. #{변수명}

1
2
3
4
5
6
7
8
<sql id="test" parameterType="hashmap">
    SELECT
        *
    FROM
        TB_member
    WHERE
        id = #{id}
</sql>

 

 

위와같이 #{변수명}으로 사용하게 되면 mybatis는 preparedStatement 객체에 자동으로 id를 set 해주게 된다.
 SELECT * FROM TB_member WHERE id = ? 형식으로 전환이 되고 자동으로 해당 변수를 set 해준다.

 

 

 

 

2. ${변수명}

1
2
3
4
5
6
7
8
<sql id="test" parameterType="hashmap">
    SELECT
        *
    FROM
        TB_member
    WHERE
        id = ${id}
</sql>

 

 

해당 방식으로 지정시 해당 변수가 쿼리에 포함이 된다. 즉 SELECT * FROM TB_member WHERE id = 'test' 형식으로 SQL이 실행된다.
컬럼명이나 테이블명이 동적으로 변경되어야 할때 사용하면 좋은데, 해당 방법의 최대 단점은 악의적으로 parameter 조작시
보안에 안전하지 못하다는 것이다. SQL Injection 공격등에 취약하다.


parameter 변수등은 가급적이면 #{변수명} 과 같은 방식으로 사용하되, 필요에 따라 ${변수명} 방식으로 사용해도 나쁘지는 않다.
다만 사용자 조작등의 조작이 가능하므로 코드상에서 변수값등을 컨트롤하는등의 대응이 필요하다.



출처: https://fruitdev.tistory.com/70?category=556729 [과일가게 개발자]

출처: https://fruitdev.tistory.com/60 [과일가게 개발자]

 

'WEB > ✿Spring Framework' 카테고리의 다른 글

[Spring] 🔗10)Spring 실습1  (0) 2022.03.08
[Spring] 🔗9) Tiles Framework  (0) 2022.03.07
[Spring] 🔗6) 로깅처리  (0) 2022.03.05
[Spring] 🔗4) Spring MVC  (0) 2022.02.25
[Spring] 🔗3) AOP  (0) 2022.02.25

댓글