



search > file



course.xml
<?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="com.web.study.repository.CourseRepository">
<resultMap type="com.web.study.domain.entity.Lecture" id="lecture">
<result column="ltm_id" property="ltm_id"/>
<result column="ltm_name" property="ltm_name"/>
<result column="ltm_price" property="ltm_price"/>
<result column="itm_id" property="itm_id"/>
<collection property="instructor" resultMap="instructor"></collection>
</resultMap>
<resultMap type="com.web.study.domain.entity.Instructor" id="instructor">
<result column="itm_id" property="itm_id"/>
<result column="itm_name" property="itm_name"/>
<result column="itm_birth" property="itm_birth"/>
</resultMap>
<resultMap type="com.web.study.domain.entity.Student" id="student">
<result column="sdm_id" property="sdm_id"/>
<result column="sdm_name" property="sdm_name"/>
<result column="sdm_birth" property="sdm_birth"/>
</resultMap>
<resultMap type="com.web.study.domain.entity.Course" id="course">
<result column="csm_id" property="csm_id"/>
<result column="ltm_id" property="ltm_id"/>
<result column="sdm_id" property="sdm_id"/>
<result column="registe_date" property="registe_date"/>
<collection property="lecture" resultMap="lecture"></collection>
<collection property="student" resultMap="student"></collection>
</resultMap>
<insert id="registe" parameterType="Course">
insert into course_mst
values (0, #{ltm_id}, #{sdm_id}, #{registe_date})
</insert>
<select id="getCourseAll" resultMap="course">
select
cm.csm_id,
cm.ltm_id,
cm.sdm_id,
cm.registe_date,
lm.ltm_id,
lm.ltm_name,
lm.ltm_price,
lm.itm_id,
im.itm_id,
im.itm_name,
im.itm_birth,
sm.sdm_id,
sm.sdm_name,
sm.sdm_birth
from
course_mst cm
left outer join lecture_mst lm on (lm.ltm_id = cm.ltm_id)
left outer join instructor_mst im on (im.itm_id = lm.itm_id)
left outer join student_mst sm on (sm.sdm_id = cm.sdm_id)
</select>
<select id="searchCourse" parameterType="String" resultMap="course">
select
cm.csm_id,
cm.ltm_id,
cm.sdm_id,
cm.registe_date,
lm.ltm_id,
lm.ltm_name,
lm.ltm_price,
lm.itm_id,
im.itm_id,
im.itm_name,
im.itm_birth,
sm.sdm_id,
sm.sdm_name,
sm.sdm_birth
from
course_mst cm
left outer join lecture_mst lm on (lm.ltm_id = cm.ltm_id)
left outer join instructor_mst im on (im.itm_id = lm.itm_id)
left outer join student_mst sm on (sm.sdm_id = cm.sdm_id)
where
lm.ltm_name like concat('%',#{searchValue},'%')
or im.itm_name like concat('%',#{searchValue},'%')
or sm.sdm_name like concat('%',#{searchValue},'%')
</select>
</mapper>
where
lm.ltm_name like concat('%',#{searchValue},'%')
or im.itm_name like concat('%',#{searchValue},'%')
or sm.sdm_name like concat('%',#{searchValue},'%')
CourseController
package com.web.study.controller.lecture;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.web.study.dto.DataResponseDto;
import com.web.study.dto.ResponseDto;
import com.web.study.dto.request.course.CourseReqDto;
import com.web.study.service.CourseService;
import lombok.RequiredArgsConstructor;
@RestController
@RequiredArgsConstructor
public class CourseController {
private final CourseService courseService;
//Create
@PostMapping("/course")
public ResponseEntity<? extends ResponseDto> register(@RequestBody CourseReqDto CourseReqDto) {
courseService.registeCourse(CourseReqDto);
return ResponseEntity.ok().body(ResponseDto.ofDefault());
}
@GetMapping("/courses")
public ResponseEntity<? extends ResponseDto> getCurseAll() {
return ResponseEntity.ok().body(DataResponseDto.of(courseService.getCourseAll()));
}
@GetMapping("/search/courses")
public ResponseEntity<? extends ResponseDto> searchCourse(String searchValue) {
return ResponseEntity.ok().body(DataResponseDto.of(courseService.searchCourse(searchValue)));
}
}
domain.entity
package com.web.study.domain.entity;
import java.time.LocalDate;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Course {
private int csm_id;
private int ltm_id;
private int sdm_id;
private LocalDate registe_date;
private Lecture lecture;
private Student student;
}
CourseRepository
package com.web.study.repository;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.web.study.domain.entity.Course;
@Mapper
public interface CourseRepository {
// insert, update, delete 리턴 자료형 없음
public int registe(Course course );
public List<Course> getCourseAll();
public List<Course> searchCourse(String serachValue);
}
CourseService
package com.web.study.service;
import java.util.List;
import com.web.study.domain.entity.Course;
import com.web.study.dto.request.course.CourseReqDto;
public interface CourseService {
public void registeCourse(CourseReqDto courseReqDto);
public List<Course> getCourseAll();
public List<Course> searchCourse(String serachValue);
}
CourseServiceImpl
package com.web.study.service;
import java.util.List;
import org.springframework.stereotype.Service;
import com.web.study.domain.entity.Course;
import com.web.study.dto.request.course.CourseReqDto;
import com.web.study.repository.CourseRepository;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class CourseServiceImpl implements CourseService {
private final CourseRepository courseRepository;
@Override
public void registeCourse(CourseReqDto courseReqDto) {
courseRepository.registe(courseReqDto.toEntity());
}
@Override
public List<Course> getCourseAll() {
return courseRepository.getCourseAll();
}
@Override
public List<Course> searchCourse(String serachValue) {
return courseRepository.searchCourse(serachValue);
}
}
CourseService
package com.web.study.service;
import java.util.List;
import com.web.study.domain.entity.Course;
import com.web.study.dto.request.course.CourseReqDto;
public interface CourseService {
public void registeCourse(CourseReqDto courseReqDto);
public List<Course> getCourseAll();
public List<Course> searchCourse(int type, String serachValue);
}
CourseServiceImpl
@Override
public List<Course> searchCourse(int type, String searchValue) {
Map<String, Object> parameterMap = new HashMap<>();
parameterMap.put("type", type);
parameterMap.put("searchValue", searchValue);
return courseRepository.searchCourse(parameterMap);
}
}
CourseController
@GetMapping("/search/courses")
public ResponseEntity<? extends ResponseDto> searchCourse(int type, String searchValue) {
return ResponseEntity.ok().body(DataResponseDto.of(courseService.searchCourse(type,searchValue)));
}
CourseRepository
@Mapper
public interface CourseRepository {
// insert, update, delete 리턴 자료형 없음
public int registe(Course course );
public List<Course> getCourseAll();
public List<Course> searchCourse(Map<String, Object> parameterMap);
}
course.xml
where
1 = 1
<if test="type == 1">
and lm.ltm_name like concat('%',#{searchValue},'%')
</if>
<if test="type == 2">
and im.itm_name like concat('%',#{searchValue},'%')
</if>
<if test="type == 3">
and sm.sdm_name like concat('%',#{searchValue},'%')
</if>
response > CourseRespDto
package com.web.study.dto.response;
import java.time.LocalDate;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
public class CourseRespDto {
private int courseId;
private LocalDate registeDate;
private String lectureName;
private int lecturePrice;
private String instructorName;
private String studentName;
}
domain.entity > Course
package com.web.study.domain.entity;
import java.time.LocalDate;
import com.web.study.dto.response.CourseRespDto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Course {
private int csm_id;
private int ltm_id;
private int sdm_id;
private LocalDate registe_date;
private Lecture lecture;
private Student student;
public CourseRespDto toDto() {
String lectureName = null;
int lecturePrice = 0;
String instructorName = null;
String studentName = null;
if(lecture != null) {
lectureName = lecture.getLtm_name();
lecturePrice = lecture.getLtm_price();
if(lecture.getInstructor() != null) {
instructorName = lecture.getInstructor().getItm_name();
}
}
if(student != null) {
studentName = student.getSdm_name();
}
return CourseRespDto.builder()
.courseId(csm_id)
.registeDate(registe_date)
.lectureName(lectureName)
.lecturePrice(lecturePrice)
.instructorName(instructorName)
.studentName(studentName)
.build();
}
}

LectureController
//추가
@GetMapping("/search/lectures")
public ResponseEntity<? extends ResponseDto> searchLecture(int type, String searchValue) {
return ResponseEntity.ok().body(DataResponseDto.of(lectureService.searchLecture(type, searchValue)));
}
(int type, String searchValue)- > 객체로 전달 하는 방법이 있음
LectureService
public interface LectureService {
public void registeLecture(LectureReqDto lectureReqDto);
//추가
public List<LectureRespDto> searchLecture(int type, String serachValue);
}
lecture.xml
<?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="com.web.study.repository.LectureRepository">
<resultMap type="com.web.study.domain.entity.Lecture" id="lecture">
<result column="ltm_id" property="ltm_id"/>
<result column="ltm_name" property="ltm_name"/>
<result column="ltm_price" property="ltm_price"/>
<result column="itm_id" property="itm_id"/>
<collection property="instructor" resultMap="instructor"></collection>
</resultMap>
<resultMap type="com.web.study.domain.entity.Instructor" id="instructor">
<result column="itm_id" property="itm_id"/>
<result column="itm_name" property="itm_name"/>
<result column="itm_birth" property="itm_birth"/>
</resultMap>
<insert id="registe" parameterType="Lecture">
insert into lecture_mst
values (0, #{ltm_name}, #{ltm_price}, #{itm_id})
</insert>
<select id="searchLecture" parameterType="hashMap" resultMap="lecture">
select
lm.ltm_id,
lm.ltm_name,
lm.ltm_price,
lm.itm_id,
im.itm_id,
im.itm_name,
im.itm_birth
from
lecture_mst lm
left outer join instructor_mst im on (im.itm_id = lm.itm_id)
where
1 = 1
<if test="type == 1">
and lm.ltm_name like concat('%',#{searchValue},'%')
</if>
<if test="type == 2">
and im.itm_name like concat('%',#{searchValue},'%')
</if>
</select>
</mapper>
<mapper>: MyBatis의 매퍼 파일임을 나타내는 태그<resultMap>: 조회 결과 매핑 정보를 지정하는 태그
type속성은 매핑할 클래스를 지정id속성은 매핑 정보의 고유한 아이디를 지정<result>: 쿼리 결과 컬럼과 매핑할 클래스의 필드를 지정
column속성은 쿼리 결과컬럼명을 지정property속성은 매핑할 클래스의필드명을 지정<collection>: 클래스 내부에 컬렉션 타입 필드가 있는 경우, 해당 컬렉션 타입 필드와 연결된 매핑 정보를 추가로 지정할 수 있음
property속성은 클래스 내부의 컬렉션 타입필드명을 지정resultMap속성은 컬렉션 타입 필드에 매핑될 매핑 정보의아이디를 지정<insert>: 데이터를추가하는 쿼리문을 작성
id속성은 매핑 정보의 고유한 아이디parameterType속성은 매핑할 클래스 타입valuesDB에 삽입할 값을 지정<select>: 데이터를조회하는 쿼리문을 작성
id속성은 매핑 정보의 고유한 아이디parameterType속성은 쿼리문에서 사용할 파라미터 타입resultMap속성은 조회 결과를 매핑할 매핑 정보의 아이디where구문은 조회 조건을 작성if조건에 따라 동적으로 쿼리를 생성
Lecture
//추가
public LectureRespDto toDto() {
String instructorName = null;
if(instructor != null) {
instructorName = instructor.getItm_name();
}
return LectureRespDto.builder()
.lectureId(ltm_id)
.lecutreName(ltm_name)
.lecturePrice(ltm_price)
.instructorName(instructorName)
.build();
}
LectureRespDto
package com.web.study.dto.response;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
public class LectureRespDto {
private int lectureId;
private String lecutreName;
private int lecturePrice;
### private String instructorName;
}
LectureRepository
//추가
public List<Lecture> searchLecture(Map<String, Object> parameterMap);
LectureServiceImpl
//추가
@Override
public List<LectureRespDto> searchLecture(int type, String searchValue) {
Map<String, Object> parameterMap = new HashMap<>();
parameterMap.put("type", type);
parameterMap.put("searchValue", searchValue);
List<LectureRespDto> dtos = new ArrayList<>();
lectureRepository.searchLecture(parameterMap).forEach(entity -> {
dtos.add(entity.toDto());
});
return dtos;
}