본문 바로가기

국비교육/국비교육

day70 - 1107

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