SpringBoot 整合JPA

前言

Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化規(guī)范蛛蒙。它為 Java 開(kāi)發(fā)人員提供了一種對(duì)象/關(guān)聯(lián)映射工具來(lái)管理 Java 應(yīng)用中的關(guān)系數(shù)據(jù)箩兽。Spring Boot Jpa 是 Spring 基于 ORM 框架、Jpa 規(guī)范的基礎(chǔ)上封裝的一套 Jpa 應(yīng)用框架缓淹,可使開(kāi)發(fā)者用極簡(jiǎn)的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問(wèn)和操作每币。它提供了包括增刪改查等在內(nèi)的常用功能力麸,且易于擴(kuò)展拐辽!

1、pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.huzh</groupId>
    <artifactId>springboot-jpa</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>springboot-jpa</name>
    <description>springboot-jpa</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--jpa-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2佛吓、配置jpa和數(shù)據(jù)庫(kù)

使用xxx.yml配置(使用xxx.properties也可以)宵晚。此處配置可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)事務(wù)無(wú)法使用,如需使用事務(wù)請(qǐng)參考SpringBoot 使用事務(wù)

spring:
  #數(shù)據(jù)庫(kù)配置
  datasource:
    url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

  ##validate  加載hibernate時(shí)辈毯,驗(yàn)證創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu)
  ##create   每次加載hibernate坝疼,重新創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu),這就是導(dǎo)致數(shù)據(jù)庫(kù)表數(shù)據(jù)丟失的原因谆沃。
  ##create-drop        加載hibernate時(shí)創(chuàng)建钝凶,退出是刪除表結(jié)構(gòu)
  ##update                 加載hibernate自動(dòng)更新數(shù)據(jù)庫(kù)結(jié)構(gòu)
  ##validate 啟動(dòng)時(shí)驗(yàn)證表的結(jié)構(gòu),不會(huì)創(chuàng)建表
  ##none  啟動(dòng)時(shí)不做任何操作
  #jpa配置
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

#端口號(hào)
server:
  port: 8080

3唁影、創(chuàng)建實(shí)體類City

JPA可以自動(dòng)生成表耕陷。

  1. @Entity注解:
    • @Entity必須與@Id注解結(jié)合使用,否則No identifier specified for entity:
    • 其name 屬性:
      (可選)實(shí)體名稱据沈。 缺省為實(shí)體類的非限定名稱哟沫。
      該名稱用于引用查詢中的實(shí)體。
      該名稱不能是Java持久性查詢語(yǔ)言中的保留字面值锌介。
    • 不與@Table結(jié)合的話表名默認(rèn)為SnakeCaseStrategy(命名策略 )為表名
      若使用name屬性且沒(méi)有與@Table結(jié)合嗜诀,則表名為 name值的SnakeCaseStrategy(命名策略 )
  2. 其中@Table常用的兩個(gè)屬性:
    • name 用來(lái)命名 當(dāng)前實(shí)體類 對(duì)應(yīng)的數(shù)據(jù)庫(kù) 表的名字
    • uniqueConstraints 用來(lái)批量命名唯一鍵
      其作用等同于多個(gè):@Column(unique = true)
  3. 主鍵采用uuid生成策略。
@Entity
@Table(name = "city")
public class City {

    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    private String cityId;
    private String cityName;
    private String cityIntroduce;

    public City(String cityId, String cityName, String cityIntroduce) {
        this.cityId = cityId;
        this.cityName = cityName;
        this.cityIntroduce = cityIntroduce;
    }

    public City(String cityName, String cityIntroduce) {
        this.cityName = cityName;
        this.cityIntroduce = cityIntroduce;
    }

    public City() {
    }

    public String getCityId() {
        return cityId;
    }

    public void setCityId(String cityId) {
        this.cityId = cityId;
    }

    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public String getCityIntroduce() {
        return cityIntroduce;
    }

    public void setCityIntroduce(String cityIntroduce) {
        this.cityIntroduce = cityIntroduce;
    }
}

4孔祸、創(chuàng)建DAO

jpa提供基本查詢和復(fù)雜的查詢
基本查詢也分為兩種隆敢,一種是 Spring Data 默認(rèn)已經(jīng)實(shí)現(xiàn),一種是根據(jù)查詢的方法來(lái)自動(dòng)解析成 SQL崔慧。這里用到了自定義的簡(jiǎn)單查詢拂蝎。復(fù)雜查詢有時(shí)間在總結(jié)。

public interface CityRepository extends JpaRepository<City, String> {

    void deleteByCityId(String id);

    City findByCityId(String id);
}

5惶室、創(chuàng)建controller

  1. @Autowired自動(dòng)裝配温自,其作用是為了消除代碼Java代碼里面的getter/setter與bean屬性中的property』食可以用@Resource代替悼泌。
  2. @GetMapping是一個(gè)組合注解,是@RequestMapping(method = RequestMethod.GET)的縮寫(xiě)鹅士。該注解將HTTP Get 映射到 特定的處理方法上券躁。
  3. 刪除方法需加@Transactional,否則報(bào)錯(cuò)
@RestController
public class CityController {
    
    @Autowired
    private CityRepository cityRepository;

    //http://localhost:8080/saveCity?cityName=北京&cityIntroduce=中國(guó)首都
    @GetMapping(value = "saveCity")
    public String saveCity(String cityName, String cityIntroduce) {
        City city = new City(cityName, cityIntroduce);
        cityRepository.save(city);
        return "success";
    }

    //http://localhost:8080/deleteCity?cityId=2
    @GetMapping(value = "deleteCity")
    @Transactional
    public String deleteCity(String cityId) {
        cityRepository.deleteByCityId(cityId);
        return "success";
    }

    //http://localhost:8080/updateCity?cityId=3&cityName=鄭州&cityIntroduce=河南省省會(huì)
    @GetMapping(value = "updateCity")
    public String updateCity(String cityId, String cityName, String cityIntroduce) {
        City city = new City(cityId, cityName, cityIntroduce);
        cityRepository.save(city);
        return "success";
    }

    //http://localhost:8080/getCityById?cityId=3
    @GetMapping(value = "getCityById")
    public City getCityById(String cityId) {
        City city = cityRepository.findByCityId(cityId);
        return city;
    }
}

測(cè)試檢驗(yàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掉盅,一起剝皮案震驚了整個(gè)濱河市也拜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趾痘,老刑警劉巖慢哈,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異永票,居然都是意外死亡卵贱,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門侣集,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)键俱,“玉大人,你說(shuō)我怎么就攤上這事世分”嗾瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵臭埋,是天一觀的道長(zhǎng)踪央。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瓢阴,這世上最難降的妖魔是什么畅蹂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮荣恐,結(jié)果婚禮上液斜,老公的妹妹穿的比我還像新娘。我一直安慰自己叠穆,他們只是感情好少漆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著痹束,像睡著了一般检疫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祷嘶,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天屎媳,我揣著相機(jī)與錄音,去河邊找鬼论巍。 笑死烛谊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嘉汰。 我是一名探鬼主播丹禀,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了双泪?” 一聲冷哼從身側(cè)響起持搜,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焙矛,沒(méi)想到半個(gè)月后葫盼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡村斟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年贫导,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟆盹。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孩灯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逾滥,到底是詐尸還是另有隱情峰档,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布匣距,位于F島的核電站面哥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏毅待。R本人自食惡果不足惜尚卫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尸红。 院中可真熱鬧吱涉,春花似錦、人聲如沸外里。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盅蝗。三九已至鳖链,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間墩莫,已是汗流浹背芙委。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狂秦,地道東北人灌侣。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像裂问,于是被迫代替她去往敵國(guó)和親侧啼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牛柒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354