宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見(jiàn)問(wèn)題
產(chǎn)品動(dòng)態(tài)
精選推薦

使用Spring Data JPA訪問(wèn)MySQL

管理 管理 編輯 刪除

在實(shí)際開(kāi)發(fā)過(guò)程中,對(duì)數(shù)據(jù)庫(kù)的操作大多可以歸結(jié)為:“增刪改查”。就最為普遍的單表操作而言,除了表和字段不同外,語(yǔ)句幾乎都是類似的,開(kāi)發(fā)人員需要寫(xiě)大量類似而枯燥的語(yǔ)句來(lái)完成業(yè)務(wù)邏輯。

為了解決這些大量枯燥的數(shù)據(jù)操作語(yǔ)句,誕生了非常多的優(yōu)秀框架,比如:Hibernate。通過(guò)整合Hibernate,我們能夠以操作Java實(shí)體的方式來(lái)完成對(duì)數(shù)據(jù)的操作,通過(guò)框架的幫助,對(duì)Java實(shí)體的變更最終將自動(dòng)地映射到數(shù)據(jù)庫(kù)表中。

在Hibernate的幫助下,Java實(shí)體映射到數(shù)據(jù)庫(kù)表數(shù)據(jù)完成之后,再進(jìn)一步解決抽象各個(gè)Java實(shí)體基本的“增刪改查”操作,我們通常會(huì)以泛型的方式封裝一個(gè)模板Dao來(lái)進(jìn)行抽象簡(jiǎn)化,但是這樣依然不是很方便,我們需要針對(duì)每個(gè)實(shí)體編寫(xiě)一個(gè)繼承自泛型模板Dao的接口,再編寫(xiě)該接口的實(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)變的非?!氨 保幸恍┚唧w實(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)層變成只是一層接口的編寫(xiě)方式。比如,下面的例子:

public interface UserRepository extends JpaRepository {

    User findByName(String name);

    @Query("from User u where u.name=:name")
    User findUser(@Param("name") String name);

}

我們只需要通過(guò)編寫(xiě)一個(gè)繼承自JpaRepository的接口就能完成數(shù)據(jù)訪問(wèn),下面以一個(gè)具體實(shí)例來(lái)體驗(yàn)Spring Data JPA給我們帶來(lái)的強(qiáng)大功能。

使用步驟

由于Spring Data JPA依賴于Hibernate。如果您對(duì)Hibernate有一定了解,下面內(nèi)容可以毫不費(fèi)力的看懂并上手使用它。如果您還是Hibernate新手,可以先按如下方式來(lái)試試看。

工程配置

pom.xml中添加相關(guān)依賴,加入以下內(nèi)容:


    org.springframework.boot
    spring-boot-starter-data-jpa

application.xml中配置:數(shù)據(jù)庫(kù)連接信息(如使用嵌入式數(shù)據(jù)庫(kù)則不需要)、自動(dòng)創(chuàng)建表結(jié)構(gòu)的設(shè)置,例如使用mysql的情況如下:

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop

spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置屬性,其主要作用是:自動(dòng)創(chuàng)建、更新、驗(yàn)證數(shù)據(jù)庫(kù)表結(jié)構(gòu)。該參數(shù)的幾種配置如下:

  • create:每次加載hibernate時(shí)都會(huì)刪除上一次的生成的表,然后根據(jù)你的model類再重新來(lái)生成新表,哪怕兩次沒(méi)有任何改變也要這樣執(zhí)行,這就是導(dǎo)致數(shù)據(jù)庫(kù)表數(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ù)庫(kù)),以后加載hibernate時(shí)根據(jù)model類自動(dòng)更新表結(jié)構(gòu),即使表結(jié)構(gòu)改變了但表中的行仍然存在不會(huì)刪除以前的行。要注意的是當(dāng)部署到服務(wù)器后,表結(jié)構(gòu)是不會(huì)被馬上建立起來(lái)的,是要等應(yīng)用第一次運(yùn)行起來(lái)后才會(huì)。
  • validate:每次加載hibernate時(shí),驗(yàn)證創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu),只會(huì)和數(shù)據(jù)庫(kù)中的表進(jìn)行比較,不會(huì)創(chuàng)建新表,但是會(huì)插入新值。

至此已經(jīng)完成基礎(chǔ)配置,如果您有在Spring下整合使用過(guò)它的話,相信你已經(jīng)感受到Spring Boot的便利之處:JPA的傳統(tǒng)配置在persistence.xml文件中,但是這里我們不需要。

創(chuàng)建實(shí)體

創(chuàng)建一個(gè)User實(shí)體,包含id(主鍵)、name(姓名)、age(年齡)屬性,通過(guò)ORM框架其會(huì)被映射到數(shù)據(jù)庫(kù)表中,由于配置了hibernate.hbm2ddl.auto,在應(yīng)用啟動(dòng)的時(shí)候框架會(huì)自動(dòng)去數(shù)據(jù)庫(kù)中創(chuàng)建對(duì)應(yīng)的表。

@Entity
@Data
@NoArgsConstructor
public class User {

    @Id
    @GeneratedValue
    private Long id;

    private String name;
    private Integer age;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}
  • @Entity注解標(biāo)識(shí)了User類是一個(gè)持久化的實(shí)體
  • @Data@NoArgsConstructor是Lombok中的注解。用來(lái)自動(dòng)生成各參數(shù)的Set、Get函數(shù)以及不帶參數(shù)的構(gòu)造函數(shù)。
  • @Id@GeneratedValue用來(lái)標(biāo)識(shí)User對(duì)應(yīng)對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的主鍵

注意:除了這些注解之外,還有很多用來(lái)精細(xì)化配置映射關(guān)系的注解,這里不做具體介紹,大家可自行閱讀Hibernate的文檔來(lái)學(xué)習(xí)這些注解的詳細(xì)使用方法。

創(chuàng)建數(shù)據(jù)訪問(wèn)接口

下面針對(duì)User實(shí)體創(chuàng)建對(duì)應(yīng)的Repository接口實(shí)現(xiàn)對(duì)該實(shí)體的數(shù)據(jù)訪問(wèn),如下代碼:

public interface UserRepository extends JpaRepository {

    User findByName(String name);

    User findByNameAndAge(String name, Integer age);

    @Query("from User u where u.name=:name")
    User findUser(@Param("name") String name);

}

在Spring Data JPA中,只需要編寫(xiě)類似上面這樣的接口就可實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)。不再像我們以往編寫(xiě)了接口時(shí)候還需要自己編寫(xiě)接口實(shí)現(xiàn)類,直接減少了我們的文件清單。

下面對(duì)上面的UserRepository做一些解釋,該接口繼承自JpaRepository,通過(guò)查看JpaRepository接口的API文檔,可以看到該接口本身已經(jīng)實(shí)現(xiàn)了創(chuàng)建(save)、更新(save)、刪除(delete)、查詢(findAll、findOne)等基本操作的函數(shù),因此對(duì)于這些基礎(chǔ)操作的數(shù)據(jù)訪問(wèn)就不需要開(kāi)發(fā)者再自己定義。

在上例中,我們可以看到下面兩個(gè)函數(shù):

  • User findByName(String name)
  • User findByNameAndAge(String name, Integer age)

它們分別實(shí)現(xiàn)了按name查詢User實(shí)體和按name和age查詢User實(shí)體,可以看到我們這里沒(méi)有任何類SQL語(yǔ)句就完成了兩個(gè)條件查詢方法。這就是Spring-data-jpa的一大特性:通過(guò)解析方法名創(chuàng)建查詢。

除了通過(guò)解析方法名來(lái)創(chuàng)建查詢外,它也提供通過(guò)使用@Query 注解來(lái)創(chuàng)建查詢,您只需要編寫(xiě)JPQL語(yǔ)句,并通過(guò)類似“:name”來(lái)映射@Param指定的參數(shù),就像例子中的第三個(gè)findUser函數(shù)一樣。

單元測(cè)試

在完成了上面的數(shù)據(jù)訪問(wèn)接口之后,按照慣例就是編寫(xiě)對(duì)應(yīng)的單元測(cè)試來(lái)驗(yàn)證編寫(xiě)的內(nèi)容是否正確。這里就不多做介紹,主要通過(guò)數(shù)據(jù)操作和查詢來(lái)反復(fù)驗(yàn)證操作的正確性。

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void test() throws Exception {

        // 創(chuàng)建10條記錄
        userRepository.save(new User("AAA", 10));
        userRepository.save(new User("BBB", 20));
        userRepository.save(new User("CCC", 30));
        userRepository.save(new User("DDD", 40));
        userRepository.save(new User("EEE", 50));
        userRepository.save(new User("FFF", 60));
        userRepository.save(new User("GGG", 70));
        userRepository.save(new User("HHH", 80));
        userRepository.save(new User("III", 90));
        userRepository.save(new User("JJJ", 100));

        // 測(cè)試findAll, 查詢所有記錄
        Assert.assertEquals(10, userRepository.findAll().size());

        // 測(cè)試findByName, 查詢姓名為FFF的User
        Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue());

        // 測(cè)試findUser, 查詢姓名為FFF的User
        Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue());

        // 測(cè)試findByNameAndAge, 查詢姓名為FFF并且年齡為60的User
        Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName());

        // 測(cè)試刪除姓名為AAA的User
        userRepository.delete(userRepository.findByName("AAA"));

        // 測(cè)試findAll, 查詢所有記錄, 驗(yàn)證上面的刪除是否成功
        Assert.assertEquals(9, userRepository.findAll().size());

    }
}

關(guān)于Spring Data

Spring Data JPA在Spring家族中實(shí)際上是一個(gè)二級(jí)項(xiàng)目,它隸屬于Spring Data這個(gè)頂級(jí)項(xiàng)目。我們們可以看一下關(guān)于這個(gè)項(xiàng)目的介紹,它除了涵蓋對(duì)關(guān)系型數(shù)據(jù)庫(kù)的抽象之外,其實(shí)還有很多對(duì)其他數(shù)據(jù)存儲(chǔ)中間件的實(shí)現(xiàn),比如我們常用的Redis、MongoDB、Elasticsearch等。

如果再找?guī)讉€(gè)項(xiàng)目看一下它們的簡(jiǎn)單示例,你會(huì)發(fā)現(xiàn):不論你是要訪問(wèn)什么數(shù)據(jù)存儲(chǔ)產(chǎn)品,它們的編碼方式幾乎都是一樣的!這就是Spring Data這個(gè)項(xiàng)目充滿魅力的地方!通過(guò)對(duì)數(shù)據(jù)訪問(wèn)操作的抽象來(lái)屏蔽細(xì)節(jié),用不同子項(xiàng)目的方式去實(shí)現(xiàn)細(xì)節(jié)。讓開(kāi)發(fā)者只需要學(xué)會(huì)使用Spring Data,就能方便快捷的學(xué)會(huì)對(duì)各種數(shù)據(jù)存儲(chǔ)的操作。所以,對(duì)于Spring Data,強(qiáng)烈推薦Java開(kāi)發(fā)者們可以學(xué)、甚至讀一下源碼的重要框架。雖然,目前來(lái)說(shuō)很多大型互聯(lián)網(wǎng)公司并不會(huì)選擇它(性能考量居多,能真正用好它的人不多)作為主要的開(kāi)發(fā)框架,但是其背后的抽象思想是非常值得我們學(xué)習(xí)的。并且,在做一些非高并發(fā)項(xiàng)目的時(shí)候,這簡(jiǎn)直就是一個(gè)快捷開(kāi)發(fā)神器,它可以幫助我們少寫(xiě)非常多的代碼!


請(qǐng)登錄后查看

哈哈哈醬 最后編輯于2024-12-20 16:08:27

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點(diǎn)贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無(wú)簡(jiǎn)介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
1318
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見(jiàn)問(wèn)題 產(chǎn)品動(dòng)態(tài) 精選推薦 首頁(yè)頭條 首頁(yè)動(dòng)態(tài) 首頁(yè)推薦
取 消 確 定
回復(fù)
回復(fù)
問(wèn)題:
問(wèn)題自動(dòng)獲取的帖子內(nèi)容,不準(zhǔn)確時(shí)需要手動(dòng)修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請(qǐng)輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊(cè)

切換手機(jī)號(hào)登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊(cè)
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開(kāi)源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服