Spring Data Jpa
Setup
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- for mongodb -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- for postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
<!-- for mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>application.properties

Entities
Course.java
@Entity
@Table(name="course")
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Column
private Integer credit;
@OneToOne
@JoinColumn(name = "teacher_id")
private Teacher teacher;
@OneToMany(mappedBy = "course")
private List<Enrollment> enrollmentList;
// setter and getter ...
}Enrollment.java
@Entity
@Table(name = "enrollment")
public class Enrollment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
private Course course;
@ManyToOne
private Student student;
private Integer score;
// setter and getter ...
}Student.java
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private LocalDate dob;
@OneToMany(mappedBy = "student")
List<Enrollment> enrollmentList;
// setter and getter ...
}mongodb
mongodb/History.java
@Document("enrollment_history")
public class History {
@Id
private String id;
private String action;
private String studentName;
private String courseName;
// setter and getter ...
}MVC
- package structures:
- configuration
- controller
- data
- entity
- mongodb
- History.java
- Course
- Enrollment
- Student
- Teacher
- mongodb
- repository
- mongodb
- HistoryRepository.java
- EnrollmentRepository.java
- StudentRepository.java
- TeacherRepository.java
- mongodb
- service
- EnrollmentService.java
- EnrollmentServiceImpl.java
- StudentService.java
- StudentServiceImpl.java
- TeacherService.java
- TeacherServiceImpl.java
- UserService.java
- UserServiceImpl.java
- UserServiceImpl2.java
- util
- vo
- SpringBootDemoApplication.java
Dao layer
repository/EnrollmentRepository.java
// package ...
// import ...Enrollment;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EnrollmentRepository extends JpaRepository<Enrollment, Long> {
}repository/StudentRepository.java
// package ...
// import ...Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface StudentRepository extends JpaRepository<Student, Long> {
}repository/TeacherRepository.java
// package ...
// import ...Teacher;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface TeacherRepository extends JpaRepository<Teacher, Long> {
// select * from teachers where age < 40 and id > 1000;
List<Teacher> findByAgeLessThan(int age);
List<Teacher> findByAge(int age);
// @Query(value = "select t from Teacher t where t.age < ? and t.id > ?", nativeQuery = true) // native sql query
@Query(value = "select t from Teacher t where t.age < :age and t.id > :id") // jpql
List<Teacher> a(int age, long id);
}mongodb
repository/mongodb/HistoryRepository.java
public interface HistoryRepository extends MongoRepository<History, String> {
List<History> findByAction(String action);
List<History> findByCourseName(String courseName);
}Test Repositories

Service layer
EnrollmentServiceImpl.java
@Service
public class EnrollmentServiceImpl implements EnrollmentService {
@Autowired
EnrollmentRepository enrollmentRepository;
@Autowired
HistoryRepository historyRepository;
@Override
@Transactional
public Enrollment enroll(Student student, Course course) {
History history = new History();
// history.set....
historyRepository.save(history);
Enrollment enrollment = new Enrollment();
// enrollment.set...
return enrollmentRepository.save(enrollment);
}
@Override
public EnrollmentVO getEnrollment(Long id) {
Enrollment enrollment = enrollmentRepository.findById(id).orElse(null);
EnrollmentVO vo = new EnrollmentVO();
// vo.set...
return vo;
}
@Override
public List<Enrollment> getEnrollmentByCourseId(Long courseId) {
Enrollment enrollmentExample = new Enrollment();
Course c = new Course();
c.setId(courseId);
enrollmentExample.setCourse(c);
Example<Enrollment> example = Example.of(enrollmentExample);
List<Enrollment> enrollments = enrollmentRepository.findAll(example);
List<EnrollmentVO> voList = new ArrayList<>();
enrollments.forEach(enrollment -> {
EnrollmentVO vo = new EnrollmentVO();
// vo.setId(enrollment.getId());
// vo.setCourseName(enrollment.getCourse().getName());
// vo.setStudentName(enrollment.getStudent().getName());
voList.add(vo);
})
return voList;
}
@Override
public List<EnrollmentVO> getAll(int page, int rows) {
Pageable pageRequest = PageRequest.of(page, rows);
Page<Enrollment> p = enrollmentRepository.findAll(pageRequest);
List<Enrollment> enrollments = p.getContent();
List<EnrollmentVO> voList = enrollments.stream().map(enrollment -> {
EnrollmentVO vo = new EnrollmentVO();
// vo.set...
return vo;
}).toList();
return voList;
}
}StudentServiceImpl.java
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
StudentRepository studentRepository;
@Override
public List<StudentVO> getAllStudents() {
return studentRepository.findAll().stream().map(entity -> {
StudentVO temp = new StudentVO();
BeanUtils.copyProperties(entity, temp);
temp.setDob(Date.valueOf(entity.getDob()));
return temp;
}).toList();
}
}UserServiceImpl.java
@Service
@Primary
public class UserServiceImpl implements UserService {
public void login(String username) { System.out.println("in user service, use password"); }
}UserServiceImpl2.java
@Service
public class UserServiceImpl implements UserService {
public void login(String username) { System.out.println("in user service2, login by fingerprint"); }
}