Spring Data JPA —— 快速开发项目持久层

  • 本次使用Spring Data JPA开发项目,不得不说在小项目中使用 Spring Data JPA还是可以帮我们节约一些时间的。
    Spring Data JPA —— 快速开发项目持久层_第1张图片

1、引入maven


      <dependency>
          <groupId>mysqlgroupId>
          <artifactId>mysql-connector-javaartifactId>
      dependency> 
      `
  	<dependency>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-starter-data-jpaartifactId>
    dependency>

2、需要构建的数据库实体

2.1、大学实体

import lombok.Data;
import org.hibernate.annotations.DynamicUpdate;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

@Entity
@Data
@DynamicUpdate
public class University implements Serializable {

    /**
     * 学校ID
     */
    @Id
    private String universityId;

    /**
     * 英文名称
     */
    private String englishName;

    /**
     * 中文名称
     */
    private String chineseName;

    /**
     * 校徽
     */
    private String universityBadge;

    /**
     * 大学位置
     */
    private String universityLocation;

    /**
     * 简介
     */
    private String universityIntroduction;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 修改时间
     */
    private Date updateTime;

    /**
     * 专业信息
     */
    @OneToMany(mappedBy = "university")
    private List<UniversityMajor> majorList;

}

2.2、专业与大学的关系实体

import lombok.Data;
import org.hibernate.annotations.DynamicUpdate;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

@Entity
@Data
@DynamicUpdate
public class UniversityMajor implements Serializable {

    @Id
    private String universityMajorId;

    /**
     * 专业方向
     */
    private String majorDirection;

    /**
     * 学时
     */
    private Integer studyTime;

    /**
     * 开学时间
     */
    private Integer startTime;

    /**
     * 开课类型
     */
    private String startType;

    /**
     * 专业学费
     */
    private BigDecimal majorTuition;

    /**
     * 申请费用
     */
    private BigDecimal majorApplyMoney;

    /**
     * optional=false,表示 university不能为空
     */
    @ManyToOne()
    @JoinColumn(name = "university_id")
    private University university;

    @OneToOne
    @JoinColumn(name = "major_id")
    private Major major;
}

2.3、专业实体

import lombok.Data;
import org.hibernate.annotations.DynamicUpdate;

import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

@Entity
@Data
@DynamicUpdate
public class Major implements Serializable {

    /**
     * 专业ID
     */
    @Id
    private Integer majorId;

    /**
     * 专业名称
     */
    private String majorName;

    /**
     * 专业类型
     */
    private String type;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 修改时间
     */
    private Date updateTime;
}

说明:

  • 本次构建的数据库关系为多对多:
    • 一个大学有多个专业,一个专业可以有多个大学,以为正常情况下专业应该有唯一的编码,在每个学校中存在异同。
  • 在启动项目之后 Spring Data JPA会帮助我们创建数据库对象,例如:
    Spring Data JPA —— 快速开发项目持久层_第2张图片

3、Controller层

通过大学id查询大学

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/university")
public class UniversityController {
    @Autowired
    private UniversityService universityService;

    @Autowired
    private CommentService commentService;

    @GetMapping("/{id}")
    public ResultVO<UniversityHomeVO> query(@PathVariable String id) {
        UniversityInfoVO universityInfoVO = new UniversityInfoVO();
        // 获取大新信息并拷贝
        University2UniversityInfoConverter.converter(universityService.findById(id), universityInfoVO);
        // 获取五条评论
        List<CommentDTO> commentDTOList = commentService.findByCommentTopNumber(id, 0, 5);
        universityInfoVO.setCommentVOList(CommentDTO2CommentVOConverter.convert(commentDTOList));
        return ResultVOUtil.success(universityInfoVO);
    }
}

前端相应对象

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
public class UniversityInfoVO implements Serializable {

    private static final long serialVersionUID = -3895834204864685262L;

    @JsonProperty("unvId")
    private String universityId;

    /**
     * 英文名称
     */
    @JsonProperty("enName")
    private String englishName;

    /**
     * 中文名称
     */
    @JsonProperty("chName")
    private String chineseName;

    /**
     * 校徽
     */
    @JsonProperty("unvBadge")
    private String universityBadge;

    /**
     * 简介
     */
    @JsonProperty("unvIntroduction")
    private String universityIntroduction;

    /**
     * 地理位置
     */
    @JsonProperty("unvLocation")
    private String universityLocation;

    /**
     * 专业名称列表
     */
    @JsonProperty("supportMajor")
    private List<MajorVO> majorVOList;
}
@Data
public class UniversityHomeVO {
    /**
     * 学校ID
     */
    @Id
    private String universityId;

    /**
     * 英文名称
     */
    private String englishName;

    /**
     * 中文名称
     */
    private String chineseName;

    /**
     * 校徽
     */
    private String universityBadge;
}

工具类

import java.util.List;
import java.util.stream.Collectors;

public class UniversityToUniversityHomeVO {
    public static List<UniversityHomeVO> converter(List<University> universityList) {
        return universityList.stream()
                .map(UniversityToUniversityHomeVO::converter)
                .collect(Collectors.toList());
    }
    public static UniversityHomeVO converter(University university) {
        UniversityHomeVO homeVO = new UniversityHomeVO();
        BeanUtils.copyProperties(university, homeVO);
        return homeVO;
    }
}
import java.util.ArrayList;
import java.util.List;
public class University2UniversityInfoConverter {
    public static void converter(University university, UniversityInfoVO universityInfoVO) {
        universityInfoVO.setUniversityId(university.getUniversityId());
        universityInfoVO.setChineseName(university.getChineseName());
        universityInfoVO.setEnglishName(university.getEnglishName());
        universityInfoVO.setUniversityBadge(university.getUniversityBadge());
        universityInfoVO.setUniversityLocation(university.getUniversityLocation());
        universityInfoVO.setUniversityIntroduction(university.getUniversityIntroduction());
        universityInfoVO.setUniversityLocation(university.getUniversityLocation());
        universityInfoVO.setMajorVOList(getMajorList(subList(university.getMajorList(), 0, 6)));
    }
}

4、Service层


import java.util.List;

public interface UniversityService {
    University findById(String universityId);
    List<University> findByChineseNameLike(String chineseName);
    List<University> findByEnglishNameLike(String englishName);
} 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;

@Service
public class UniversityServiceImpl implements UniversityService {

    @Autowired
    private UniversityRepository universityRepository;

    @Override
    public University findById(String universityId) {
        return universityRepository.findById(universityId).orElse(null);
    }

    @Override
    public List<University> findByChineseNameLike(String chineseName) {
        return universityRepository.findByChineseNameLike(chineseName);
    }

    @Override
    public List<University> findByEnglishNameLike(String englishName) {
        return universityRepository.findByEnglishNameLike(englishName);
    }
}

5、Dao层(Repository)

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface UniversityRepository extends JpaRepository<University, String> {
    List<University> findByChineseNameLike(String chineseName);

    List<University> findByEnglishNameLike(String englishName);

}

项目演示

` 注:项目中的大学信息为自己伪造。
Spring Data JPA —— 快速开发项目持久层_第3张图片

6、总结

  • Spring Data JPA在开发小任务的时候可以帮助我们快速构建项目的持久层,通过Spring Boot进行配置就可以创建和更新数据库。
  • 但是也有一一定的缺陷,在处理复杂的业务的时候,特别是涉及到多表联查的时候就需要我们自己书写SQL语句。
  • 在Spring Data JPA 2.0之后,对原生SQL有了较好的支持。作为一款轻量级的持久层框架,在小项目的开发中可以帮我们节省很多的时间。

你可能感兴趣的:(Spring,Boot)