最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Data Jpa的四種查詢方式詳解

 更新時(shí)間:2019年12月04日 09:12:57   作者:SongAlone  
這篇文章主要介紹了Spring Data Jpa的四種查詢方式詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了Spring Data Jpa的四種查詢方式詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一、調(diào)用接口的方式

1.基本介紹

通過(guò)調(diào)用接口里的方法查詢,需要我們自定義的接口繼承Spring Data Jpa規(guī)定的接口

public interface UserDao extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User>

使用這幾種方法的前提是你定義的實(shí)體類必須標(biāo)注上相應(yīng)的注解

@Entity //標(biāo)注這是一個(gè)實(shí)體類
@Table(name = "tbl_user") //建立實(shí)體類與表的映射關(guān)系
public class User {

  @Id //聲明此屬性為主鍵
  @GeneratedValue(strategy = GenerationType.IDENTITY) //主鍵生成策略,自增
  @Column(name = "user_id")//指定屬性對(duì)應(yīng)數(shù)據(jù)庫(kù)表的列名
  private Integer userId;

  @Column(name = "user_name")
  private String userName;

  @Column(name = "user_address")
  private String userAddress;

  @Column(name = "user_salary")
  private Double userSalary;
  
  //...getter setter toString方法
}

JpaRepository<T,ID>

第一個(gè)接口里面定義了一些簡(jiǎn)單的CRUD方法,泛型T是你定義的實(shí)體類的類型,泛型ID是你的實(shí)體類里主鍵的類型

JpaSpecificationExecutor

這個(gè)接口可以幫助我們完成一些復(fù)雜查詢,泛型T是你定義的實(shí)體類的類型

2.使用方法

只需要編寫(xiě)一個(gè)自己的接口繼承上述兩個(gè)接口并填好泛型即可調(diào)用

//測(cè)試類,調(diào)用接口的findAll方法
@Test
public void testFindAll(){
  List<User> users = userDao.findAll();
  for (User user : users) {
    System.out.println(user);
  }
}

3.注意事項(xiàng)

JpaRepository接口里有findOne()和getOne()方法,從字面意思上來(lái)看,兩種方法都是查詢一個(gè),的確如此,但它們兩個(gè)本質(zhì)上卻有一定的差別

findOne()

底層調(diào)用了find()方法,當(dāng)我們調(diào)用這個(gè)方法的時(shí)候直接為我們查出結(jié)果

getOne()

底層調(diào)用了getReference()方法,是一種懶加載的模式,使用動(dòng)態(tài)代理的方式為我們創(chuàng)建一個(gè)動(dòng)態(tài)代理對(duì)象,當(dāng)我們調(diào)用查詢結(jié)果時(shí)才會(huì)發(fā)送sql語(yǔ)句,查詢出我們需要的結(jié)果

二、jpql查詢

1.基本介紹

jpql即 Jpa Query Language

jpql語(yǔ)法和sql其實(shí)大同小異,jpql是針對(duì)實(shí)體類進(jìn)行的操作,sql是直接對(duì)數(shù)據(jù)庫(kù)表的操作,所以jpql里只是將sql里數(shù)據(jù)庫(kù)表名、列名等信息替換為實(shí)體類屬性而已

例如

sql語(yǔ)句的查詢:select * from tbl_user where user_name = ?

jpql語(yǔ)句的查詢:from User where userName = ?

2.使用方法

自定義的方法,這里使用@Query注解,value是jpql語(yǔ)句,你可能注意到了,每個(gè)問(wèn)號(hào)后面都帶了一個(gè)數(shù)字,這個(gè)數(shù)字其實(shí)就表示這個(gè)屬性對(duì)應(yīng)方法內(nèi)形參的位置,這樣我們就可以不按照屬性的順序進(jìn)行賦值了。

/**
 * 根據(jù)用戶id和name查詢
 * @return 用戶對(duì)象
 */
@Query(value = "from User where userId = ?2 and userName = ?1")
User findUserByIdAndName(String name, int id);

測(cè)試代碼

@Test
public void testJpql1(){
  User user = userDao.findUserByIdAndName("張三", 1);
  System.out.println(user);
}

3.注意事項(xiàng)

想要使用jpql的前提是你已經(jīng)使用注解配置好了實(shí)體類以及參數(shù)


注解的詳細(xì)信息如下:

/**
 * @Entity
 *  作用:指定當(dāng)前類是實(shí)體類。
 * @Table
 *  作用:指定實(shí)體類和表之間的對(duì)應(yīng)關(guān)系。
 *  屬性:
 *  name:指定數(shù)據(jù)庫(kù)表的名稱
 * @Id
 *  作用:指定當(dāng)前字段是主鍵。
 * @GeneratedValue
 *  作用:指定主鍵的生成方式。。
 *  屬性:
 *  strategy :指定主鍵生成策略。
 *   GenerationType.IDENTITY:自增,底層數(shù)據(jù)庫(kù)必須支持自增(mysql)
 *   GenerationType.SEQUENCE:序列,底層數(shù)據(jù)庫(kù)必須支持序列(oracle)
 *   GenerationType.TABLE:jpa提供的一種策略,通過(guò)生成一張表的方式完成主鍵自增,這張表存儲(chǔ)了下一次添加的主鍵的值
 *   GenerationType.AUTO:由程序自動(dòng)選擇一種策略
 *
 * @Column
 *  作用:指定實(shí)體類屬性和數(shù)據(jù)庫(kù)表之間的對(duì)應(yīng)關(guān)系
 *  屬性:
 *   name:指定數(shù)據(jù)庫(kù)表的列名稱。
 *   unique:是否唯一
 *   nullable:是否可以為空
 *   inserttable:是否可以插入
 *   updateable:是否可以更新
 *   columnDefinition: 定義建表時(shí)創(chuàng)建此列的DDL
 *   secondaryTable: 從表名。如果此列不建在主表上(默認(rèn)建在主表),該屬性定義該列所在從表的名字搭建開(kāi)發(fā)環(huán)境[重點(diǎn)]
 */

三、sql查詢

1.基本介紹

使用sql語(yǔ)句查詢

2.使用方法

自定義的方法,與jpql不同的是,這種方法需要加上nativeQuery=true來(lái)聲明這是一個(gè)本地查詢(sql查詢)

/**
 * 使用sql進(jìn)行條件查詢
 */
@Query(value = "select * from tbl_user where user_name like ?",nativeQuery = true)
List<User> sqlFindByName(String name);

測(cè)試方法

@Test
public void testSql2(){
  List<User> users = userDao.sqlFindByName("%張%");
  for (User user : users) {
    System.out.println(user);
  }
}

四、方法命名規(guī)則查詢

1.基本介紹

顧名思義,這種方法就是使用Spring Data JPA規(guī)定的方法名稱進(jìn)行查詢,這種方式不需要我們寫(xiě)jpql或者sql,Spring Data JPA會(huì)解析方法名幫我們自動(dòng)創(chuàng)建查詢

2.使用方法

自定義方法

/**
 * 根據(jù)用戶名模糊查詢和id匹配查詢
 * @param name
 * @param id
 * @return
 */
List<User> findUserByUserNameLikeAndUserId(String name, int id);

測(cè)試

@Test
public void TestName1(){
  List<User> users = userDao.findUserByUserNameLikeAndUserAddress("%張%", "北京");
  for (User user : users) {
    System.out.println(user);
  }
}

3.命名規(guī)則

按照Spring Data JPA 定義的規(guī)則,查詢方法以findBy開(kāi)頭,刪除方法以deleteBy...... 涉及條件查詢時(shí),條件的屬性用條件關(guān)鍵字連接,要注意的是:條件屬性首字母需大寫(xiě)??蚣茉谶M(jìn)行方法名解析時(shí),會(huì)先把方法名多余的前綴截取掉,然后對(duì)剩下部分進(jìn)行解析。

如果你使用的編譯器是idea,當(dāng)你編寫(xiě)的時(shí)候idea也會(huì)給出提示。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java多線程中的死鎖詳解

    Java多線程中的死鎖詳解

    這篇文章主要介紹了Java多線程中的死鎖詳解,死鎖是指兩個(gè)或多個(gè)線程在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,如果不提前預(yù)防或外界干擾,這些線程將無(wú)法執(zhí)行下去,需要的朋友可以參考下
    2023-08-08
  • Java編程小實(shí)例—數(shù)字時(shí)鐘的實(shí)現(xiàn)代碼示例

    Java編程小實(shí)例—數(shù)字時(shí)鐘的實(shí)現(xiàn)代碼示例

    正所謂拳不離手曲不離口,java學(xué)習(xí)的過(guò)程中,練習(xí)還是要多一點(diǎn)比較好。接下來(lái)分享給大家一個(gè)Java編程的小實(shí)例,供朋友們參考。
    2017-10-10
  • Java 深入探討設(shè)計(jì)模式之原型模式篇

    Java 深入探討設(shè)計(jì)模式之原型模式篇

    設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性
    2021-10-10
  • 基于Java實(shí)現(xiàn)ssh命令登錄主機(jī)執(zhí)行shell命令過(guò)程解析

    基于Java實(shí)現(xiàn)ssh命令登錄主機(jī)執(zhí)行shell命令過(guò)程解析

    這篇文章主要介紹了基于Java實(shí)現(xiàn)ssh命令登錄主機(jī)執(zhí)行shell命令過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java WebSocket的實(shí)現(xiàn)以及Spring WebSocket示例代碼

    java WebSocket的實(shí)現(xiàn)以及Spring WebSocket示例代碼

    本篇文章主要介紹了java WebSocket的實(shí)現(xiàn)以及Spring WebSocket,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • TCC分布式事務(wù)七種異常情況小結(jié)

    TCC分布式事務(wù)七種異常情況小結(jié)

    這篇文章主要為大家詳細(xì)介紹了在整個(gè)TCC模型過(guò)程中可能會(huì)出現(xiàn)的七種異常情況,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • java組件fileupload文件上傳demo

    java組件fileupload文件上傳demo

    這篇文章主要為大家詳細(xì)介紹了java組件fileupload文件上傳demo ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java 深入淺出分析Synchronized原理與Callable接口

    Java 深入淺出分析Synchronized原理與Callable接口

    Synchronized關(guān)鍵字解決的是多個(gè)線程之間訪問(wèn)資源的同步性,synchronized關(guān)鍵字可以保證被它修飾的方法或者代碼塊在任意時(shí)刻只能有一個(gè)線程執(zhí)行,Runnable是執(zhí)行工作的獨(dú)立任務(wù),但是不返回任何值。如果我們希望任務(wù)完成之后有返回值,可以實(shí)現(xiàn)Callable接口
    2022-03-03
  • Java調(diào)用ChatGPT(基于SpringBoot和Vue)實(shí)現(xiàn)可連續(xù)對(duì)話和流式輸出的ChatGPT API

    Java調(diào)用ChatGPT(基于SpringBoot和Vue)實(shí)現(xiàn)可連續(xù)對(duì)話和流式輸出的ChatGPT API

    這篇文章主要介紹了Java調(diào)用ChatGPT(基于SpringBoot和Vue),實(shí)現(xiàn)可連續(xù)對(duì)話和流式輸出的ChatGPT API(可自定義實(shí)現(xiàn)AI助手),文中代碼示例介紹的非常詳細(xì),感興趣的朋友可以參考下
    2023-04-04
  • java郵件發(fā)送簡(jiǎn)單實(shí)現(xiàn)代碼

    java郵件發(fā)送簡(jiǎn)單實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java郵件發(fā)送簡(jiǎn)單實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評(píng)論

禹城市| 宜兴市| 凌源市| 平远县| 宜君县| 宾川县| 红河县| 桃源县| 宿州市| 平山县| 华坪县| 济源市| 巴林右旗| 呼和浩特市| 三江| 内江市| 大田县| 洛南县| 武冈市| 仁寿县| 忻州市| 云南省| 项城市| 西乌| 萨迦县| 海门市| 井研县| 敦化市| 抚远县| 英德市| 宜兰县| 长兴县| 田林县| 麦盖提县| 海原县| 拜泉县| 濮阳市| 大连市| 井陉县| 灵川县| 永仁县|