为我正在使用的每个项目(来自数据库)创建Spring @Repository和@Controller

时间:2018-06-15 15:21:13

标签: java spring spring-boot jdbc dao

在处理涉及从数据库请求多种数据类型的项目时,我遇到了以下问题: 假设我有2个与数据库实体对应的java类:
路线

  public class Route {
  public Route(int n, int region, Date fdate, boolean changed, int points, 
  int length) {
    super();
    this.n = n;
    this.region = region;
    this.fdate = fdate;
    this.changed = changed;
    this.points = points;
    this.length = length;
    }
   }

载体

public class Carrier {
    public Carrier(...) {
    this.id = src.getId();
    this.name = src.getName();
    this.instId = src.getInstId();
    this.depotId = src.getDepotId();
}

如果是这样,创建Dao接口和类的正确方法是什么?我这样做 -

@Repository
public class CarrierDaoImpl implements CarrierDao{

@Autowired
DataSource dataSource;

public List<Carrier> getAllOrgs() { ... } 
}
@Repository
public class RoutesDaoImpl implements RoutesDao {

@Autowired
DataSource dataSource;

public ArrayList<AtmRouteItem> getRoutes(AtmRouteFilter filter) { ... }
}

我为每个java类item \ db实体创建一个@Repository DAO,然后为2个独立的控制器创建有关运营商和路由的请求。像这样:

@RestController
@RequestMapping(path = "/routes")
public class RoutesController {

@Autowired
RoutesDao routesDao;

@GetMapping(value = {"/getRoutes/", "/getRoutes"})
public ArrayList<Route> getRoutes() { ... } }

对于控制器运营商而言也是如此。这是正确的,如果不是正确的方法是什么?

抱歉有关样式问题,这是我关于stackoverflow的第一个问题:)

2 个答案:

答案 0 :(得分:0)

为每个实体设置DAO是正确的。 使用JPA存储库时,您别无选择,只能提供实体。例如:

public interface FooRepository extends JpaRepository<Foo,Long>{}

对于REST控制器,您必须像对象一样按对象汇集功能。

您可以将映射改进为更加RESTful。要检索所有路线,请不要指定路径:

@GetMapping
public ArrayList<RouteResource> getRoutes() { ... } 

(我从未使用@GetMapping,但它应该像那样工作)

如果你想要特定的路线:

@GetMapping("/get/{id}")
public RouteResource getRoute() {...}

您应该将资源而不是实体返回给客户。

答案 1 :(得分:0)

我建议创建标有@Service注释的服务(即CarrierService接口和CarrierServiceImpl实现)。然后将它们注入控制器。在服务中使用存储库是因为某些数据库操作需要事务处理,而管理事务的更好位置是服务。此外,服务可以执行更专业的工作,这需要访问多个存储库,以便您可以注入它们。不要忘记使用@Transactional注释标记您的服务。