after working on some pet project for beginner. I realize that all of my projects use CRUD as its basic operation for each service. So, I think that I can using Generic to create an interface for CRUD operation, and then using abstract class to implement and provide basic logic for it. Then, with all service in my project, I can let them extend the abstract class and implement the CRUD service and whenever I want to have CRUD operation in one service, I can just call super. from the abstract class instead of write the logical code for it.
public interface BasicService<T>{
1. T add(T model);
2. T update(T model, int id);
3. void delete(int id);
4. T getById(int id);
}
@Repository
public interface BasicRepository<T> extends JpaRepository<T, Integer>{
}
public interface CarService extends BasicService<Car>{
}
public abstract class BasicServiceImpl<T> implements BasicService<T>{
private final BasicRepository<T> basicRepository;
public BasicServiceImpl(BasicRepository<T> basicRepository){
this.basicRepository = basicRepository;
}
@Override
public T getById(int id){
basicRepository.findById(id)
}
@Override
@Transactional
public ResponseEntity<?> delete(int id){
this.basicRepository.deleteById(id);
}
@Override
public T update(T model, int id){
return this.basicRepository.save(model);
}
@Override
public T add(T model){
return this.basicRepository.save(model);
}
}
@Service
public CarServiceImpl extends BasicServiceImpl<Car> implement CarService{
private CarRepository carRepository;
@Autowired
public CarServiceImpl(CarRepository carRepository){
super(carRepository);
}
@Override
public Car getById(int id){
return super.getById(id);
}
@Override
public Car add(Car model){
return super.add(model);
}
}