目录
基本概念
代码与实例
此篇博文记录了本人目前对web后端开发的认识。
Web开发一般的思路:
先dao再service最后controller
而dao又分为dataobject和repository!
而这个dataobject一般是数据库的映射,比如MySQL数据库,如果用jpa,那么命名也是有讲究的,但如果使用注解,就没有这么多的讲究了。
而这个repository,为接口,结构接口extends JpaRepository,并且可以自己写一些方法。这里就可以通过jpa操作数据。
个人觉得Service层一般先搞一个接口,把需要的逻辑业务写到这个接口里面,在用一个类,继承这个接口,然后通过调用repository,把那些数据给记录进去。这里可以看到一般Service中都有一个@Autowired,把Repository给注入进去了。
对于Controller层目前还没有什么深的体会。
对于dao,感觉是搞数据的,估计这个就叫做数据持久层,这个名字可真骚气啊。
对于service,感觉是搞逻辑业务的,但逻辑业务不够的时候,可以新增几个函数到接口里面,继承的类去实例化。
还有个关键点:个人觉得除非很熟悉这套模式可以不进行go to test,这个go to test还是很有用的,至少可以保证这部分代码是可以跑的。
还有个关键的地方,就是少去用0,1,表示状态,java中的枚举,感觉比C++的爽很多,感觉就和类,对象一样。多使用枚举去表示状态,增加可读性
如下的结构:
其中dataobject就是放基本数据,与数据库进行映射的。
其中enums就是增加代码可读性,避免大量的状态用0,1表示。
其中repository为存储数据的,service就是操作这个的。
其中service中有接口,和实例,这个要分开,这样才能使得结构更加清晰,
下面给出一组的代码(ProductInfo的dao和service层代码)
ProductInfo.java
package selldemo.demo.dataobject;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.math.BigDecimal;
@Entity
@Data
public class ProductInfo {
@Id
private String productId;
//名字
private String productName;
//单价
private BigDecimal productPrice;
//库存
private Integer productStock;
//描述
private String productDescription;
//小图
private String productIcon;
//状态 0 正常, 1 下架
private Integer productStatus;
//类目编号
private Integer categoryType;
}
ProductInfoRepository.java
package selldemo.demo.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import selldemo.demo.dataobject.ProductInfo;
import java.util.List;
public interface ProductInfoRepository extends JpaRepository {
//Dao层的东西主要在service中使用
List findByProductStatus(Integer productStatus);
}
ProdctService.java
package selldemo.demo.service;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import selldemo.demo.dataobject.ProductInfo;
import java.util.List;
//service层
public interface ProductService {
ProductInfo findOne(String productId);
//查询所有商品列表
List findUpAll();
Page findAll(Pageable pageable);
ProductInfo save(ProductInfo productInfo);
}
ProductServiceImpl.java
package selldemo.demo.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import selldemo.demo.dataobject.ProductInfo;
import selldemo.demo.enums.ProductStatusEnum;
import selldemo.demo.repository.ProductInfoRepository;
import selldemo.demo.service.ProductService;
import java.util.List;
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductInfoRepository repository;
@Override
public ProductInfo findOne(String productId) {
return repository.findOne(productId);
}
@Override
public List findUpAll() {
return repository.findByProductStatus(ProductStatusEnum.UP.getCode());
}
@Override
public Page findAll(Pageable pageable) {
return repository.findAll(pageable);
}
@Override
public ProductInfo save(ProductInfo productInfo) {
return repository.save(productInfo);
}
}
另外的那个枚举
ProductStatusEnum.java
package selldemo.demo.enums;
import lombok.Getter;
@Getter
public enum ProductStatusEnum {
UP(0, "在架"),
DOWN(1, "下架");
private Integer code;
private String message;
ProductStatusEnum(Integer code, String message){
this.code = code;
this.message = message;
}
}