"Model class initialize": {
"prefix": "my_model",
"body": [
"package $1.models;",
"",
"import lombok.Data;",
"import lombok.Getter;",
"import lombok.Setter;",
"",
"@Data",
"public class ${TM_FILENAME_BASE} {",
" private int id;",
" ",
" // TODO : Add more fields",
" $2",
"",
" private String regDate;",
" private String editDate;",
"",
" @Getter",
" @Setter",
" private static int listCount = 0;",
"",
" @Getter",
" @Setter",
" private static int offset = 0;",
"}"
],
"description": "모델 클래스 기본 구성"
},
${1:[프로그램 패키지_이름]}: 스니펫 커서의 첫 번째 위치 ($1), 사용자가 직접 패키지 이름을 입력하게 만들고, 기본 제안값은 프로그램 패키지_이름이다.
슬래시(/)는 정규식을 감싸는 구분자
|: "또는" (OR)의 의미야.
(...): 괄호는 그룹(group)을 만든다는 뜻이다.
(?<=[a-z0-9])([A-Z]): (?<=...)는 앞에 있는 문자가 이런 조건을 만족해야 한다는 뜻이다.
${n:/downcase}: n번째 그룹 → 소문자로
${n}: n번째 그룹 참조
${n:+}: n번째 그룹이 존재하면 추가
(Mapper): mapper라는 글자를 의미
(^[A-Z]): 클래스 이름의 첫 글자 (대문자), ^가 괄호 밖에 있으므로 첫번째 글자라는 뜻이다.
:/downcase: 첫 글자 소문자로
{3:+_}{3:/downcase}: 중간 대문자 앞에 _ 붙이고 소문자로 변환
g: 문자열 전체에서 일치하는 모든 부분 변환
(Mapper)|(^[A-Z])|(?<=[a-z0-9])([A-Z]): mapper가 붙거나 대문자이거나 대문자 앞에 소문자나 숫자가 오는 경우를 의미하면 앞에서 부터 탐지하여 하나라도 발견되면 탐지 되었다고 판단한다.
/{3:+}${3:/downcase}/ : 위의 식에서 초반이 대문자이면 소문자로 바꾸고 3번째 경우가 있으면 를 붙인다음에 대상을 소문자로 바꾼다.
"MyBatis Mapper Generator": {
"prefix": "my_mapper",
"body": [
"package ${1:[프로그램 패키지_이름]}.mappers;",
"",
"import java.util.List;",
"",
"import org.apache.ibatis.annotations.Delete;",
"import org.apache.ibatis.annotations.Insert;",
"import org.apache.ibatis.annotations.Mapper;",
"import org.apache.ibatis.annotations.Options;",
"import org.apache.ibatis.annotations.Result;",
"import org.apache.ibatis.annotations.ResultMap;",
"import org.apache.ibatis.annotations.Results;",
"import org.apache.ibatis.annotations.Select;",
"import org.apache.ibatis.annotations.Update;",
"",
"import ${1:[프로그램 패키지_이름]}.models.${TM_FILENAME_BASE/(Mapper)//};",
"",
"@Mapper",
"public interface ${TM_FILENAME_BASE} {",
" @Insert(\"INSERT INTO ${TM_FILENAME_BASE/(Mapper)|(^[A-Z])|(?<=[a-z0-9])([A-Z])/${2:/downcase}${3:+_}${3:/downcase}/g} (\" +",
" \" ✅✅✅ \" +",
" \") VALUES (\" +",
" \" ✅✅✅ \" +",
" \")\")",
" @Options(useGeneratedKeys = true, keyProperty = \"✅\", keyColumn = \"✅\")",
" public int insert(${TM_FILENAME_BASE/(Mapper)//} input);",
"",
" @Update(\"UPDATE ${TM_FILENAME_BASE/(Mapper)|(^[A-Z])|(?<=[a-z0-9])([A-Z])/${2:/downcase}${3:+_}${3:/downcase}/g} SET \" +",
" \" ✅✅✅ \" +",
" \"WHERE ✅✅✅\")",
" public int update(${TM_FILENAME_BASE/(Mapper)//} input);",
"",
" @Delete(\"DELETE FROM ${TM_FILENAME_BASE/(Mapper)|(^[A-Z])|(?<=[a-z0-9])([A-Z])/${2:/downcase}${3:+_}${3:/downcase}/g} WHERE ✅✅✅\")",
" public int delete(${TM_FILENAME_BASE/(Mapper)//} input);",
"",
" @Select(\"SELECT * FROM ${TM_FILENAME_BASE/(Mapper)|(^[A-Z])|(?<=[a-z0-9])([A-Z])/${2:/downcase}${3:+_}${3:/downcase}/g} \" +",
" \"WHERE ✅✅✅\")",
" @Results(id=\"resultMap\", value={",
" @Result(property=\"✅\", column=\"✅\"),",
" @Result(property=\"✅\", column=\"✅\"),",
" @Result(property=\"✅\", column=\"✅\")",
" })",
" public ${TM_FILENAME_BASE/(Mapper)//} selectOne(${TM_FILENAME_BASE/(Mapper)//} input);",
"",
" @Select(\"<script>\"+",
" \"SELECT ✅✅✅ FROM ${TM_FILENAME_BASE/(Mapper)|(^[A-Z])|(?<=[a-z0-9])([A-Z])/${2:/downcase}${3:+_}${3:/downcase}/g}\" +",
" \"<where>\" +",
" \" <if test=\\\"✅ != null and ✅ != ''\\\">...</if>\" +",
" \"</where>\" +",
" \"</script>\")",
" @ResultMap(\"resultMap\")",
" public List<${TM_FILENAME_BASE/(Mapper)//}> selectList(${TM_FILENAME_BASE/(Mapper)//} input);",
"",
" @Select(\"<script>\" +",
" \"SELECT COUNT(*) FROM ${TM_FILENAME_BASE/(Mapper)|(^[A-Z])|(?<=[a-z0-9])([A-Z])/${2:/downcase}${3:+_}${3:/downcase}/g}\" +",
" \"<where>\" +",
" \" <if test=\\\"✅ != null and ✅ != ''\\\">...</if>\" +",
" \"</where>\" +",
" \"</script>\")",
" public int selectCount(${TM_FILENAME_BASE/(Mapper)//} input);",
"}",
""
],
"description": "MyBatis Mapper Generator"
},
"Service Layer Generator": {
"prefix": "my_service",
"body": [
"package ${1:[프로그램 패키지_이름]}.services;",
"",
"import java.util.List;",
"",
"import ${1:[프로그램 패키지_이름]}.models.${TM_FILENAME_BASE/(Service)//};",
"",
"public interface ${TM_FILENAME_BASE} {",
" public List<${TM_FILENAME_BASE/(Service)//}> getList(${TM_FILENAME_BASE/(Service)//} params) throws Exception;",
"",
" public ${TM_FILENAME_BASE/(Service)//} getItem(${TM_FILENAME_BASE/(Service)//} params) throws Exception;",
"",
" public ${TM_FILENAME_BASE/(Service)//} addItem(${TM_FILENAME_BASE/(Service)//} params) throws Exception;",
"",
" public ${TM_FILENAME_BASE/(Service)//} editItem(${TM_FILENAME_BASE/(Service)//} params) throws Exception;",
"",
" public int deleteItem(${TM_FILENAME_BASE/(Service)//} params) throws Exception;",
"",
" public int getCount(${TM_FILENAME_BASE/(Service)//} params) throws Exception;",
"}",
""
],
"description": "Service Layer Generator",
},
"Service Layer Implement Generator": {
"prefix": "my_service_impl",
"body": [
"package ${2:[프로그램 패키지_이름]}.services.impl;",
"",
"import java.util.List;",
"",
"import org.springframework.beans.factory.annotation.Autowired;",
"import org.springframework.stereotype.Service;",
"",
"import ${2:[프로그램_패키지_이름]}.mappers.${TM_FILENAME_BASE/(ServiceImpl)//}Mapper;",
"import ${2:[프로그램_패키지_이름]}.models.${TM_FILENAME_BASE/(ServiceImpl)//};",
"import ${2:[프로그램_패키지_이름]}.services.${TM_FILENAME_BASE/(ServiceImpl)//}Service;",
"import lombok.extern.slf4j.Slf4j;",
"",
"@Slf4j",
"@Service",
"public class ${TM_FILENAME_BASE} implements ${TM_FILENAME_BASE/(Impl)//} {",
"",
" @Autowired",
" private ${TM_FILENAME_BASE/(ServiceImpl)//}Mapper ${TM_FILENAME_BASE/^(.*)ServiceImpl$/${1:/camelcase}/}Mapper;",
"",
" @Override",
" public ${TM_FILENAME_BASE/(ServiceImpl)//} addItem(${TM_FILENAME_BASE/(ServiceImpl)//} input) throws Exception {",
" int rows = ${TM_FILENAME_BASE/^(.*)ServiceImpl$/${1:/camelcase}/}Mapper.insert(input);",
"",
" if (rows == 0) {",
" throw new Exception(\"저장된 ${TM_FILENAME_BASE/(ServiceImpl)//} 데이터가 없습니다.\");",
" }",
"",
" return ${TM_FILENAME_BASE/^(.*)ServiceImpl$/${1:/camelcase}/}Mapper.selectOne(input);",
" }",
"",
" @Override",
" public ${TM_FILENAME_BASE/(ServiceImpl)//} editItem(${TM_FILENAME_BASE/(ServiceImpl)//} input) throws Exception {",
" int rows = ${TM_FILENAME_BASE/^(.*)ServiceImpl$/${1:/camelcase}/}Mapper.update(input);",
"",
" if (rows == 0) {",
" throw new Exception(\"수정된 ${TM_FILENAME_BASE/(ServiceImpl)//} 데이터가 없습니다.\");",
" }",
"",
" return ${TM_FILENAME_BASE/^(.*)ServiceImpl$/${1:/camelcase}/}Mapper.selectOne(input);",
" }",
"",
" @Override",
" public int deleteItem(${TM_FILENAME_BASE/(ServiceImpl)//} input) throws Exception {",
" int rows = ${TM_FILENAME_BASE/^(.*)ServiceImpl$/${1:/camelcase}/}Mapper.delete(input);",
"",
" if (rows == 0) {",
" throw new Exception(\"${TM_FILENAME_BASE/(ServiceImpl)//} 삭제된 데이터가 없습니다.\");",
" }",
"",
" return rows;",
" }",
"",
" @Override",
" public ${TM_FILENAME_BASE/(ServiceImpl)//} getItem(${TM_FILENAME_BASE/(ServiceImpl)//} input) throws Exception {",
" ${TM_FILENAME_BASE/(ServiceImpl)//} output = ${TM_FILENAME_BASE/^(.*)ServiceImpl$/${1:/camelcase}/}Mapper.selectOne(input);",
"",
" if (output == null) {",
" throw new Exception(\"${TM_FILENAME_BASE/(ServiceImpl)//} 조회된 데이터가 없습니다.\");",
" }",
"",
" return output;",
" }",
"",
" @Override",
" public List<${TM_FILENAME_BASE/(ServiceImpl)//}> getList(${TM_FILENAME_BASE/(ServiceImpl)//} input) throws Exception {",
" return ${TM_FILENAME_BASE/^(.*)ServiceImpl$/${1:/camelcase}/}Mapper.selectList(input);",
" }",
"",
" @Override",
" public int getCount(${TM_FILENAME_BASE/(ServiceImpl)//} input) throws Exception {",
" return ${TM_FILENAME_BASE/^(.*)ServiceImpl$/${1:/camelcase}/}Mapper.selectCount(input);",
" }",
"}"
],
"description": "Service Layer Implement Generator"
}
/** 특정 교수가 지도교수인 학생이 수강하는 내역 삭제, 특정 교수의 담당 과목의 수강신청 내역 삭제
*
* @param input - 삭제하려는 학과 번호가 저장된 student 클래스의 객체
* @return - 삭제된 데이터의 수
*/
@Delete("DELETE FROM enrollments WHERE student_id IN (select id from students where professor_id = #{professorId}) "
+ "or subject_id in (select id from subjects where professor_id in (select id from students where professor_id = #{professorId}))" )
public int deleteByStudentIdForProfessor(Student input);
/**
* 특정 교수가 가르치는 과목 일괄 삭제
* @param subject - 학과 번호를 저장하고 있는 subject 객체
* @return - 삭제된 데이터의 수
*/
@Delete ("DELETE FROM subjects WHERE professor_id = #{professorId}")
public int deleteByProfessorIdForProfessor(Subject subject);
/**
* 특정 교수가 지도교수인 학생 삭제, 특정 교수가 가르치는 과목을 수강하는 학생 삭제
* 학생이 멤버변수로 삭제하고자 하는 교수의 정보를 들고 있어야함.
* @param input - 학과 번호를 저장하고 있는 student 객체
* @return - 삭제된 데이터의 수
*/
@Delete("DELETE FROM students WHERE professor_id = #{professorId} OR "
+ "id IN (SELECT student_id FROM enrollments WHERE subject_id in (select id from subjects where professor_id = #{professorId}))")
public int deleteByProfessorId(Student input);
@Mapper
public interface ProfessorMapper {
@Insert("INSERT INTO professors (" +
"id, name, user_id, position, sal, hiredate, comm, email, phone, photo_url, status, department_id " +
") VALUES (" +
"#{id}, #{name}, #{userId}, #{position}, #{sal}, #{hiredate}, #{comm}, #{email}, #{phone}, #{photoUrl}, #{status}, #{departmentId} " +
")")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
public int insert(Professor input);
@Update("UPDATE professors SET " +
" name = #{name}, user_id = #{userId}, position = #{position}, sal = #{sal}, hiredate = #{hiredate}, comm = #{comm}, email = #{email}, "
+ " phone = #{phone}, photo_url = #{photoUrl}, status = #{status}, department_id = #{departmentId} "
+ " where id = #{id}")
public int update(Professor input);
@Delete("DELETE FROM professors WHERE id = #{id}")
public int delete(Professor input);
@Select("SELECT id, name, user_id, position, sal, hiredate, comm, email, phone, photo_url, status, department_id FROM professors " +
"WHERE id = #{id}")
@Results(id = "resultMap", value = {
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "userId", column = "user_id"),
@Result(property = "position", column = "position"),
@Result(property = "sal", column = "sal"),
@Result(property = "hiredate", column = "hiredate"),
@Result(property = "comm", column = "comm"),
@Result(property = "email", column = "email"),
@Result(property = "phone", column = "phone"),
@Result(property = "photoUrl", column = "photo_url"),
@Result(property = "status", column = "status"),
@Result(property = "departmentId", column = "department_id")
})
public Professor selectOne(Professor input);
@Select("<script>"+
"SELECT id, name, user_id, position, sal, hiredate, comm, email, phone, photo_url, status, department_id FROM professors" +
"<where>" +
" <if test=\"id != null and id != ''\"> id = #{id} </if>" +
"</where>" +
"</script>")
@ResultMap("resultMap")
public List<Professor> selectList(Professor input);
@Select("SELECT COUNT(*) FROM professors")
public int selectCount(Professor input);
/**
* 특정 학과에 소속 되어 있는 교수 일괄 삭제
* @param input - 학과 번호를 저장하고 있는 Professor 객체
* @return - 삭제된 데이터 수
*/
@Delete("DELETE FROM professors WHERE department_id = #{departmentId}")
public int deleteByDepartmentId(Professor input);
}
public class ProfessorServiceimpl implements ProfessorService {
ProfessorMapper professorMapper = null;
StudentMapper studentMapper = null;
EnrollmentMapper enrollmentMapper = null;
SubjectMapper subjectMapper = null;
public ProfessorServiceimpl(SqlSession sqlSession){
professorMapper = sqlSession.getMapper(ProfessorMapper.class);
studentMapper = sqlSession.getMapper(StudentMapper.class);
enrollmentMapper = sqlSession.getMapper(EnrollmentMapper.class);
subjectMapper = sqlSession.getMapper(SubjectMapper.class);
}
@Override
public Professor addItem(Professor params) throws ServiceNoResultException, Exception {
if (professorMapper.insert(params) == 0){
throw new ServiceNoResultException("정상적으로 처리되지 않았습니다.");
}
return professorMapper.selectOne(params);
}
@Override
public Professor editItem(Professor params) throws ServiceNoResultException, Exception {
if (professorMapper.update(params) == 0){
throw new ServiceNoResultException("정상적으로 처리되지 않았습니다.");
}
return professorMapper.selectOne(params);
}
@Override
public int getCount(Professor params) throws ServiceNoResultException, Exception {
return professorMapper.selectCount(params);
}
@Override
public Professor getItem(Professor params) throws ServiceNoResultException, Exception {
Professor ouput = professorMapper.selectOne(params);
if (ouput == null){
throw new ServiceNoResultException("정상적으로 처리되지 않았습니다.");
}
return ouput;
}
@Override
public List<Professor> getList(Professor params) throws ServiceNoResultException, Exception {
return professorMapper.selectList(params);
}
@Override
public int deleteItem(Professor params) throws ServiceNoResultException, Exception {
int professorskey = params.getId();
Student student1 = new Student();
student1.setProfessorId(professorskey);
Subject subject1 = new Subject();
subject1.setProfessorId(professorskey);
// 교수가 담당하는 과목의 수강신청 내역 삭제 , 교수의 지도학생이 듣는 수강신청 내역 삭제
enrollmentMapper.deleteByStudentIdForProfessor(student1);
// 교수가 담당하는 과목을 수강하는 학생이거나 교수의 지도학생 삭제
studentMapper.deleteByProfessorId(student1);
// 교수가 담당하는 과목 삭제
subjectMapper.deleteByProfessorIdForProfessor(subject1);
// 교수 삭제
int output = professorMapper.delete(params);
if (output == 0){
throw new ServiceNoResultException("정상적으로 처리되지 않았습니다.");
}
return output;
}
}
public interface SubjectMapper {
@Insert("INSERT INTO subjects (id, name, credit, department_id, professor_id)"
+ " VALUES (#{id}, #{name}, #{credit}, #{departmentId}, #{professorId})" )
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
public int insert(Subject input);
@Update("UPDATE subjects SET " +
"id = #{id}, name = #{name}, credit = #{credit}, department_id = #{departmentId}, professor_id = #{professorId} " +
"WHERE id = #{id}")
public int update(Subject input);
@Delete("DELETE FROM subjects WHERE id = #{id}")
public int delete(Subject input);
@Results(id="resultMap", value={
@Result(property="id", column="id"),
@Result(property="name", column="name"),
@Result(property="credit", column="credit"),
@Result(property="department_id", column="departmentId"),
@Result(property="professor_id", column="professorId")
})
@Select("SELECT * FROM subjects " +
"WHERE id = #{id}")
public Subject selectOne(Subject input);
@Select(
"SELECT id, name, credit, department_id, professor_id "
+ "from subjects")
@ResultMap("resultMap")
public List<Subject> selectList(Subject input);
@Select(
"SELECT COUNT(*) FROM subjects")
public int selectCount(Subject input);
/**
* 특정 학과에서 개설된 과목이거나, 특정학과에 소속된 교수가 담당하는 '과목 일괄 삭제'
* @param subject - 학과 번호를 저장하고 있는 subject 객체
* @return - 삭제된 데이터의 수
*/
@Delete ("DELETE FROM subjects WHERE department_id = #{departmentId} OR professor_id IN "
+ " (SELECT id FROM professors WHERE department_id = #{departmentId})")
public int deleteByProfessorId(Subject subject);
/**
* 특정 교수가 가르치는 과목 일괄 삭제
* @param subject - 학과 번호를 저장하고 있는 subject 객체
* @return - 삭제된 데이터의 수
*/
@Delete ("DELETE FROM subjects WHERE professor_id = #{professorId}")
public int deleteByProfessorIdForProfessor(Subject subject);
}
public class SubjectServiceImpl implements SubjectService {
private SubjectMapper subjectMapper = null;
private EnrollmentMapper enrollmentMapper = null;
public SubjectServiceImpl(SqlSession sqlSession){
subjectMapper = sqlSession.getMapper(SubjectMapper.class);
enrollmentMapper = sqlSession.getMapper(EnrollmentMapper.class);
}
@Override
public Subject addItem(Subject params) throws ServiceNoResultException, Exception {
if (subjectMapper.insert(params) == 0){
throw new ServiceNoResultException("정상적으로 처리되지 않았습니다.");
}
return subjectMapper.selectOne(params);
}
@Override
public Subject editItem(Subject params) throws ServiceNoResultException, Exception {
if (subjectMapper.update(params) == 0){
throw new ServiceNoResultException("정상적으로 처리되지 않았습니다.");
}
return subjectMapper.selectOne(params);
}
@Override
public int getCount(Subject params) throws ServiceNoResultException, Exception {
return subjectMapper.selectCount(params);
}
@Override
public Subject getItem(Subject params) throws ServiceNoResultException, Exception {
Subject output = subjectMapper.selectOne(params);
if (output == null){
throw new ServiceNoResultException("정상적으로 처리되지 않았습니다.");
}
return output;
}
@Override
public List<Subject> getList(Subject params) throws ServiceNoResultException, Exception {
return subjectMapper.selectList(params);
}
@Override
public int deleteItem(Subject params) throws ServiceNoResultException, Exception {
// 과목을 삭제하기 위해 우선 해당 과목의 수강내역 삭제
Enrollment input = new Enrollment();
input.setSubjectId(params.getId());
enrollmentMapper.deleteBySubject(input);
// 과목삭제
int output = subjectMapper.delete(params);
return output;
}
}
/** 특정 과목에 해당하는 수강내역 삭제
*
* @param input - 삭제하려는 과목 번호가 저장된 enrollment 클래스의 객체
* @return - 삭제된 데이터의 수
*/
@Delete("DELETE FROM enrollments WHERE subject_id = #{subjectId}")
public int deleteBySubject(Enrollment enrollment);