定義
JPA是Java Persistence API的簡稱更振,中文名Java持久層API,是JDK 5.0注解或XML描述對象-關(guān)系表的映射關(guān)系斯嚎,并將運(yùn)行期的實(shí)體對象持久化到數(shù)據(jù)庫中利虫。
JPA的總體思想和現(xiàn)有Hibernate、TopLink堡僻、JDO等ORM框架大體一致糠惫。總的來說钉疫,JPA包括以下3方面的技術(shù):
1.ORM映射元數(shù)據(jù)
JPA支持XML和JDK注解兩種元數(shù)據(jù)的形式硼讽,元數(shù)據(jù)描述對象和表之間的映射關(guān)系,框架據(jù)此將實(shí)體對象持久化到數(shù)據(jù)庫表中陌选;
2.API
用來操作實(shí)體對象理郑,執(zhí)行CRUD操作蹄溉,框架在后臺替代我們完成所有的事情咨油,開發(fā)者從繁瑣的JDBC和SQL代碼中解脫出來。
3.查詢語言
這是持久化操作中很重要的一個方面柒爵,通過面向?qū)ο蠖敲嫦驍?shù)據(jù)庫的查詢語言查詢數(shù)據(jù)役电,避免程序的SQL語句緊密耦合。
Spring-data-JPA的MAVEN
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
數(shù)據(jù)庫和JPA配置
SpringBoot默認(rèn)是使用tomcat的數(shù)據(jù)源
intellij有自動提示棉胀,spring.datasource.tomcat開頭的配置)
application.properties:
###數(shù)據(jù)庫配置信息
############################
##基礎(chǔ)信息
spring.datasource.url=jdbc:mysql://localhost:3306/db_jianshu? useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
##連接池中最大的活躍連接數(shù)
spring.datasource.tomcat.max-active=20
##連接池中最大法瑟、最小的空閑連接數(shù)
spring.datasoure.max-idle=8
spring.datasoure.min-idle=8
##初始化連接數(shù)
spring.datasoure.initial=10
###Spring Data JPA配置信息
############################
spring.jpa.database=mysql
# 顯示SQL語句
spring.jpa.show-sql=true
##指定DDL mode (none, validate, update, create, create-drop)
spring.jpa.properties.hibernate.hbm2ddl.auto=update
##頁面屬性配置
spring.thymeleaf.cache=false
Entity配置
這里使用了Lombok簡化代碼加入了@Data注解
@Entity
@Data
@Builder
public class SysUser {
@Id
@GeneratedValue
private Integer userId;
@Column(nullable = false)
private String email;
@Column(nullable = false)
private String password;
private String nickname;
private String avatar;
private String description;
private Integer wordsCount;
private Integer likeCount;
}
強(qiáng)大的Spring JpaRepository
SpringBoot創(chuàng)建DAO層很多種方法其中japrepository是最強(qiáng)大的而且最有特色的一種,我們可以針對不同的實(shí)體創(chuàng)建repository接口唁奢。Spring會根據(jù)方法名稱的規(guī)則進(jìn)行自動生成實(shí)現(xiàn)霎挟。在SpringBoot中默認(rèn)已經(jīng)提供了非常多的常規(guī)CRUD操作的repository。
package org.springframework.data.jpa.repository;
import java.util.List;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;
@NoRepositoryBean
public 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);
}
使用
package com.soft1611.jianshu.dao;
import com.soft1611.jianshu.entity.SysUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface UserRepositry extends JpaRepository<User, Integer> {
/**
* 根據(jù)郵箱查找用戶
* @param email
* @return
*/
User findUserByEmail(String email);
* 查詢用戶名稱包含username字符串的用戶對象
* @param username
* @return
*/
List<User> findByUsernameContaining(String username);
/**
* 獲得單個用戶對象麻掸,根據(jù)username和pwd的字段匹配
* @param username
*@param pwd
* @return
*/
User getByUsernameIsAndUserpwdIs(String username,String pwd);
/**
* 精確匹配username的用戶對象
* @param username
* @return
*/
User getByUsernameIs(String username)
}
Spring提供了非常大的自由度給開發(fā)者酥夭,我們可以在接口方法中通過定義@Query annotation自定義接口方法的JPQL語句。
public interface UserRepositry extends JpaRepository<User, Integer> {
/**
* 根據(jù)熱度降序排列
* JPQL語句
* @return
*/
@Query("FROM SysUser u ORDER BY u.likeCount DESC ")
List<SysUser> findHotUsers();
}
public interface WeiboRepository extends JpaRepository<Weibo,Long>,JpaSpecificationExecutor<Weibo> {
@Query("select w from Weibo w where w.user.username = :username")
List<Weibo> searchUserWeibo(@Param("username") String username);
@Query("select w from Weibo w where w.user.username = :username")
List<Weibo> searchUserWeibo(@Param("username") String username, Sort sort);
@Modifying
@Transactional(readOnly = false)
@Query("update Weibo w set w.weiboText = :text where w.user = :user")
int setUserWeiboContent(@Param("text")String weiboText,@Param("user")User user);
}
/**
*事務(wù)注解
*/
@Transactional(readOnly = false)