溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中Spring Data JPA的使用

發(fā)布時間:2020-06-16 15:38:00 來源:億速云 閱讀:134 作者:元一 欄目:編程語言

  簡介:

  Spring Data JPA 的目標是通過讓一些必須的工作變得更簡單,來顯著提高數據訪問層的實現。作為一個開發(fā)者,你寫你的倉庫界面,包括自定義查詢方法,而 Spring 給你提供自動實現。

  特性:

  對建立基于Spring 和 JPA 的庫的支持

  支持 Querydsl predicates 和安全類型的 JPA 查詢

  Transparent auditing of domain class

  Pagination 支持, 動態(tài)查詢執(zhí)行, 可以集成自定義數據訪問代碼

  在 @Query 注明查詢引導時驗證

  支持基于 XML 的實體映射

  引入 @EnableJpaRepositories.,實現基于JavaConfig based 倉庫配置

  1. Spring Data JPA

  通常,在Java語言中,我們?yōu)轫椖刻峁祿С謺r,常常用到的ORM(Object Relation Mapping)框架有:MyBatis(iBatis)或Hibernate。通常在使用時,我們需要寫大量配置文件,比如mapper文件,hibernate cfg文件等。

  Spring Data Jpa集成在SpringBoot中,因為SpringBoot是一款習慣大于配置的微服務框架。所以Spring Data Jpa減少了傳統(tǒng)ORM框架中的大量配置,轉而使用讓數據訪問類(DAO)實現接口的方式定義數據查詢方式,當然,我們也可以利用Spring Data Jpa提供的@Query注解實現SQL自定義,但是因為Spring Data Jpa結合了Hibernate中的特性,所以自定義SQL語句時,必須使用HQL(Hibernate Query Language)語句。

  2. 配置數據源

  #application.yml

  spring:

  datasource:

  driver-class-name: com.mysql.cj.jdbc.Driver

  url: jdbc:mysql://localhost:3306/db_88ys

  username: huangwei

  password: 123456789

  3. 定義實體

  在定義實體時,我們需要使用到大量Spring Data Jpa提供的注解,這些注解都來源于(javax.presistence.*)。

  package com.demo.analysis.entity;

  import lombok.Data;

  import javax.persistence.*;

  @Data //lombok注解,提供相應屬性的getter,setter

  @Entity //表明該類是實體類

  @Table(name = "tb_user") //說明該實體所對應的數據表表名稱,不添加則說明數據表和類名相同

  public class User {

  @Id //表明該屬性對應數據庫中的id主鍵

  @GeneratedValue(strategy = GenerationType.IDENTITY) //指定主鍵生成策略:自增

  private Integer id;

  @Column(name = "username") //指定該屬性所對應數據庫中的字段名稱

  private String username;

  @Column(name = "password")

  private String password;

  public User(Integer id) {

  this.id = id;

  }

  public User(Integer id, String username, String password) {

  this.id = id;

  this.username = username;

  this.password = password;

  }

  }

  4. 定義數據訪問接口

  package com.demo.analysis.dao;

  import com.demo.analysis.entity.User;

  import org.springframework.data.jpa.repository.JpaRepository;

  import org.springframework.data.jpa.repository.Query;

  import org.springframework.stereotype.Repository;

  // 在繼承JpaRepository時,我們需要傳入兩個泛型,第一個是所對應的實體類,第二個是實體類中主鍵的類型

  @Repository

  public interface IUserDao extends JpaRepository {

  // 這里我們自定義查詢語句,必須使用HQL,即(Hibernate Query Language)

  @Query(value = "select new User(u.id, u.username, u.password) from User u where u.username=:username")

  User findUserByUserName(String username);

  }

  5. 數據訪問接口調用鄭州人流醫(yī)院哪家好 http://m.zzzy120.com/

  在接口調用過程中,我們會常常出現Iterable類型的參數,這是我們需要將參數轉換為集合類,如List或Set。

  package com.demo.analysis.controller;

  import com.alibaba.fastjson.JSONArray;

  import com.alibaba.fastjson.JSONObject;

  import com.demo.analysis.dao.IUserDao;

  import com.demo.analysis.entity.User;

  import org.springframework.beans.factory.annotation.Autowired;

  import org.springframework.web.bind.annotation.PathVariable;

  import org.springframework.web.bind.annotation.RequestMapping;

  import org.springframework.web.bind.annotation.RequestMethod;

  import org.springframework.web.bind.annotation.RestController;

  import java.util.ArrayList;

  import java.util.List;

  @RestController

  public class UserController {

  @Autowired

  private IUserDao userDao;

  // 查找全部

  @RequestMapping(value = "/users", method = RequestMethod.GET)

  public List getAllUsers() {

  return userDao.findAll();

  }

  // 按id批量查找

  @RequestMapping(value = "/users/{ids}", method = RequestMethod.GET)

  public List getUsersByIds(@PathVariable("ids") String ids) {

  return userDao.findAllById(this.getIdListFromString(ids));

  }

  // 自定義SQL,按用戶名查詢

  @RequestMapping(value = "/user/{username}", method = RequestMethod.GET)

  public User getUserByUserName(@PathVariable("username") String username) {

  return userDao.findUserByUserName(username);

  }

  // 保存單個用戶

  @RequestMapping(value = "/user", method = RequestMethod.POST)

  public User saveUser(User user) {

  return userDao.save(user);

  }

  // 保存多個用戶,這里傳入的Json數據需要轉換Json數組,并最終轉換成相應實體類

  @RequestMapping(value = "/users", method = RequestMethod.POST)

  public List saveUsers(String users) {

  JSONArray jsonArray = JSONObject.parseArray(users);

  List userList = new ArrayList<>();

  for (int i = 0; i < jsonArray.size(); i++) {

  userList.add(jsonArray.getObject(i, User.class));

  }

  return userDao.saveAll(userList);

  }

  // 刪除單個用戶

  @RequestMapping(value = "/user", method = RequestMethod.DELETE)

  public void deleteUser(Integer id) {

  userDao.deleteById(id);

  }

  // 按id刪除多個用戶

  @RequestMapping(value = "/users", method = RequestMethod.DELETE)

  public void deleteUsersByIds(String ids) {

  List users = new ArrayList<>();

  this.getIdListFromString(ids).forEach(id -> {users.add(new User(id));});

  userDao.deleteInBatch(users);

  }

  // 將以,隔開的id轉換為List

  private List getIdListFromString(String ids) {

  List integers = new ArrayList<>();

  for (String s : ids.split(",")) {

  integers.add(Integer.valueOf(s));

  }

  return integers;

  }

  }

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI