Spring Data JPA在Spring Boot中的應用

1.JPAjava

  JPA(Java Persistence API)是Sun官方提出的Java持久化規範。它爲Java開發人員提供了一種對象/關聯映射工具來管理Java應用中的關係數據。他的出現主要是爲了簡化現有的持久化開發工做和整合ORM技術,結束如今Hibernate,TopLink,JDO等ORM框架各自爲營的局面。值得注意的是,JPA是在充分吸取了現有Hibernate,TopLink,JDO等ORM框架的基礎上發展而來的,具備易於使用,伸縮性強等優勢。JPA是一套規範,不是一套產品,那麼像Hibernate,TopLink,JDO他們是一套產品,若是說這些產品實現了這個JPA規範,那麼咱們就能夠叫他們爲JPA的實現產品。mysql

2.項目搭建spring

  本文采用IDEA搭建Spring Boot的JPA應用,Demo結構圖以下:sql

3.具體實現數據庫

(1)配置文件json

  • pom.xml里加入spring-boot-starter-data-jpa以及mysql-connector-java的依賴,以下所示。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.6</version>
</dependency>
  • application.yml里加入hibernate、jpa的配置,以及返回json對日期字段的特殊處理配置,注意time-zone的設置,須與mysql的url配置一致,不然會引發時間相差8小時的問題。jpa裏的show-sql做用,若是設置爲true,執行程序後能夠看在控制檯裏看到sql語句,以下所示。
spring:
  profiles:
    active: product
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/saascrm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    username: root
    password: snail123
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: UTC

(2)分層服務器

  爲了區別各個模塊,爲項目創建幾個包:controller、Entity、respository、service,這是典型的MVC架構,各個層次的表明意義在此再也不贅述。網絡

(3)Respository層架構

    spring data jpa讓咱們解脫了DAO層的操做,基本上全部CRUD均可以依賴於它來實現,須要實現JpaRepository接口app

public interface UserRepository extends JpaRepository<UserInfo,Long> {
}

(4)Entity層

  定義了用戶信息表實體UserInfo,經過Hibernate與數據庫造成映射關係,以下:

@Entity
@Component
public class UserInfo {
    public UserInfo() {
    }

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public String getJobNumber() {
        return jobNumber;
    }

    public void setJobNumber(String jobNumber) {
        this.jobNumber = jobNumber;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    private  Long id; //ID
    private  String name; //姓名
    private  String jobNumber; //工號
    private Date createTime; //建立時間

}

(5)service層

  定義了服務層接口以及服務層接口實現類,以下:

  • UserService.java
public interface UserService {
    List<UserInfo> getUserList();
    UserInfo getUserByName(String name);
    UserInfo addUserInfo(UserInfo userInfo);
    UserInfo updateUserInfoById(UserInfo userInfo);
    void deleteUserInfoById(Long Id);
    List<UserInfo>getCurrentUserList();
    Page<UserInfo> getPageUserList();
}
  • UserServiceImpl.java

  其中涉及單表的增刪改查,還有分頁查詢等

@Service
public class UserServiceImpl implements UserService{
    @Autowired
    private UserRepository userRepository;

    /**
     * 獲取全部用戶列表
     * @return
     */
    public List<UserInfo> getUserList(){
        List<UserInfo> userList=new ArrayList<UserInfo>();
        userList=userRepository.findAll();
        return  userList;
    }

    /**
     * 經過姓名獲取用戶信息
     * @param name 用戶姓名
     * @return
     */
    public UserInfo getUserByName(String name) {
        return userRepository.findByName(name);
    }

    /**
     * 新增用戶信息
     * @param userInfo 用戶信息
     * @return
     */
    public UserInfo addUserInfo(UserInfo userInfo) {
        return userRepository.save(userInfo);
    }

    /**
     * 更新用戶信息
     * @param userInfo 用戶信息
     * @return
     */
    public UserInfo updateUserInfoById(UserInfo userInfo) {
       return userRepository.save(userInfo);
    }

    /**
     * 刪除用戶信息
     * @param id 主鍵Id
     */
    public void deleteUserInfoById(Long id) {
        userRepository.delete(id);
    }

    /**
     * 獲取最新的用戶
     * @return
     */
    public List<UserInfo> getCurrentUserList() {
        Sort sort=new Sort(Sort.Direction.DESC,"createTime");
        return userRepository.findAll(sort);

    }

    /**
     * 獲取分頁的用戶
     * @return
     */
    public Page<UserInfo> getPageUserList() {
        Sort sort=new Sort(Sort.Direction.DESC,"createTime");
        Pageable pageable=new PageRequest(0,5,sort);
        return userRepository.findAll(pageable);
    }

}

(6)Controller層

  其中,日期格式須要作轉換,在須要日期轉換的Controller中使用SpringMVC的註解@initbinder和Spring自帶的WebDateBinder類來操做。WebDataBinder是用來綁定請求參數到指定的屬性編輯器.因爲前臺傳到controller裏的值是String類型的,當往Model裏Set這個值的時候,若是set的這個屬性是個對象,Spring就會去找到對應的editor進行轉換,而後再SET進去。

@RestController
@RequestMapping(value = "/test")
public class TestController {

    @Autowired
    private UserInfo userInfo;

    @Resource
    private UserService userService;

    /**
     * 獲取全部用戶
     * @return
     */
    @GetMapping(value = "/getUserList")
    public List<UserInfo> getUserList() {
        return userService.getUserList();
    }

    @GetMapping(value = "/getUserInfo")
    public UserInfo getUserInfoByName(@RequestParam("name") String name) {
        return userService.getUserByName(name);
    }

    @GetMapping(value = "/getCurrentUserList")
    public List<UserInfo> getCurrentUserList(){
        return userService.getCurrentUserList();
    }

    @GetMapping(value="/getPageUserList")
    public Page<UserInfo> getPageUserList(){
        return userService.getPageUserList();
    }

    @PutMapping(value = "/addUserInfo")
    public UserInfo addUserInfo(UserInfo userInfo) {
        return userService.addUserInfo(userInfo);
    }

    @PostMapping(value ="/updateUserInfo")
    public UserInfo updateUserInfo(UserInfo userInfo){
        return userService.updateUserInfoById(userInfo);
    }

    @PostMapping(value="/deleteUserInfo")
    public void deleteUserInfo(@RequestParam("id") Long id){
         userService.deleteUserInfoById(id);
    }

    @InitBinder
    protected void init(HttpServletRequest request, ServletRequestDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));/*TimeZone時區,解決差8小時的問題*/
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }

4.測試

  Http定義了與服務器交互的不一樣方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,咱們能夠這樣認爲:一個URL地址,它用於描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應着對這個資源的查,改,增,刪4個操做。

  本文藉助PostMan工具進行測試,以下圖所示。(注意事項,若是選擇PUT請求,那麼只能選x-www-form-urlencoded)

相關文章
相關標籤/搜索