1、JPA
1. 概念:JPA顧名思義就是Java Persistence API的意思,是JDK 5.0註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中。java
2.爲何 使用JPA:mysql
JPA 是 JCP 組織發佈的 Java EE 標準之一,所以任何聲稱符合 JPA 標準的框架都遵循一樣的架構,提供相同的訪問API,這保證了基於JPA開發的企業應用可以通過少許的修改就可以在不一樣的JPA框架下運行。web
a.容器級特性的支持spring
JPA框架中支持大數據集、事務、併發等容器級事務,這使得 JPA 超越了簡單持久化框架的侷限,在企業應用發揮更大的做用。sql
b.簡單方便數據庫
JPA的主要目標之一就是提供更加簡單的編程模型:在JPA框架下建立實體和建立Java 類同樣簡單,沒有任何的約束和限制,只須要使用 javax.persistence.Entity進行註釋,JPA的框架和接口也都很是簡單,沒有太多特別的規則和設計模式的要求,開發者能夠很容易的掌握。JPA基於非侵入式原則設計,所以能夠很容易的和其它框架或者容器集成。apache
c.查詢能力編程
JPA的查詢語言是面向對象而非面向數據庫的,它以面向對象的天然語法構造查詢語句,能夠當作是Hibernate HQL的等價物。JPA定義了獨特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴展,它是針對實體的一種查詢語言,操做對象是實體,而不是關係數據庫的表,並且可以支持批量更新和修改、JOIN、GROUP BY、HAVING 等一般只有 SQL 纔可以提供的高級查詢特性,甚至還可以支持子查詢。設計模式
d.高級特性springboot
JPA 中可以支持面向對象的高級特性,如類之間的繼承、多態和類之間的複雜關係,這樣的支持可以讓開發者最大限度的使用面向對象的模型設計企業應用,而不須要自行處理這些特性在關係數據庫的持久化。
2、SpringBoot整合JPA
1.工程目錄
這裏有個小坑,以前搞了半天發現自動生成不了實體類對應的表後來發現是包名的緣由,這裏要注意SpringbootJpaDemoApplication所在的包與entity所在包之間的關係,SpringbootJpaDemoApplication在com.example.demo中那麼咱們的實體類User就得在com.example.demo.Entity下,這樣才能成功對應生成實體類的表
2.配置pom:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>springboot-jpa-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot-jpa-demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- jpa依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- mysql依賴 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- 熱部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <!-- optional=true, 依賴不會傳遞, 該項目依賴devtools; 以後依賴boot項目的項目若是想要使用devtools, 須要從新引入 --> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3.配置application.yml及application-test.yml
application.yml: (需注意配置格式)
spring: profiles: active: test datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC username: root password: 123 jpa: database: MYSQL hibernate: ddl-auto: update show-sql: true jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: UTC
application-test.yml:
spring: devtools: restart: enabled: true additional-paths: src/main/java
咱們的實體User類 :
package com.example.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="t_user") public class User { @Id @GeneratedValue(strategy=GenerationType.IDENTITY)//自增 private Integer id; private String name; private String passWord; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } }
到這裏,咱們啓動項目,而後就會自動在數據庫中生成對應的t_user表
4.建立controller,service,dto作一些增刪改查的操做
a.controller:
package com.example.demo.controller; import java.util.List; import java.util.Optional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.example.demo.entity.User; import com.example.demo.service.IUserService; @RestController public class UserController { @Autowired IUserService userService; @GetMapping(value="/getUserById") public Optional<User> findUserById(@RequestParam("Id") Integer id){ return userService.findUserById(id); } @GetMapping("/all") public List<User> findAll(){ return userService.findAll(); } @PostMapping("/update") public User updateUser(@RequestParam("Id") Integer id,@RequestParam("name") String name,@RequestParam("passWord") String passWord) { return userService.updateUserById(id, name, passWord); } @PutMapping("/insert") public User insertUser(@RequestParam("name") String name,@RequestParam("passWord") String passWord) { return userService.insertUser(name, passWord); } @DeleteMapping("/delete") public void deleteUser(@RequestParam("Id") Integer id) { userService.deleteUserById(id); } }
b.service:
package com.example.demo.service; import java.util.List; import java.util.Optional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.example.demo.dto.IUserDto; import com.example.demo.entity.User; @Service public class UserServiceImpl implements IUserService{ @Autowired IUserDto iUserDto; @Override public Optional<User> findUserById(Integer id) { return iUserDto.findById(id); } @Override public User updateUserById(Integer id,String name, String passWord) { User user = new User(); user.setId(id); user.setName(name); user.setPassWord(passWord); return iUserDto.save(user); } @Override public User insertUser(String name, String passWord) { User user = new User(); user.setName(name); user.setPassWord(passWord); return iUserDto.save(user); } @Override public void deleteUserById(Integer id) { iUserDto.deleteById(id); } @Override public List<User> findAll() { return iUserDto.findAll(); } } c.dto: package com.example.demo.dto; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import com.example.demo.entity.User; public interface IUserDto extends JpaRepository<User,Integer>{//默認傳的是ID爲條件,若是須要其餘條件來進行CRDU操做可經過增長方法來實現 public List<User> findByName(String name);//方法名不能亂寫,要按你須要的條件來寫 findBy你的字段名 }
5.測試:
這裏採用火狐的RESTClient
a.put用法
b.delete用法
c.post用法
d.Get用法
--------------------- 做者:北半球先生 來源:CSDN 原文:https://blog.csdn.net/sinat_22808389/article/details/81592642