【Spring Data 系列學(xué)習(xí)】Spring Data JPA 基礎(chǔ)查詢

【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 ,如圖顯示:

image-20200228154704224

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

image-20200228155457866
  • CrudRepository:基本的 CRUD 方法。
  • PagingAndSortingRepository:繼承 CrudRepository,并增加分頁功能。
  • JpaRepository :繼承 PagingAndSortingRepositoryQueryByExampleExecutor。

快速上手

創(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ā)效率。

示例代碼-github

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容