Spring
마이바티스(MyBatis)는 XML이나 Annotation을 통해 SQL문을 작성하고
객체들을 연결시키는 프레임워크임
XML 방식은 SQL매퍼를 XML파일에 작성하며 <select>,<resultMap> 등의 요소로 작성함
어노테이션 방식은 @Select와 같은 자바 어노테이션을 활용해 SQL 매퍼를 작성함
MyBatis의 장점
자바 코드가 짧아짐 >> 가독성이 좋음
SQL 구문을 전부 .xml로 분리해서 관리
>> 결합도가 낮아짐
>> 응집도 높아짐
>> 유지보수 용이
SQL 구문에 변경사항이 발생했을 때 과거에는 .java가 변경 -> 재컴파일
지금은 xml이 변경됨 -> 컴파일 xxx
MyBatis의 단점
복잡한 매핑
개발자가 직접 객체와 관계 매핑을 처리해야됨
반복적인 코드
CRUD 작업을 자주 수행 시, 비슷하거나 같은 코드를 반복적으로 작성 시
번거롭고 양이 많아 짐
MyBatis 사용방법
MyBatis 설치
이클립스 marketPlace에서 mybatis 검색
(mybatis 파일을 쉽게 생성하고 관리할 수 있는 도구)
두 개 설치
pom.xml 설정
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.1.0</version>
</dependency>
sql-map-config.xml 설정
MyBatis는 ORM(Object Relational Mapping: 관계형 데이터베이스 관리 시스템)이 아니기 때문에
별도로 설정 파일을 만들어 SQL 쿼리와 Java 객체 간의 매핑을 정의해야 함
객체지향프로그래밍 <-> 관계형 데이터베이스 관리 시스템(RDBMS)
매핑
데이터가 다름
변환
→객체(DTO, VO) → 테이블, SQL 구문 및 그 결과
<?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">
<configuration>
<!-- 자료형에 별칭 붙여주기 -->
<typeAliases>
<typeAlias type="com.koreait.app.biz.board.BoardDTO" alias="board" />
</typeAliases>
<!-- SQL 구문 설정파일 알려주기 -->
<mappers>
<mapper resource="mappings/board-mapping.xml" />
<!-- <mapper resource="mappings/member-mapping.xml" /> -->
</mappers>
</configuration>
< typeAlias type="cohttp://m.koreait.app.biz.board.BoardDTO" alias="board" />
== BoardDTO를 ORM 에서는 board 라고 부를거야
< mapper resource="mappings/board-mapping.xml" />
== JAVA 코드에서 제거한 SQL 구문들이 xxx.xml 파일에 있다 라는 설정
board-mapping.xml 설정
<?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">
<mapper namespace="BoardDAO"> <!-- namespace는 메모리칸에 이름을 지어주는 것 없으면 다른 xml과 구분할 수가 없음 테이블 이름으로 쓰기도함(아예 관계없는 이름을 쓸 수도 있음) -->
<insert id="insert">
INSERT INTO BOARD (BOARD_CONTENT, BOARD_WRITER_ID)
VALUES(#{board_content},#{board_writer_id})
</insert>
<select id="selectOne" resultType="board">
SELECT BOARD_NUM,BOARD_CONTENT,BOARD_WRITER_ID FROM BOARD
WHERE BOARD_NUM=#{board_num}
</select>
<select id="selectAll" resultType="board">
SELECT BOARD_NUM, BOARD_CONTENT, BOARD_WRITER_ID FROM BOARD
</select>
<select id="selectAll_CONTENT" resultType="board"> <!-- <select id="selectAll_CONTENT" resultType="com.korea.app.biz.board"> config파일에 alias를 설정하는 이유 -->
SELECT BOARD_NUM, BOARD_CONTENT, BOARD_WRITER_ID FROM BOARD
WHERE BOARD_CONTENT LIKE CONCAT('%', #{search_content}, '%')
<!-- ORM MyBatis 파라미터를 받는 방법 객체이름(keyword) -->
</select>
<select id="selectAll_WRITER" resultType="board">
SELECT BOARD_NUM, BOARD_CONTENT, BOARD_WRITER_ID FROM BOARD
WHERE BOARD_WRITER_ID LIKE CONCAT('%', #{search_content}, '%')
</select>
</mapper>
DAO 작성
@Repository
public class BoardDAO3 {
@Autowired
private SqlSessionTemplate mybatis;
public List<BoardDTO> selectAll(BoardDTO boardDTO) {
//뎁스 줄이기를 할땐 null 체크 필수
if(boardDTO.getBoard_condition() != null && boardDTO.getBoard_condition().equals("SELECT_BY_CONTENT")) {
//return mybatis.selestList("어떤 SQL을 부를지", 필요한 파라미터가 누군지);
return mybatis.selectList("BoardDAO.selectAll_CONTENT",boardDTO); // 매퍼에 있는 네임스페이스 점 아이디 이름
}
else if(boardDTO.getBoard_condition() != null && boardDTO.getBoard_condition().equals("SELECT_BY_WRITER")) {
return mybatis.selectList("BoardDAO.selectAll_WRITER",boardDTO); // 매퍼에 있는 네임스페이스 점 아이디 이름
}
return mybatis.selectList("BoardDAO.selectAll",boardDTO); // 매퍼에 있는 네임스페이스 점 아이디 이름
}
public BoardDTO selectOne(BoardDTO boardDTO) {
return mybatis.selectOne("BoardDAO.selectOne",boardDTO);
}
public boolean insert(BoardDTO boardDTO) {
int result = mybatis.insert("BoardDAO.insert", boardDTO);
if(result <= 0) {
return false;
}
return true;
}
public boolean update(BoardDTO boardDTO) {
return false;
}
public boolean delete(BoardDTO boardDTO) {
return false;
}
}
'javaboiii의 Spring' 카테고리의 다른 글
Spring - 용어 정리 (파싱, 바인딩, 직렬화, 역직렬화, 맵핑) (1) | 2024.11.13 |
---|---|
Spring - 성능 개선(Model 맛) (0) | 2024.10.18 |
Spring - 트랜잭션 (0) | 2024.10.17 |
Spring - AOP 관점 지향 프로그래밍 (1) | 2024.10.15 |
Spring - 비동기 처리 (0) | 2024.10.14 |