摘要:最常用的屬性,第一次加載時(shí)根據(jù)類會(huì)自動(dòng)建立起表的結(jié)構(gòu)前提是先建立好數(shù)據(jù)庫,以后加載時(shí)根據(jù)類自動(dòng)更新表結(jié)構(gòu),即使表結(jié)構(gòu)改變了但表中的行仍然存在不會(huì)刪除以前的行。
添加依賴
新建項(xiàng)目選擇web,JPA,MySQL三個(gè)依賴
對(duì)于已存在的項(xiàng)目可以在bulid.gradle加入,spring boot將會(huì)幫你自動(dòng)配置好
compile("org.springframework.boot:spring-boot-starter-data-jpa") compile("org.springframework.boot:spring-boot-starter-web") runtime("mysql:mysql-connector-java")配置基本信息
然后在src/main/resources/application.properties下添加基本配置
#數(shù)據(jù)庫連接地址 spring.datasource.url=jdbc:mysql://localhost:3306/jpa?useSSL=false #數(shù)據(jù)庫賬號(hào) spring.datasource.username=root #數(shù)據(jù)庫密碼 spring.datasource.password=123456zxc #數(shù)據(jù)庫驅(qū)動(dòng) spring.datasource.driver-class-name=com.mysql.jdbc.Driver #jpa設(shè)置 spring.jpa.hibernate.ddl-auto=create #是否在控制臺(tái)顯示數(shù)據(jù)庫語句 spring.jpa.show-sql=true
spring.jpa.properties.hibernate.hbm2ddl.auto 其作用是:自動(dòng)創(chuàng)建、更新、驗(yàn)證數(shù)據(jù)庫表結(jié)構(gòu)。該參數(shù)的幾種配置如下:
create:每次加載hibernate時(shí)都會(huì)刪除上一次的生成的表,然后根據(jù)你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執(zhí)行,這就是導(dǎo)致數(shù)據(jù)庫表數(shù)據(jù)丟失的一個(gè)重要原因。
create-drop:每次加載hibernate時(shí)根據(jù)model類生成表,但是sessionFactory一關(guān)閉,表就自動(dòng)刪除。
update:最常用的屬性,第一次加載hibernate時(shí)根據(jù)model類會(huì)自動(dòng)建立起表的結(jié)構(gòu)(前提是先建立好數(shù)據(jù)庫),以后加載hibernate時(shí)根據(jù)model類自動(dòng)更新表結(jié)構(gòu),即使表結(jié)構(gòu)改變了但表中的行仍然存在不會(huì)刪除以前的行。要注意的是當(dāng)部署到服務(wù)器后,表結(jié)構(gòu)是不會(huì)被馬上建立起來的,是要等應(yīng)用第一次運(yùn)行起來后才會(huì)。
validate:每次加載hibernate時(shí),驗(yàn)證創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu),只會(huì)和數(shù)據(jù)庫中的表進(jìn)行比較,不會(huì)創(chuàng)建新表,但是會(huì)插入新值。
none:什么都不做
至此基本配置完成
創(chuàng)建實(shí)體創(chuàng)建一個(gè)User實(shí)體,包含id(主鍵)、name(姓名)、age(年齡)屬性,通過ORM框架其會(huì)被映射到數(shù)據(jù)庫表中,由于配置了hibernate.hbm2ddl.auto,在應(yīng)用啟動(dòng)的時(shí)候框架會(huì)自動(dòng)去數(shù)據(jù)庫中創(chuàng)建對(duì)應(yīng)的表。
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity//這是一個(gè)和數(shù)據(jù)庫表相關(guān)聯(lián)的類 public class User { @Id//主鍵 @GeneratedValue//自增長 private Long id;//id @Column(length = 30)//長度30 private String name;//名稱 @Column(nullable = false)//不可空 private Integer age;//年齡 public User() { } public User(String name, Integer age) { this.name = name; this.age = age; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }創(chuàng)建數(shù)據(jù)訪問接口
創(chuàng)建一個(gè)userRepository接口,進(jìn)行數(shù)據(jù)庫操作
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; public interface UserRepository extends JpaRepository單元測(cè)試//JpaRepository<實(shí)體類型,主鍵類型> { // 通過名稱找到用戶 User findByName(String name); // 通過名稱和年齡找到用戶 User findByNameAndAge(String name, Integer age); // 通過名稱模糊查詢 List findByNameLike(String name); // 使用hql查詢 @Query("from User u where u.name=:name")//:name對(duì)應(yīng)@Param里的name User findByHQL(@Param("name") String name); // 使用sql查詢 @Query(value = "select * from user where name = ?1 and age = ?2", nativeQuery = true)//?1表示第一個(gè)參數(shù),?2表示第二個(gè)參數(shù) User findBySQL(String name, Integer age); }
在src/test/java/你的包名/你的項(xiàng)目名ApplicationTests編寫對(duì)應(yīng)的單元測(cè)試來驗(yàn)證編寫的內(nèi)容是否正確
import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class JpaLearnApplicationTests { // 注入userRepository @Autowired private UserRepository userRepository; @Test public void contextLoads() { // 添加10個(gè)測(cè)試用例 userRepository.save(new User("QQQ",1)); userRepository.save(new User("WWW",2)); userRepository.save(new User("EEE",3)); userRepository.save(new User("AAA",4)); userRepository.save(new User("SSS",5)); userRepository.save(new User("DDD",6)); userRepository.save(new User("ZZZ",7)); userRepository.save(new User("XXX",8)); userRepository.save(new User("CCC",9)); userRepository.save(new User("QQQ2",10)); // 測(cè)試findAll, 查詢所有記錄 Assert.assertEquals(10, userRepository.findAll().size()); // 測(cè)試findByName, 查詢姓名為AAA的User Assert.assertEquals(4, userRepository.findByName("AAA").getAge().longValue()); // 測(cè)試findByHQL, 查詢姓名為AAA的User Assert.assertEquals(4, userRepository.findByHQL("AAA").getAge().longValue()); // 測(cè)試findByNameAndAge, 查詢姓名為SSS并且年齡為5的User Assert.assertEquals("SSS", userRepository.findByNameAndAge("SSS", 5).getName()); // 測(cè)試findBySQL, 查詢姓名為SSS并且年齡為5的User Assert.assertEquals("SSS", userRepository.findBySQL("SSS", 5).getName()); // 測(cè)試刪除姓名為AAA的User userRepository.delete(userRepository.findByName("AAA")); // 測(cè)試findAll, 查詢所有記錄, 驗(yàn)證上面的刪除是否成功 Assert.assertEquals(9, userRepository.findAll().size()); // 測(cè)試findAll, 查詢名字有Q的有幾個(gè) Assert.assertEquals(2,userRepository.findByNameLike("%Q%").size()); } }
點(diǎn)擊運(yùn)行測(cè)試用例
源碼地址:https://github.com/LieRabbit/...
原文地址:https://lierabbit.cn/2018/01/...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/68288.html
摘要:前提好幾周沒更新博客了,對(duì)不斷支持我博客的童鞋們說聲抱歉了。熟悉我的人都知道我寫博客的時(shí)間比較早,而且堅(jiān)持的時(shí)間也比較久,一直到現(xiàn)在也是一直保持著更新狀態(tài)。 showImg(https://segmentfault.com/img/remote/1460000014076586?w=1920&h=1080); 前提 好幾周沒更新博客了,對(duì)不斷支持我博客的童鞋們說聲:抱歉了!。自己這段時(shí)...
摘要:文章系列從零入門系列之從零入門系列之程序結(jié)構(gòu)設(shè)計(jì)說明前言本篇文章開始代碼實(shí)踐,系統(tǒng)設(shè)計(jì)從底向上展開,因此本篇先介紹如何實(shí)現(xiàn)數(shù)據(jù)庫表實(shí)體類的設(shè)計(jì)實(shí)現(xiàn)。主鍵由數(shù)據(jù)庫自動(dòng)生成主要是自動(dòng)增長型主鍵由程序控制。 文章系列 【從零入門系列-0】Sprint Boot 之 Hello World 【從零入門系列-1】Sprint Boot 之 程序結(jié)構(gòu)設(shè)計(jì)說明 前言 本篇文章開始代碼實(shí)踐,系統(tǒng)...
摘要:引入了新的環(huán)境和概要信息,是一種更揭秘與實(shí)戰(zhàn)六消息隊(duì)列篇掘金本文,講解如何集成,實(shí)現(xiàn)消息隊(duì)列。博客地址揭秘與實(shí)戰(zhàn)二數(shù)據(jù)緩存篇掘金本文,講解如何集成,實(shí)現(xiàn)緩存。 Spring Boot 揭秘與實(shí)戰(zhàn)(九) 應(yīng)用監(jiān)控篇 - HTTP 健康監(jiān)控 - 掘金Health 信息是從 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...
摘要:入門簡介是一種全新的框架,目的是簡化應(yīng)用的初始搭建和開發(fā)過程,讓開發(fā)者寫更少的配置,程序更快的啟動(dòng)和運(yùn)行,致力于成為快速開發(fā)應(yīng)用領(lǐng)域的領(lǐng)導(dǎo)者。并且可以內(nèi)嵌,這樣我們無需以包的形式部署項(xiàng)目。 SpringBoot入門 SpringBoot簡介 spring boot是一種全新的Java web框架,目的是簡化Spring應(yīng)用的初始搭建和開發(fā)過程,讓開發(fā)者寫更少的配置,程序更快的啟動(dòng)和運(yùn)行...
摘要:的默認(rèn)配置文件位置為。比如,我們需要自定義模塊的服務(wù)端口號(hào),可以在中添加來指定服務(wù)端口為,也可以通過來指定應(yīng)用名該名字在應(yīng)用中會(huì)被注冊(cè)為服務(wù)名。同時(shí),配置內(nèi)容都對(duì)開發(fā)人員可見,本身這也是一種安全隱患。 在快速入門一節(jié)中,我們輕松的實(shí)現(xiàn)了一個(gè)簡單的RESTful API應(yīng)用,體驗(yàn)了一下Spring Boot給我們帶來的諸多優(yōu)點(diǎn),我們用非常少的代碼量就成功的實(shí)現(xiàn)了一個(gè)Web應(yīng)用,這是傳統(tǒng)的...
閱讀 2114·2021-11-05 09:42
閱讀 2858·2021-09-23 11:21
閱讀 2853·2019-08-30 14:00
閱讀 3319·2019-08-30 13:15
閱讀 470·2019-08-29 17:18
閱讀 3558·2019-08-29 16:29
閱讀 2756·2019-08-29 14:06
閱讀 2803·2019-08-23 14:41