【Spring Data 系列學(xué)習(xí)】Spring Data JPA 基礎(chǔ)查詢
前面的章節(jié)簡(jiǎn)單講解了 了解 Spring Data JPA 、 Jpa 和 Hibernate ,本章節(jié)開始通過案例上手 Spring boot Jpa 。
spring data
Spring Data 庫的核心接口是 Repository。首先需要定義實(shí)體類的接口,接口必須繼承 repository 并且輸入實(shí)體類型和 ID 類型,如果需要用到 CRUD 方法,可以使用 CrudRepository 來替代 Repository 。除了 CrudRepository 還有 PagingAndSortingRepository、JpaRepository 等。
我們用工具 IntelliJ IDEA,打開類 Repository.class,默認(rèn)快捷鍵 CTRL+H ,如圖顯示:

從上圖我們可以看出繼承關(guān)系,點(diǎn)擊 JpaRepository 打開Navigate→File Structure,或者點(diǎn)擊最左邊的 Structure,可以查看此類的結(jié)構(gòu)以及有哪些方法和繼承類。

-
CrudRepository:基本的 CRUD 方法。 -
PagingAndSortingRepository:繼承CrudRepository,并增加分頁功能。 -
JpaRepository:繼承PagingAndSortingRepository和QueryByExampleExecutor。
快速上手
創(chuàng)建一個(gè) Spring boot 項(xiàng)目,創(chuàng)建項(xiàng)?在 Chapter1項(xiàng)? pom.xml 加入需要使?的依賴,如下所示:
<!-- 引入 jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql 驅(qū)動(dòng) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
配置文件application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
# 打印 sql 語句
spring.jpa.show-sql= true
# 自動(dòng)創(chuàng)建表
spring.jpa.properties.hibernate.hbm2ddl.auto=create
# 默認(rèn)創(chuàng)建的mysql表為 MyISAM 引擎修改為InnoDB問題
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect
spring.jpa.properties.hibernate.hbm2ddl.auto 參數(shù)說明:
- create:每次運(yùn)行會(huì)先刪除對(duì)應(yīng)的表,通過實(shí)體類重新生成表。請(qǐng)勿再生產(chǎn)環(huán)境。
- create-drop:sessionFactory 關(guān)閉時(shí)會(huì)清空表中的數(shù)據(jù)。
- update:運(yùn)行時(shí)如果沒有表會(huì)自動(dòng)創(chuàng)建表,只會(huì)更新表內(nèi)數(shù)據(jù)不會(huì)請(qǐng)空數(shù)據(jù)。(推薦使用)
- validate:運(yùn)行時(shí)驗(yàn)證創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu),只會(huì)和數(shù)據(jù)庫中的表進(jìn)行比較,不會(huì)創(chuàng)建新表,但是會(huì)插入新值。
實(shí)體類映射數(shù)據(jù)庫表
user 實(shí)體類
@Entity
public class User implements Serializable {
private static final long serialVersionUID = -390763540622907853L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
// 省略構(gòu)造器 set/get
}
@Entity 定義對(duì)象將會(huì)成為被JPA管理的實(shí)體,將映射到指定的數(shù)據(jù)庫表。
@Id 定義屬性為數(shù)據(jù)庫的主鍵,一個(gè)實(shí)體里面必須有一個(gè)。
@GeneratedValue(strategy = GenerationType.IDENTITY) 自增長 ID 策略
繼承 CrudRepository
public interface UserCrudRepository extends CrudRepository<User, Long> {
}
CrudRepository<實(shí)體類,主鍵>
CURD 測(cè)試類
路徑:src/test/java/com/mtcarpenter/repository/UserCrudRepositoryTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserCrudRepositoryTest {
/**
* ?志對(duì)象
*/
private Logger logger = LoggerFactory.getLogger(UserCrudRepositoryTest.class);
@Autowired
private UserCrudRepository userCrudRepository;
@Test
public void save() {
logger.info("新增數(shù)據(jù) result = {}", userCrudRepository.save(new User("小米", 9)));
logger.info("新增數(shù)據(jù) result = {}", userCrudRepository.save(new User("張三", 16)));
logger.info("新增數(shù)據(jù) result = {}", userCrudRepository.save(new User("三哥", 12)));
logger.info("新增數(shù)據(jù) result = {}", userCrudRepository.save(new User("米二", 8)));
}
@Test
public void edit() {
logger.info("編輯用戶 result = {}", userCrudRepository.save(new User(3L, "三三", 16)));
}
@Test
public void delete() {
userCrudRepository.deleteById(3L);
}
@Test
public void findById() {
logger.info("通過 id 查詢 result = {}",userCrudRepository.findById(1L));
}
@Test
public void findAll(){
logger.info("查詢所有記錄 result = {}",userCrudRepository.findAll());
}
}
輸出日志:
Hibernate: insert into user (age, name) values (?, ?)
2020-02-29 13:18:36.809 INFO 48452 --- [ main] c.m.c.repository.UserCrudRepositoryTest : 新增數(shù)據(jù) result = User{id=1, name='小米', age=9}
Hibernate: insert into user (age, name) values (?, ?)
2020-02-29 13:18:36.828 INFO 48452 --- [ main] c.m.c.repository.UserCrudRepositoryTest : 新增數(shù)據(jù) result = User{id=2, name='張三', age=16}
Hibernate: insert into user (age, name) values (?, ?)
2020-02-29 13:18:36.848 INFO 48452 --- [ main] c.m.c.repository.UserCrudRepositoryTest : 新增數(shù)據(jù) result = User{id=3, name='三哥', age=12}
Hibernate: insert into user (age, name) values (?, ?)
2020-02-29 13:18:36.861 INFO 48452 --- [ main] c.m.c.repository.UserCrudRepositoryTest : 新增數(shù)據(jù) result = User{id=4, name='米二', age=8}
spring.jpa.show-sql= true 開啟之后會(huì)在控制臺(tái)輸出 SQL 語句,在日常測(cè)試環(huán)境也能提高一定的開發(fā)效率。