日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot 正确中使用JPA实战

發布時間:2024/9/30 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot 正确中使用JPA实战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在項目中使用了一下jpa,發現還是挺好用的。這里就來講一下jpa以及在spring boot中的使用。
在這里我們先來了解一下jpa。

JPA的全稱是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的規范,內部是由一系列的 接口和抽象類 構成。 JPA通過JDK 5.0注解描述對象-關系表的映射關系,并將運行期的實體對象持久化到數據庫中。

jpa的優勢

標準化

JPA 是 JCP 組織發布的 Java EE 標準之一,因此任何聲稱符合 JPA 標準的框架都遵循同樣的架構,提供相同的訪問API,這保證了基于JPA開發的企業應用能夠經過少量的修改就能夠在不同的JPA框架下運行。

?

容器級特性的支持

JPA框架中支持大數據集、事務、并發等容器級事務,這使得 JPA 超越了簡單持久化框架的局限,在企業應用發揮更大的作用。

?

簡單方便

JPA的主要目標之一就是提供更加簡單的編程模型:在JPA框架下創建實體和創建 Java 類一樣簡單,沒有任何的約束和限制,只需要使用 javax.persistence.Entity 進行注釋,JPA的框架和接口也都非常簡單,沒有太多特別的規則和設計模式的要求,開發者可以很容易的掌握。JPA基于非侵入式原則設計,因此可以很容易的和其它框架或者容器集成。

?

查詢能力

JPA的查詢語言是面向對象而非面向數據庫的,它以面向對象的自然語法構造查詢語句,可以看成是Hibernate HQL的等價物。JPA定義了獨特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴展,它是針對實體的一種查詢語言,操作對象是實體,而不是關系數據庫的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級查詢特性,甚至還能夠支持子查詢。

?

高級特性

JPA 中能夠支持面向對象的高級特性,如類之間的繼承、多態和類之間的復雜關系,這樣的支持能夠讓開發者最大限度的使用面向對象的模型設計企業應用,而不需要自行處理這些特性在關系數據庫的持久化。

?

基礎操作

相關依賴

?

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>cn.com.codingce</groupId><artifactId>jpa</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><name>jpa</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

?

配置數據庫連接信息和JPA配置(本地創建數據庫springboot_jpa)

???????

spring.datasource.url=jdbc:mysql://localhost:3306/springboot_jpa?useSSL=false&serverTimezone=CTT spring.datasource.username=root spring.datasource.password=123456 # 打印出 sql 語句 spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=create spring.jpa.open-in-view=false # 創建的表的 ENGINE 為 InnoDB spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect

注意:

spring.jpa.hibernate.ddl-auto=create----每次運行該程序,沒有表格會新建表格,表內有數據會清空 spring.jpa.hibernate.ddl-auto=create-drop----每次程序結束的時候會清空表 spring.jpa.hibernate.ddl-auto=update----每次運行程序,沒有表格會新建表格,表內有數據不會清空,只會更新 spring.jpa.hibernate.ddl-auto=validate----運行程序會校驗數據與數據庫的字段類型是否相同,不同會報錯

???????

只限本地測試玩。

?

實體類

?

package cn.com.codingce.jpa.entity;import lombok.Data; import lombok.NoArgsConstructor;import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id;/*** @Author: Jiangjun* @Date: 2019/10/22 13:01*/ @Entity @Data @NoArgsConstructor public class Person {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(unique = true)private String name;private Integer age;public Person(String name, Integer age) {this.name = name;this.age = age;}}

?

到此步運行相應的表即可創建,控制臺輸出語句如下:

?

數據庫相應表創建:

創建操作數據庫的 Repository 接口

package cn.com.codingce.jpa.repository;import cn.com.codingce.jpa.entity.Person; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Repository;import java.util.Optional;/*** @Author: Jiangjun* @Date: 2019/10/22 13:04*/ @Repository public interface PersonRepository extends JpaRepository<Person, Long> {/*** 根據 name 來查找 Person** @param name 用戶姓名* @return*/@Query("select p from Person p where p.name = :name")Optional<Person> findByNameCustomeQuery(@Param("name") String name);/*** 根據 id 更新Person name** @param id 用戶id* @return*/@Query("select p.name from Person p where p.id = :id")String findPersonNameById(@Param("id") Long id);}

這個接口和數據庫操作有關,繼承JpaRepository。JpaRepository繼承自PagingAndSortingRepository接口,JpaRepository基于JPA的Repository接口,極大減少了JPA作為數據訪問的代碼,JpaRepository是實現Spring Data JPA技術訪問數據庫的關鍵接口。

@NoRepositoryBeanpublic interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {List<T> findAll();List<T> findAll(Sort var1);List<T> findAllById(Iterable<ID> var1);<S extends T> List<S> saveAll(Iterable<S> var1);void flush();<S extends T> S saveAndFlush(S var1);void deleteInBatch(Iterable<T> var1);void deleteAllInBatch();T getOne(ID var1);<S extends T> List<S> findAll(Example<S> var1);<S extends T> List<S> findAll(Example<S> var1, Sort var2); }

繼承了JpaRepository<Person, Long>就具有了JPA為我們提供好的增刪改查、分頁以及根據條件查詢等方法。

jpa自帶方法實戰

service層

package cn.com.codingce.jpa.service;import cn.com.codingce.jpa.entity.Person; import cn.com.codingce.jpa.repository.PersonRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;/*** @Author: Jiangjun* @Date: 2019/10/22 13:07*/ @Service public class PersonService {@Autowiredprivate PersonRepository repository;/*** 添加** @param person*/@Transactional(rollbackFor = Exception.class)public void save(Person person) {repository.save(person);}/*** 查找用戶** @param id 用戶id* @return*/public Person findById(Long id) {Person person = repository.findById(id).orElseThrow(RuntimeException::new);return person;}/*** 刪除用戶** @param id 用戶id*/public void deleteById(Long id) {repository.deleteById(id);}/*** 刪除用戶** @param person*/public void delete(Person person) {repository.delete(person);}}

?

測試添加

@SpringBootTest class JpaApplicationTests {@Autowiredprivate PersonService service;@Testvoid save() {Person person = new Person("SnailClimb", 23);service.save(person);}}

?

條件查詢

單表查詢根據 JPA 提供的語法自定義的

?

帶條件的查詢

?

很多時候我們自定義 sql 語句會非常有用。

根據 name 來查找 Person:

@Query("select p from Person p where p.name = :name")Optional<Person> findByNameCustomeQuery(@Param("name") String name);

Person 部分屬性查詢,避免?select *操作:?

?

@Query("select p.name from Person p where p.id = :id")String?findPersonNameById(@Param("id")?Long?id);

?

當然也是寫在PersonRepository內。

源代碼地址:https://github.com/Mazongdiulejinguzhou/Java

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Spring Boot 正确中使用JPA实战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。