<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • 深入淺析JPA在SpringBoot中的使用方法

            深入淺析JPA在Spring Boot中的使用方法?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

            目前創(chuàng)新互聯(lián)建站已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、鞍山網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

            什么是JPA

            一說JavaWeb,很多小伙伴都知道SSH,這個(gè)H代表的就是hibernate框架,這個(gè)小伙伴們都知道,可是什么又是JPA呢?相信許多剛?cè)腴T的小伙伴聽說過但不是特別清楚,首先JPA的全稱叫做Java Persistence API,JPA是一個(gè)基于O/R映射的標(biāo)準(zhǔn)規(guī)范,在這個(gè)規(guī)范中,JPA只定義標(biāo)準(zhǔn)規(guī)則,不提供實(shí)現(xiàn),使用者則需要按照規(guī)范中定義的方式來使用。目前JPA的主要實(shí)現(xiàn)有Hibernate、EclipseLink、OpenJPA等,事實(shí)上,由于Hibernate在數(shù)據(jù)訪問解決技術(shù)領(lǐng)域的絕對(duì)霸主地位,JPA的標(biāo)準(zhǔn)基本是由Hibernate來主導(dǎo)的。雖然做開發(fā)的小伙伴不怎么喜歡度娘,不過度娘關(guān)于JPA的介紹個(gè)人覺得倒是比較清晰,有興趣的小伙伴可前去了解下。另外,Spring框架為我們提供了Spring Data JPA這樣一個(gè)東東,可以減少我們使用JPA時(shí)的代碼量。

            使用流程

            創(chuàng)建工程并添加相關(guān)依賴

            在Spring Boot中使用JPA,我們?cè)趧?chuàng)建工程的時(shí)候需要選擇JPA依賴,如下:

            深入淺析JPA在Spring Boot中的使用方法

            其他的步驟和我們創(chuàng)建一個(gè)普通的Spring Boot項(xiàng)目是一樣的

            項(xiàng)目創(chuàng)建成功之后,我這里是使用MySQL做演示,因此還需要添加MySql驅(qū)動(dòng),在pom.xml文件中添加如下依賴:

                <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
                  <version>5.1.40</version>
                </dependency>

            配置基本屬性

            接下來需要我們?cè)赼pplication.properties中配置數(shù)據(jù)源和jpa的基本的相關(guān)屬性,如下:

            spring.datasource.driver-class-name=com.mysql.jdbc.Driver
            spring.datasource.url=jdbc:mysql://localhost:3306/jpatest
            spring.datasource.username=root
            spring.datasource.password=123456
            
            spring.jpa.hibernate.ddl-auto=update
            spring.jpa.show-sql=true
            spring.jackson.serialization.indent_output=true

            關(guān)于這里的配置我說如下幾點(diǎn):

            1.第一行表示驅(qū)動(dòng)的名稱,這個(gè)和具體的數(shù)據(jù)庫驅(qū)動(dòng)有關(guān),視情況而定,我這里使用了MySql數(shù)據(jù)庫,所以驅(qū)動(dòng)名為com.mysql.jdbc.Driver

            2.第二行表示數(shù)據(jù)庫連接地址,當(dāng)然也是視情況而定

            3.第三四行表示數(shù)據(jù)庫連接的用戶名和密碼

            4.第五行則配置了實(shí)體類維護(hù)數(shù)據(jù)庫表結(jié)構(gòu)的具體行為,update表示當(dāng)實(shí)體類的屬性發(fā)生變化時(shí),表結(jié)構(gòu)跟著更新,這里我們也可以取值create,這個(gè)create表示啟動(dòng)的時(shí)候刪除上一次生成的表,并根據(jù)實(shí)體類重新生成表,這個(gè)時(shí)候之前表中的數(shù)據(jù)就會(huì)被清空;還可以取值create-drop,這個(gè)表示啟動(dòng)時(shí)根據(jù)實(shí)體類生成表,但是當(dāng)sessionFactory關(guān)閉的時(shí)候表會(huì)被刪除;validate表示啟動(dòng)時(shí)驗(yàn)證實(shí)體類和數(shù)據(jù)表是否一致;none表示啥都不做。

            5.第六行表示hibernate在操作的時(shí)候在控制臺(tái)打印真實(shí)的sql語句

            6.第七行表示格式化輸出的json字符串

            OK,以上就是我們?cè)赼pplication.properties中對(duì)JPA進(jìn)行的一個(gè)簡單配置。

            定義映射實(shí)體類

            接下來,定義相應(yīng)的實(shí)體類,在Project啟動(dòng)時(shí),系統(tǒng)會(huì)根據(jù)實(shí)體類創(chuàng)建相應(yīng)的數(shù)據(jù)表,我的實(shí)體類如下:

            @Entity
            @NamedQuery(name = "Person.withNameAndAddressNamedQuery",
                query = "select p from Person p where p.name=&#63;1 and p.address=&#63;2")
            public class Person {
              @Id
              @GeneratedValue
              private Long id;
              private String name;
              private Integer age;
              private String address;
            
              public Person() {
              }
            
              public Person(Long id, String name, Integer age, String address) {
                this.id = id;
                this.name = name;
                this.age = age;
                this.address = address;
              }
            
              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;
              }
            
              public String getAddress() {
                return address;
              }
            
              public void setAddress(String address) {
                this.address = address;
              }
            }

            首先在實(shí)體類上我們使用了@Entity注解,這個(gè)表示這是一個(gè)和數(shù)據(jù)庫表映射的實(shí)體類,在屬性id上我們添加了@Id注解,表示該字段是一個(gè)id,@GeneratedValue注解則表示該字段自增。@NamedQuery注解表示一個(gè)NamedQuery查詢,這里一個(gè)名稱代表一個(gè)查詢語句,我們一會(huì)可以在控制器中直接調(diào)用@NamedQuery中的withNameAndAddressNamedQuery方法,該方法代表的查詢語句是select p from Person p where p.name=&#63;1 and p.address=&#63;2。

            定義數(shù)據(jù)訪問接口

            OK,做好上面幾個(gè)步驟之后,接下來我們就可以定義數(shù)據(jù)訪問接口了,我們的數(shù)據(jù)訪問接口需要繼承JpaRepository類,我在數(shù)據(jù)訪問接口中一共定義了四個(gè)方法,如下:

            public interface PersonRepository extends JpaRepository<Person, Long> {
              List<Person> findByAddress(String name);
            
              Person findByNameAndAddress(String name, String address);
            
              @Query("select p from Person p where p.name=:name and p.address=:address")
              Person withNameAndAddressQuery(@Param("name") String name, @Param("address") String address);
            
              Person withNameAndAddressNamedQuery(String name, String address);
            
            }

            關(guān)于這個(gè)數(shù)據(jù)訪問接口,我說如下幾點(diǎn):

            1.當(dāng)我們繼承JpaRepository接口后,我們就自動(dòng)具備了如下數(shù)據(jù)訪問方法:

            List<T> findAll();
            List<T> findAll(Sort var1);
            List<T> findAll(Iterable<ID> var1);
            <S extends T> List<S> save(Iterable<S> var1);
            void flush();
            <S extends T> S saveAndFlush(S var1);
            void deleteInBatch(Iterable<T> var1);
            void deleteAllInBatch();
            T getOne(ID var1);
            <S extends T> List<S> findAll(Example<S> var1);
            <S extends T> List<S> findAll(Example<S> var1, Sort var2);

            2.我們可以在接口中定義查詢方法,可以按照屬性名來查詢,但是方法的命名方式是固定的,比如第一個(gè)方法和第二個(gè)方法,第一個(gè)方法表示根據(jù)一個(gè)屬性查詢,第二個(gè)方法表示根據(jù)多個(gè)屬性查詢,findBy、And等可以算作是這里的查詢關(guān)鍵字了,如果寫作其他名稱則系統(tǒng)不能識(shí)別,類似的關(guān)鍵字還有Like、Or、Is、Equals、Between等,而這里的findBy關(guān)鍵字又可以被find、read、readBy、query、queryBy、get、getBy等來代替。

            3.在查詢的過程中我們也可以限制查詢結(jié)果,這里使用的關(guān)鍵字是top、first等,比如查詢前10條數(shù)據(jù)我們可以寫作:
            List<Person> findFirst10ByName(String name);

            4.使用NamedQuery來查詢,就是我們直接在實(shí)體類上使用@NamedQuery注解來定義查詢方法和方法名,一個(gè)名稱對(duì)應(yīng)一個(gè)查詢語句,具體可以參考我們上文的實(shí)體類

            5.我們也可以向第三個(gè)方法那樣添加@Query注解,當(dāng)我調(diào)用這個(gè)方法的時(shí)候使用這個(gè)注解中的sql語句進(jìn)行查詢,方法的參數(shù)則是注解中的占位符的值。

            編寫測試Controller

            數(shù)據(jù)訪問接口都有了,接下來就是一個(gè)Controller了,我們寫一個(gè)簡單的Controller,用來測試一下上文中的數(shù)據(jù)訪問接口是否正確,如下:

            @RestController
            public class DataController {
              @Autowired
              PersonRepository personRepository;
            
              @RequestMapping("/save")
              public Person save(String name,String address,Integer age) {
                Person person = personRepository.save(new Person(null, name, age, address));
                return person;
              }
            
              @RequestMapping("/q1")
              public List<Person> q1(String address) {
                List<Person> people = personRepository.findByAddress(address);
                return people;
              }
            
              @RequestMapping("/q2")
              public Person q2(String name, String address) {
                Person people = personRepository.findByNameAndAddress(name, address);
                return people;
              }
            
              @RequestMapping("/q3")
              public Person q3(String name, String address) {
                Person person = personRepository.withNameAndAddressQuery(name, address);
                return person;
              }
            
              @RequestMapping("/q4")
              public Person q4(String name, String address) {
                Person person = personRepository.withNameAndAddressNamedQuery(name, address);
                return person;
              }
              @RequestMapping("/sort")
              public List<Person> sort() {
                List<Person> people = personRepository.findAll(new Sort(Sort.Direction.ASC, "age"));
                return people;
              }
              @RequestMapping("/page")
              public Page<Person> page(int page,int size){
                Page<Person> all = personRepository.findAll(new PageRequest(page, size));
                return all;
              }
              @RequestMapping("/all")
              public List<Person> all(){
                return personRepository.findAll();
              }
            }

            關(guān)于深入淺析JPA在Spring Boot中的使用方法問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

            本文題目:深入淺析JPA在SpringBoot中的使用方法
            URL分享:http://www.jbt999.com/article36/pdjhsg.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、網(wǎng)站設(shè)計(jì)、用戶體驗(yàn)、關(guān)鍵詞優(yōu)化、品牌網(wǎng)站建設(shè)軟件開發(fā)

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

            成都網(wǎng)站建設(shè)

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 精品国产免费污污网站 | 无码高清视频, | 变态重口变态级无码AV | 久久一道本色 | 亚洲狼人综合网 |