MyBatis
의존성 추가
- 프로젝트 생성시 기존 의존성 외에 MyBatis Framework 추가
- 의존성 확인
- (추가) jsp에 대한 의존성은 수동으로 추가해야 한다
application.properties 설정 추가
1) mybatis.configuration.map-underscore-to-camel-case
- DB 컬럼명에 _가 포함된 경우 _ 이후 첫 글자를 대문자로 변환하여 Mapping
2) mybatis.type-aliases-package
- mapper의 namespace를 간결하게 하기 위해 사용
3) mybatis.mapper-locations
- mapper가 존재하는 위치 설정
mapper의 기본 형태
- <mapper></mapper> 내에 태그 형태의 코드 작성
- namespace : 외부에서 mapper를 호출하기 위한 이름
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="이름">
</mapper>
MyBatis를 이용한 CRUD
** 필수 확인 사항
- application.properties의 mybatis.type-aliases-package의 패키지명이 올바르게 되어있는지
DB 컬럼명 확인
MusicDto
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MusicDto {
// 필드
private int musicNo;
private String musicTitle;
private String musicArtist;
private String musicAlbum;
private int musicPlay;
private Date releaseTitle;
}
src/main/resources - mybatis - mapper에 music-mapper.xml 생성
- id : mapper의 메소드명
- parameterType : 바인딩 변수의 형태
- resultType : 메소드 결과의 반환형
- 바인딩 변수만 #{ } 형태로 쓴다 (정적 바인딩)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="music">
<!-- 등록(INSERT) -->
<insert id = "insert" parameterType = "MusicDto">
insert into music(music_no,
music_title,
music_artist,
music_album,
music_play,
release_title)
values(music_seq.nextval,
#{musicTitle},
#{musicArtist},
#{musicAlbum},
#{musicPlay},
#{releaseTitle})
</insert>
<!-- 전체 조회(SELECT) -->
<select id = "list" resultType = "MusicDto">
select * from music
</select>
<!-- 단일 조회(SELECT) -->
<select id = "one" resultType = "MusicDto" parameterType = "int">
select * from music where music_no = #{musicNo}
</select>
<!-- 수정(UPDATE) -->
<update id = "edit" parameterType = "MusicDto">
update music
set
music_title = #{musicTitle},
music_artist = #{musicArtist},
music_album = #{musicAlbum},
music_play = #{musicPlay}
where
music_no = #{musicNo}
</update>
<!-- 삭제(DELETE) -->
<delete id = "delete" parameterType = "int">
delete music where music_no = #{musicNo}
</delete>
</mapper>
MusicDao
public interface MusicDao {
// 추상 메소드 - 등록(INSERT)
public void insert(MusicDto musicDto);
// 추상 메소드 - 전체 조회(SELECT)
List<MusicDto> selectList();
// 추상 메소드 - 단일 조회(SELECT)
MusicDto selectOne(int musicNo);
// 추상 메소드 - 수정(UPDATE)
boolean edit(MusicDto musicDto);
// 추상 메소드 - 삭제(DELETE)
boolean delete(int musicNo);
}
MusicDaoImpl
- 기존 DaoImpl에서 JdbcTemplate에 의존성 주입을 한 것과 달리 MyBatis 사용시 SqlSession에 의존성 주입
public class MusicDaoImpl implements MusicDao {
// 의존성 주입
@Autowired
private SqlSession sqlSession;
// 추상 메소드 오버라이딩 - 등록(INSERT)
@Override
public void insert(MusicDto musicDto) {
// music의 insert(등록) 실행
sqlSession.insert("music.insert", musicDto);
}
// 추상 메소드 오버라이딩 - 전체 조회(SELECT)
@Override
public List<MusicDto> selectList() {
// music의 list(전체 조회) 실행
return sqlSession.selectList("music.list");
}
// 추상 메소드 오버라이딩 - 단일 조회(SELECT)
@Override
public MusicDto selectOne(int musicNo) {
// music의 one(단일 조회) 실행
return sqlSession.selectOne("music.one", musicNo);
}
// 추상 메소드 오버라이딩 - 수정(UPDATE)
@Override
public boolean edit(MusicDto musicDto) {
// music의 update(수정) 실행
int count = sqlSession.update("music.update", musicDto);
return count > 0;
}
// 추상 메소드 오버라이딩 - 삭제(DELETE)
@Override
public boolean delete(int musicNo) {
// music의 delete(삭제) 실행
int count = sqlSession.delete("music.delete", musicNo);
return count > 0;
}
}
MyBatis를 이용한 검색 조회
music-mapper
- #{ } : 정적 바인딩
- ${ } : 동적 바인딩 - DB 컬럼에 바인딩할 경우 사용
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="music">
<select id = "search" parameterType = "map" resultType = "MusicDto">
select * from music where instr(${type}, #{keyword}) > 0 order by ${type} asc
</select>
</mapper>
MusicSelectTest
@SpringBootTest
public class MusicSearchTest {
@Autowired
private SqlSession sqlSession;
@Test
public void test() {
// (주의) mybatis에는 하나의 데이터만 전달이 가능하다
Map<String, String> param = new HashMap<>();
param.put("type", "music_artist");
param.put("keyword", "윤하");
List<MusicDto> list = sqlSession.selectList("music.search", param);
for(MusicDto musicDto : list) {
System.out.println(musicDto);
}
}
}
'국비교육 > 국비교육' 카테고리의 다른 글
day72 - 1109 (0) | 2022.11.12 |
---|---|
day71 - 1108 (0) | 2022.11.08 |
day45 - 0928 (0) | 2022.09.28 |
day44 - 0927 (0) | 2022.09.27 |
day43 - 0926 (0) | 2022.09.26 |