簡介:
創(chuàng)新互聯(lián)網(wǎng)絡(luò)公司擁有10多年的成都網(wǎng)站開發(fā)建設(shè)經(jīng)驗(yàn),上千家客戶的共同信賴。提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)站開發(fā)、網(wǎng)站定制、賣友情鏈接、建網(wǎng)站、網(wǎng)站搭建、成都響應(yīng)式網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)師打造企業(yè)風(fēng)格,提供周到的售前咨詢和貼心的售后服務(wù)
Spring Data JPA 的目標(biāo)是通過讓一些必須的工作變得更簡單,來顯著提高數(shù)據(jù)訪問層的實(shí)現(xiàn)。作為一個(gè)開發(fā)者,你寫你的倉庫界面,包括自定義查詢方法,而 Spring 給你提供自動(dòng)實(shí)現(xiàn)。
特性:
對(duì)建立基于Spring 和 JPA 的庫的支持
支持 Querydsl predicates 和安全類型的 JPA 查詢
Transparent auditing of domain class
Pagination 支持, 動(dòng)態(tài)查詢執(zhí)行, 可以集成自定義數(shù)據(jù)訪問代碼
在 @Query 注明查詢引導(dǎo)時(shí)驗(yàn)證
支持基于 XML 的實(shí)體映射
引入 @EnableJpaRepositories.,實(shí)現(xiàn)基于JavaConfig based 倉庫配置
1. Spring Data JPA
通常,在Java語言中,我們?yōu)轫?xiàng)目提供數(shù)據(jù)支持時(shí),常常用到的ORM(Object Relation Mapping)框架有:MyBatis(iBatis)或Hibernate。通常在使用時(shí),我們需要寫大量配置文件,比如mapper文件,hibernate cfg文件等。
Spring Data Jpa集成在SpringBoot中,因?yàn)镾pringBoot是一款習(xí)慣大于配置的微服務(wù)框架。所以Spring Data Jpa減少了傳統(tǒng)ORM框架中的大量配置,轉(zhuǎn)而使用讓數(shù)據(jù)訪問類(DAO)實(shí)現(xiàn)接口的方式定義數(shù)據(jù)查詢方式,當(dāng)然,我們也可以利用Spring Data Jpa提供的@Query注解實(shí)現(xiàn)SQL自定義,但是因?yàn)镾pring Data Jpa結(jié)合了Hibernate中的特性,所以自定義SQL語句時(shí),必須使用HQL(Hibernate Query Language)語句。
2. 配置數(shù)據(jù)源
#application.yml
spring:
datasource:
driver-class-name: com.MySQL.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_88ys
username: huangwei
password: 123456789
3. 定義實(shí)體
在定義實(shí)體時(shí),我們需要使用到大量Spring Data Jpa提供的注解,這些注解都來源于(javax.presistence.*)。
package com.demo.analysis.entity;
import lombok.Data;
import javax.persistence.*;
@Data //lombok注解,提供相應(yīng)屬性的getter,setter
@Entity //表明該類是實(shí)體類
@Table(name = "tb_user") //說明該實(shí)體所對(duì)應(yīng)的數(shù)據(jù)表表名稱,不添加則說明數(shù)據(jù)表和類名相同
public class User {
@Id //表明該屬性對(duì)應(yīng)數(shù)據(jù)庫中的id主鍵
@GeneratedValue(strategy = GenerationType.IDENTITY) //指定主鍵生成策略:自增
private Integer id;
@Column(name = "username") //指定該屬性所對(duì)應(yīng)數(shù)據(jù)庫中的字段名稱
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. 定義數(shù)據(jù)訪問接口
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時(shí),我們需要傳入兩個(gè)泛型,第一個(gè)是所對(duì)應(yīng)的實(shí)體類,第二個(gè)是實(shí)體類中主鍵的類型
@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. 數(shù)據(jù)訪問接口調(diào)用鄭州人流醫(yī)院哪家好 http://m.zzzy120.com/
在接口調(diào)用過程中,我們會(huì)常常出現(xiàn)Iterable類型的參數(shù),這是我們需要將參數(shù)轉(zhuǎn)換為集合類,如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);
}
// 保存單個(gè)用戶
@RequestMapping(value = "/user", method = RequestMethod.POST)
public User saveUser(User user) {
return userDao.save(user);
}
// 保存多個(gè)用戶,這里傳入的Json數(shù)據(jù)需要轉(zhuǎn)換Json數(shù)組,并最終轉(zhuǎn)換成相應(yīng)實(shí)體類
@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);
}
// 刪除單個(gè)用戶
@RequestMapping(value = "/user", method = RequestMethod.DELETE)
public void deleteUser(Integer id) {
userDao.deleteById(id);
}
// 按id刪除多個(gè)用戶
@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轉(zhuǎn)換為List
private List getIdListFromString(String ids) {
List integers = new ArrayList<>();
for (String s : ids.split(",")) {
integers.add(Integer.valueOf(s));
}
return integers;
}
}