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 기본 형식을사용하자
Mapper밑에 메서드 단위로 SQL문장을 실행시키는데
MyBatis는 그 SQL문장을 이 xml에 명시해서 보여준다.
통합적인 MyBatis설정파일이 하나 더있다,
설정파일 된 작업들을 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"
프라이 머리 키가 전달되기 때문에
파라미터 타입이 인티저 일 경우엔느
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 |
댓글