您好,登錄后才能下訂單哦!
SpringBoot
?是為了簡(jiǎn)化?Spring
?應(yīng)用的創(chuàng)建、運(yùn)行、調(diào)試、部署等一系列問(wèn)題而誕生的產(chǎn)物,自動(dòng)裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可以輕易的搭建出一個(gè) WEB 工程
Spring JdbcTemplate
的使用,對(duì)比原始的JDBC
而言,它更加的簡(jiǎn)潔。但隨著表的增加,重復(fù)的CRUD工作讓我們苦不堪言,這時(shí)候Spring Data Jpa
的作用就體現(xiàn)出來(lái)了…..
JPA是Java Persistence API
的簡(jiǎn)稱,中文名Java持久層API,是官方(Sun)在JDK5.0后提出的Java持久化規(guī)范。其目的是為了簡(jiǎn)化現(xiàn)有JAVA EE
和JAVA SE
應(yīng)用開(kāi)發(fā)工作,以及整合現(xiàn)有的ORM技術(shù)實(shí)現(xiàn)規(guī)范統(tǒng)一
JPA的總體思想和現(xiàn)有
Hibernate
、TopLink
、JDO
等ORM框架大體一致??偟膩?lái)說(shuō),JPA包括以下3方面的技術(shù):
JPA只是一種規(guī)范,它需要第三方自行實(shí)現(xiàn)其功能,在眾多框架中Hibernate
是最為強(qiáng)大的一個(gè)。從功能上來(lái)說(shuō),JPA就是Hibernate功能的一個(gè)子集。Hibernate 從3.2開(kāi)始,就開(kāi)始兼容JPA。同時(shí)Hibernate3.2獲得了Sun TCK的JPA(Java Persistence API) 兼容認(rèn)證。
常見(jiàn)的ORM框架中Hibernate
的JPA最為完整,因此Spring Data JPA
?是采用基于JPA規(guī)范的Hibernate
框架基礎(chǔ)下提供了Repository
層的實(shí)現(xiàn)。Spring Data Repository極大地簡(jiǎn)化了實(shí)現(xiàn)各種持久層的數(shù)據(jù)庫(kù)訪問(wèn)而寫(xiě)的樣板代碼量,同時(shí)CrudRepository提供了豐富的CRUD功能去管理實(shí)體類(lèi)。
優(yōu)點(diǎn)
缺點(diǎn)
SpringBoot
簡(jiǎn)化的大量的配置,關(guān)系映射多表查詢配置依舊不容易JdbcTemplate
、Mybatis
等ORM框架,它的性能無(wú)異于是最差的在?pom.xml
?中添加?spring-boot-starter-data-jpa
?的依賴
<!-- Spring JDBC 的依賴包,使用 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 將會(huì)自動(dòng)獲得HikariCP依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MYSQL包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 默認(rèn)就內(nèi)嵌了Tomcat 容器,如需要更換容器也極其簡(jiǎn)單-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 測(cè)試包,當(dāng)我們使用 mvn package 的時(shí)候該包并不會(huì)被打入,因?yàn)樗纳芷谥辉?test 之內(nèi)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
在application.properties
中添加如下配置。值得注意的是,SpringBoot默認(rèn)會(huì)自動(dòng)配置DataSource
,它將優(yōu)先采用HikariCP
連接池,如果沒(méi)有該依賴的情況則選取tomcat-jdbc
,如果前兩者都不可用最后選取Commons DBCP2
。通過(guò)spring.datasource.type屬性可以指定其它種類(lèi)的連接池
spring.datasource.url=jdbc:mysql://localhost:3306/chapter5?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
spring.datasource.password=root
spring.datasource.username=root
#spring.datasource.type
# JPA配置
spring.jpa.hibernate.ddl-auto=update
# 輸出日志
spring.jpa.show-sql=true
# 數(shù)據(jù)庫(kù)類(lèi)型
spring.jpa.database=mysql
ddl-auto 幾種屬性
由于上面我們采用的是spring.jpa.hibernate.ddl-auto=update
方式,因此這里可以跳過(guò)手動(dòng)建表的操作
JPA規(guī)范注解坐落在javax.persistence
包下,@Id注解一定不要引用錯(cuò)了,否則會(huì)報(bào)錯(cuò)。@GeneratedValue(strategy = GenerationType.IDENTITY)自增策略,不需要映射的字段可以通過(guò)@Transient注解排除掉
常見(jiàn)的幾種自增策略
package com.battcn.entity;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import java.io.Serializable;
/**
@since 2018/5/7 0007
*/
@Entity(name = "t_user")
public class User implements Serializable {
private static final long serialVersionUID = 8655851615465363473L;@Id
br/>@Id
private Long id;
private String username;
private String password;
/**
// TODO 省略get set
}
創(chuàng)建UserRepository
數(shù)據(jù)訪問(wèn)層接口,需要繼承JpaRepository<T,K>
,第一個(gè)泛型參數(shù)是實(shí)體對(duì)象的名稱,第二個(gè)是主鍵類(lèi)型。只需要這樣簡(jiǎn)單的配置,該UserRepository
就擁常用的CRUD
功能,JpaRepository
本身就包含了常用功能,剩下的查詢我們按照規(guī)范寫(xiě)接口即可,JPA支持@Query注解寫(xiě)HQL,也支持findAllByUsername這種根據(jù)字段名命名的方式(強(qiáng)烈推薦IntelliJ IDEA對(duì)JPA支持非常NICE)
package com.battcn.repository;
import com.battcn.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* t_user 操作
*
* @author Levin
* @since 2018/5/7 0007
*/
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
/**
* 根據(jù)用戶名查詢用戶信息
*
* @param username 用戶名
* @return 查詢結(jié)果
*/
List<User> findAllByUsername(String username);
}
完成數(shù)據(jù)訪問(wèn)層接口后,最后編寫(xiě)一個(gè)junit
測(cè)試類(lèi)來(lái)檢驗(yàn)代碼的正確性。
下面的幾個(gè)操作中,只有findAllByUsername
是我們自己編寫(xiě)的代碼,其它的都是繼承自JpaRepository
接口中的方法,更關(guān)鍵的是分頁(yè)及排序是如此的簡(jiǎn)單實(shí)例化一個(gè)Pageable
即可…
package com.battcn;
import com.battcn.entity.User;
import com.battcn.repository.UserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
/**
* @author Levin
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter5ApplicationTests {
private static final Logger log = LoggerFactory.getLogger(Chapter5ApplicationTests.class);
@Autowired
private UserRepository userRepository;
@Test
public void test1() throws Exception {
final User user = userRepository.save(new User("u1", "p1"));
log.info("[添加成功] - [{}]", user);
final List<User> u1 = userRepository.findAllByUsername("u1");
log.info("[條件查詢] - [{}]", u1);
Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Order.desc("username")));
final Page<User> users = userRepository.findAll(pageable);
log.info("[分頁(yè)+排序+查詢所有] - [{}]", users.getContent());
userRepository.findById(users.getContent().get(0).getId()).ifPresent(user1 -> log.info("[主鍵查詢] - [{}]", user1));
final User edit = userRepository.save(new User(user.getId(), "修改后的ui", "修改后的p1"));
log.info("[修改成功] - [{}]", edit);
userRepository.deleteById(user.getId());
log.info("[刪除主鍵為 {} 成功] - [{}]", user.getId());
}
}
更多內(nèi)容請(qǐng)參考官方文檔
目前很多大佬都寫(xiě)過(guò)關(guān)于?SpringBoot?的教程了,如有雷同,請(qǐng)多多包涵,本教程基于最新的?spring-boot-starter-parent:2.0.1.RELEASE
編寫(xiě),包括新版本的特性都會(huì)一起介紹…
本文的重點(diǎn)是你有沒(méi)有收獲與成長(zhǎng),其余的都不重要,希望讀者們能謹(jǐn)記這一點(diǎn)。同時(shí)我經(jīng)過(guò)多年的收藏目前也算收集到了一套完整的學(xué)習(xí)資料,包括但不限于:分布式架構(gòu)、高可擴(kuò)展、高性能、高并發(fā)、Jvm性能調(diào)優(yōu)、Spring,MyBatis,Nginx源碼分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨,希望對(duì)想成為架構(gòu)師的朋友有一定的參考和幫助
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。