您好,登錄后才能下訂單哦!
什么是JPA
JPA(Java Persistence API)是Sun官方提出的Java持久化規(guī)范。它為Java開發(fā)人員提供了一種對(duì)象/關(guān)聯(lián)映射工具來(lái)管理Java應(yīng)用中的關(guān)系數(shù)據(jù)。他的出現(xiàn)主要是為了簡(jiǎn)化現(xiàn)有的持久化開發(fā)工作和整合ORM技術(shù)
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 規(guī)范的基礎(chǔ)上封裝的一套JPA應(yīng)用框架,可使開發(fā)者用極簡(jiǎn)的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問(wèn)和操作。它提供了包括增刪改查等在內(nèi)的常用功能,且易于擴(kuò)展!學(xué)習(xí)并使用 Spring Data JPA 可以極大提高開發(fā)效率!
Spring Boot中使用JdbcTemplate訪問(wèn)數(shù)據(jù)庫(kù)
數(shù)據(jù)源配置
首先,為了連接數(shù)據(jù)庫(kù)需要引入jdbc支持,在pom.xml中引入如下配置
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
嵌入式數(shù)據(jù)庫(kù)支持
嵌入式數(shù)據(jù)庫(kù)通常用于開發(fā)和測(cè)試環(huán)境。Spring-Boot提供自動(dòng)配置的嵌入式數(shù)據(jù)庫(kù)有H2、HSQL、Derby,你不需要提供任何連接配置就能使用。
如h3的依賴
<dependency> <groupId>com.h3database</groupId> <artifactId>h3</artifactId> <scope>runtime</scope> </dependency>
mysql數(shù)據(jù)庫(kù)支持
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency>
編輯配置信息
在 src/main/resources/application.properties 中配置數(shù)據(jù)源信息
spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver
使用JdbcTemplate操作數(shù)據(jù)庫(kù)
Spring的JdbcTemplate是自動(dòng)配置的,你可以直接使用@Autowired來(lái)注入到你自己的bean中來(lái)使用。
通過(guò)JdbcTemplate實(shí)現(xiàn)DemoService中定義的數(shù)據(jù)訪問(wèn)操作
@Service public class DemoSerivce { @Autowired private JdbcTemplate jdbcTemplate; public void create(String name, Integer age) { jdbcTemplate.update("insert into DEMO(NAME, AGE) values(?, ?)", name, age); } public void deleteByName(String name) { jdbcTemplate.update("delete from DEMOwhere NAME = ?", name); } public Integer getAllDemo() { return jdbcTemplate.queryForObject("select count(1) from DEMO", Integer.class); } public void deleteAllDemo() { jdbcTemplate.update("delete from DEMO"); } }
創(chuàng)建對(duì)UserService的單元測(cè)試用例,通過(guò)創(chuàng)建、刪除和查詢來(lái)驗(yàn)證數(shù)據(jù)庫(kù)操作的正確性。
測(cè)試用例要增加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
測(cè)試代碼
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(Main.class) public class ApplicationTests { @Autowired private DemoSerivce demoSerivce; @Before public void setUp() { // 準(zhǔn)備,清空表 demoSerivce.deleteAllDemo(); } @Test public void test() throws Exception { // 插入5個(gè) demoSerivce.create("a", 1); demoSerivce.create("b", 2); demoSerivce.create("c", 3); demoSerivce.create("d", 4); demoSerivce.create("e", 5); Assert.assertEquals(5, demoSerivce.getAllDemo().intValue()); demoSerivce.deleteByName("a"); demoSerivce.deleteByName("e"); // 查數(shù)據(jù)庫(kù),應(yīng)該有5個(gè) Assert.assertEquals(3, demoSerivce.getAllDemo().intValue()); } }
Spring Boot中使用Spring-data-jpa
為了解決這些大量枯燥的數(shù)據(jù)操作語(yǔ)句,我們第一個(gè)想到的是使用ORM框架,比如:Hibernate。通過(guò)整合Hibernate之后,我們以操作Java實(shí)體的方式最終將數(shù)據(jù)改變映射到數(shù)據(jù)庫(kù)表中。
為了解決抽象各個(gè)Java實(shí)體基本的“增刪改查”操作,我們通常會(huì)以泛型的方式封裝一個(gè)模板Dao來(lái)進(jìn)行抽象簡(jiǎn)化,但是這樣依然不是很方便,我們需要針對(duì)每個(gè)實(shí)體編寫一個(gè)繼承自泛型模板Dao的接口,再編寫該接口的實(shí)現(xiàn)。雖然一些基礎(chǔ)的數(shù)據(jù)訪問(wèn)已經(jīng)可以得到很好的復(fù)用,但是在代碼結(jié)構(gòu)上針對(duì)每個(gè)實(shí)體都會(huì)有一堆Dao的接口和實(shí)現(xiàn)。
由于模板Dao的實(shí)現(xiàn),使得這些具體實(shí)體的Dao層已經(jīng)變的非?!氨 ?,有一些具體實(shí)體的Dao實(shí)現(xiàn)可能完全就是對(duì)模板Dao的簡(jiǎn)單代理,并且往往這樣的實(shí)現(xiàn)類可能會(huì)出現(xiàn)在很多實(shí)體上。Spring-data-jpa的出現(xiàn)正可以讓這樣一個(gè)已經(jīng)很“薄”的數(shù)據(jù)訪問(wèn)層變成只是一層接口的編寫方式。
使用方法
添加依賴
<dependency <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
編輯配置信息
在 src/main/resources/application.properties 中配置數(shù)據(jù)源信息
spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置屬性,其主要作用是:自動(dòng)創(chuàng)建、更新、驗(yàn)證數(shù)據(jù)庫(kù)表結(jié)構(gòu)。該參數(shù)的幾種配置如下
創(chuàng)建實(shí)體
@Entity public class DemoEntity { @Id @GeneratedValue private long id; private String title; private String content; public DemoEntity() { } public DemoEntity(String title, String content) { this.title = title; this.content = content; } // get set 略 }
創(chuàng)建DAO
public interface DemoRepository extends JpaRepository<DemoEntity, Long> { DemoEntity findByTitle(String title); DemoEntity findByTitleAndContent(String title, String content); // @Query("select u from DemoEntity u where u.content=:content") @Query("from DemoEntity u where u.content=:content") DemoEntity sqlFind(@Param("content") String content); }
sql中不要寫表名,要寫實(shí)體名,他會(huì)自動(dòng)轉(zhuǎn)化為表名的。
通過(guò)解析方法名創(chuàng)建查詢
上面 findByTitle(String title) 與 findByTitleAndContent(String title, String content) ,沒(méi)有寫sql,但框架會(huì)自動(dòng)按名字對(duì)上面的方對(duì)創(chuàng)建sql。
單元測(cè)試
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(Main.class) public class UnitTest { @Autowired DemoRepository demoRepository; @Test public void test() { for(int i=0;i<10;i++) { demoRepository.save(new DemoEntity("title"+i, "content"+i)); } Assert.assertEquals(10, demoRepository.findAll().size()); } @Test public void testfindbytitle() { DemoEntity res = demoRepository.findByTitle("title8"); Assert.assertEquals("title8", res.getTitle()); } @Test public void testfindbytitleandcontent() { DemoEntity res = demoRepository.findByTitleAndContent("title9", "content9"); Assert.assertEquals("title9", res.getTitle()); Assert.assertEquals("content9", res.getContent()); } @Test public void testsqlFind() { DemoEntity res = demoRepository.sqlFind("content7"); Assert.assertEquals("content7", res.getContent()); } }
總結(jié)
以上所述是小編給大家介紹的Spring boot中使用Spring-data-jpa方便快捷的訪問(wèn)數(shù)據(jù)庫(kù),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!
免責(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)容。