Spring Data JPA 實例查詢

轉自:https://www.cnblogs.com/rulian/p/6533109.html

一、相關接口方法

在繼承JpaRepository接口后,自動擁有了按“實例”進行查詢的諸多方法。這些方法主要在兩個接口中定義,一是QueryByExampleExecutor,一個是JpaRepository,如下所示:
復制代碼
public interface QueryByExampleExecutor<T> { 
<S extends T> S findOne(Example<S> example); //根據“實例”查找一個對象。
<S extends T> Iterable<S> findAll(Example<S> example); //根據“實例”查找一批對象
<S extends T> Iterable<S> findAll(Example<S> example, Sort sort); //根據“實例”查找一批對象,且排序
<S extends T> Page<S> findAll(Example<S> example, Pageable pageable); //根據“實例”查找一批對象,且排序和分頁
<S extends T> long count(Example<S> example); //根據“實例”查找,返回符合條件的對象個數
<S extends T> boolean exists(Example<S> example); //根據“實例”判斷是否有符合條件的對象
}
復制代碼

?

復制代碼
@NoRepositoryBean public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {...... 
@Override 
<S extends T> List<S> findAll(Example<S> example); //根據實例查詢 
@Override 
<S extends T> List<S> findAll(Example<S> example, Sort sort);//根據實例查詢,并排序。 
}
復制代碼

?

二、快速入門

觀察上面的方法,其參數都有一個 Example 類對象,這就一個“實例”(個人翻譯的叫法,未必準確),它代表的是查詢條件,它是通過包裝要查詢的實體對象而生成的。下面通過一個例子,來快速了解一下其用法。
1、定義實體類
如有 客戶信息、客戶類型 兩個實體類定義如下:
復制代碼
/**
* 客戶
*/
@Entity
@Table(name = "demo_lx_Customer")
public class Customer extends BaseBo
{private String name; //姓名private String sex; //性別private int age; //年齡private String address; //地址private boolean focus ; //是否重點關注private Date addTime; //創建時間private String remark; //備注@ManyToOneprivate CustomerType customerType; //客戶類型......
}
復制代碼

?

復制代碼
/**
* 客戶類型
*/
@Entity
@Table(name = "demo_lx_CustomerType")
public class CustomerType extends BaseBo
{ private String code; //編號private String name; //名稱private String remark; //備注......
}
復制代碼

?

2、模擬數據

加入一些模擬數據:

?

3、查詢

現在要查詢:地址是“鄭州市”,姓“劉”的客戶,可以這樣來寫:

復制代碼
     //創建查詢條件數據對象Customer customer = new Customer();customer.setName("劉");customer.setAddress("河南省鄭州市");//創建匹配器,即如何使用查詢條件ExampleMatcher matcher = ExampleMatcher.matching() //構建對象.withMatcher("name", GenericPropertyMatchers.startsWith()) //姓名采用“開始匹配”的方式查詢.withIgnorePaths("focus");  //忽略屬性:是否關注。因為是基本類型,需要忽略掉//創建實例Example<Customer> ex = Example.of(customer, matcher); //查詢List<Customer> ls = dao.findAll(ex);//輸出結果System.out.println("數量:"+ls.size());for (Customer bo:ls){System.out.println(bo.getName());}
復制代碼

?

輸出結果:
數量:1
劉芳

?

三、認識“實例查詢”

?

1、概念定義:

? ? 上面例子中,是這樣創建“實例”的:Example<Customer> ex = Example.of(customer, matcher);我們看到,Example對象,由customer和matcher共同創建,為講解方便,我們先來明確一些定義。

? ??A、實體對象:在持久化框架中與Table對應的域對象,一個對象代表數據庫表中的一條記錄,如上例中Customer對象。在構建查詢條件時,一個實體對象代表的是查詢條件中的“數值”部分。如:要查詢姓“劉”的客戶,實體對象只能存儲條件值“劉”。

? ??B、匹配器:ExampleMatcher對象,它是匹配“實體對象”的,表示了如何使用“實體對象”中的“值”進行查詢,它代表的是“查詢方式”,解釋了如何去查的問題。如:要查詢姓“劉”的客戶,即姓名以“劉”開頭的客戶,該對象就表示了“以某某開頭的”這個查詢方式,如上例中:withMatcher("name", GenericPropertyMatchers.startsWith())

? ??C、實例:即Example對象,代表的是完整的查詢條件。由實體對象(查詢條件值)和匹配器(查詢方式)共同創建。

? ??再來理解“實例查詢”,顧名思義,就是通過一個例子來查詢。要查詢的是Customer對象,查詢條件也是一個Customer對象,通過一個現有的客戶對象作為例子,查詢和這個例子相匹配的對象。

?

2、特點及約束(局限性):

? ??1、支持動態查詢。即支持查詢條件個數不固定的情況,如:客戶列表中有多個過濾條件,用戶使用時在“地址”查詢框中輸入了值,就需要按地址進行過濾,如果沒有輸入值,就忽略這個過濾條件。對應的實現是,在構建查詢條件Customer對象時,將address屬性值置具體的條件值或置為null。

? ??2、不支持過濾條件分組。即不支持過濾條件用 or(或) 來連接,所有的過濾查件,都是簡單一層的用 and(并且) 連接。

? ??3、僅支持字符串的開始/包含/結束/正則表達式匹配 和?其他屬性類型的精確匹配。查詢時,對一個要進行匹配的屬性(如:姓名 name),只能傳入一個過濾條件值,如以Customer為例,要查詢姓“劉”的客戶,“劉”這個條件值就存儲在表示條件對象的Customer對象的name屬性中,針對于“姓名”的過濾也只有這么一個存儲過濾值的位置,沒辦法同時傳入兩個過濾值。正是由于這個限制,有些查詢是沒辦法支持的,例如要查詢某個時間段內添加的客戶,對應的屬性是 addTime,需要傳入“開始時間”和“結束時間”兩個條件值,而這種查詢方式沒有存兩個值的位置,所以就沒辦法完成這樣的查詢。

?

四、重點理解ExampleMatcher

?

1、需要考慮的因素

查詢條件的表示,有兩部分,一是條件值,二是查詢方式。條件值用實體對象(如Customer對象)來存儲,相對簡單,當頁面傳入過濾條件值時,存入相對應的屬性中,沒入傳入時,屬性保持默認值。查詢方式是用匹配器ExampleMatcher來表示,情況相對復雜些,需要考慮的因素有:
(1)Null值的處理。當某個條件值為Null,是應當忽略這個過濾條件呢,還是應當去匹配數據庫表中該字段值是Null的記錄?
(2)基本類型的處理。如客戶Customer對象中的年齡age是int型的,當頁面不傳入條件值時,它默認是0,是有值的,那是否參與查詢呢?
(3)忽略某些屬性值。一個實體對象,有許多個屬性,是否每個屬性都參與過濾?是否可以忽略某些屬性?
(4)不同的過濾方式。同樣是作為String值,可能“姓名”希望精確匹配,“地址”希望模糊匹配,如何做到?
(5)大小寫匹配。字符串匹配時,有時可能希望忽略大小寫,有時則不忽略,如何做到?
2、五個配置項
圍繞上面一系列情況,ExampleMatcher中定義了5項配置來解決這些問題。?
復制代碼
public class ExampleMatcher {
NullHandler nullHandler; //Null值處理方式
StringMatcher defaultStringMatcher; //默認字符串匹配方式
boolean defaultIgnoreCase; //默認大小寫忽略方式
PropertySpecifiers propertySpecifiers; //各屬性特定查詢方式
Set<String> ignoredPaths; //忽略屬性列表
......
}
復制代碼

?? ?(1)nullHandler:Null值處理方式,枚舉類型,有2個可選值,INCLUDE(包括),IGNORE(忽略)。標識作為條件的實體對象中,一個屬性值(條件值)為Null是,是否參與過濾。當該選項值是INCLUDE時,表示仍參與過濾,會匹配數據庫表中該字段值是Null的記錄;若為IGNORE值,表示不參與過濾。

(2)defaultStringMatcher:默認字符串匹配方式,枚舉類型,有6個可選值,DEFAULT(默認,效果同EXACT),EXACT(相等),STARTING(開始匹配),ENDING(結束匹配),CONTAINING(包含,模糊匹配),REGEX(正則表達式)。該配置對所有字符串屬性過濾有效,除非該屬性在?propertySpecifiers?中單獨定義自己的匹配方式。
(3)defaultIgnoreCase:默認大小寫忽略方式,布爾型,當值為false時,即不忽略,大小不相等。該配置對所有字符串屬性過濾有效,除非該屬性在propertySpecifiers?中單獨定義自己的忽略大小寫方式。
(4)propertySpecifiers:各屬性特定查詢方式,描述了各個屬性單獨定義的查詢方式,每個查詢方式中包含4個元素:屬性名、字符串匹配方式、大小寫忽略方式、屬性轉換器。如果屬性未單獨定義查詢方式,或單獨查詢方式中,某個元素未定義(如:字符串匹配方式),則采用 ExampleMatcher 中定義的默認值,即上面介紹的defaultStringMatcher?和?defaultIgnoreCase?的值。
(5)ignoredPaths:忽略屬性列表,忽略的屬性不參與查詢過濾。
3、操作方法

在ExampleMatcher中定義了一系列方式,用于設置這5項設置值,所有的設置方法均返回 ExampleMatcher 對象,所以支持鏈式編程配置。


(1)創建一個默認的 ExampleMatcher 對象。

定義:

public static ExampleMatcher?matching()

默認配置如下:
A、nullHandler:IGNORE。Null值處理方式:忽略
B、defaultStringMatcher:DEFAULT。默認字符串匹配方式:默認(相等
C、defaultIgnoreCase:false。默認大小寫忽略方式:不忽略
D、propertySpecifiers:空。各屬性特定查詢方式,
E、ignoredPaths:空列表。忽略屬性列表,空列表

?

(2)改變Null值處理方式。

定義:
public ExampleMatcher?withNullHandler(NullHandler nullHandler)
public ExampleMatcher?withIncludeNullValues()
public ExampleMatcher?withIgnoreNullValues()

產生效果:
改變配置項nullHandler,分別設為:指定值、INCLUDE(包括)、IGNORE(忽略)。

?

(3)改變默認字符串匹配方式。
定義:
public ExampleMatcher?withStringMatcher(StringMatcher defaultStringMatcher)

產生效果:
改變配置項defaultStringMatcher,設為指定值。

?

(4)改變默認大小寫忽略方式。
定義:
public ExampleMatcher?withIgnoreCase()
public ExampleMatcher?withIgnoreCase(boolean defaultIgnoreCase)

產生效果:
改變配置項defaultIgnoreCase,分別設為:true,指定值。

?

(5)向“忽略屬性列表”中添加屬性。
定義:
public ExampleMatcher?withIgnorePaths(String... ignoredPaths)

產生效果:
改變配置項ignoredPaths,向列表中添加一個或多個屬性。

?

(6)配置屬性特定查詢方式

? ? 一個屬性的特定查詢方式,包含了3個信息:字符串匹配方式、大小寫忽略方式、屬性轉換器,存儲在?propertySpecifiers?中,操作時用?GenericPropertyMatcher?類來傳遞配置信息。有4個方法來改變配置,這4個方法操作時,內部均采用增量改變的方式,即如果沒有為屬性定義“特定查詢方式”,則會定義一個,并根據傳進來的“非空信息”進行配置,如果已經定義有,則會根據傳進來的“非空信息”進行更新。如果一個“特定查詢方式”中的“字符串匹配方式、大小寫忽略方式”沒有設置值,查詢時則采用ExampleMatcher中的默認配置。

?

A、自定義類的方式。

定義:
public ExampleMatcher?withMatcher(String propertyPath, MatcherConfigurer<GenericPropertyMatcher> matcherConfigurer)

產生效果:

向?propertySpecifiers?中增加或更新屬性“特定查詢方式”的配置。

參數說明:
propertyPath:要配置特定查詢的屬性名。
matcherConfigurer:自定義類對象。自定義類需要實現MatcherConfigurer接口,在接口的 configureMatcher() 實現方法中指定相關配置。

?

B、直接傳入通用屬性查詢對象方式。

定義:
public ExampleMatcher?withMatcher(String propertyPath, GenericPropertyMatcher genericPropertyMatcher)

產生效果:

向?propertySpecifiers?中增加或更新屬性“特定查詢方式”的配置。

參數說明:
propertyPath:要配置特定查詢的屬性名。
genericPropertyMatcher:直接傳入一個通用查詢對象。?ExampleMatcher.GenericPropertyMatchers工具類中提供了常用對象創建的靜態方法,所有方法均返回GenericPropertyMatcher?對象,所以支持鏈式編程配置。

另外:GenericPropertyMatcher?類本身也提供了諸多方法,用于改變相關配置項。

?

C、改變的大小寫忽略方式

定義:
public ExampleMatcher?withIgnoreCase(String... propertyPaths)

產生效果:
向?propertySpecifiers?中增加或更新屬性“特定查詢方式”中的“大小寫忽略方式”配置。。

?

D、設置屬性轉換器

定義:
public ExampleMatcher?withTransformer(String propertyPath, PropertyValueTransformer propertyValueTransformer)

產生效果:
向?propertySpecifiers?中增加或更新屬性“特定查詢方式”中的“屬性轉換器”配置。

五、常用情況說明

??

1、關于基本數據類型。
實體對象中,避免使用基本數據類型,采用包裝器類型。如果已經采用了基本類型,
而這個屬性查詢時不需要進行過濾,則把它添加到忽略列表(ignoredPaths)中。

2、Null值處理方式。
默認值是 IGNORE(忽略),即當條件值為null時,則忽略此過濾條件,一般業務也是采用這種方式就可滿足。當需要查詢數據庫表中屬性為null的記錄時,可將值設為INCLUDE,這時,對于不需要參與查詢的屬性,都必須添加到忽略列表(ignoredPaths)中,否則會出現查不到數據的情況。

3、默認配置、特殊配置。
默認創建匹配器時,字符串采用的是精確匹配、不忽略大小寫,可以通過操作方法改變這種默認匹配,以滿足大多數查詢條件的需要,如將“字符串匹配方式”改為CONTAINING(包含,模糊匹配),這是比較常用的情況。對于個別屬性需要特定的查詢方式,可以通過配置“屬性特定查詢方式”來滿足要求。

4、非字符串屬性
如約束中所談,非字符串屬性均采用精確匹配,即等于。

5、忽略大小寫的問題。
忽略大小的生效與否,是依賴于數據庫的。例如 MySql 數據庫中,默認創建表結構時,字段是已經忽略大小寫的,所以這個配置與否,都是忽略的。如果業務需要嚴格區分大小寫,可以改變數據庫表結構屬性來實現,具體可百度。

??

六、常用查詢示例

以“快速入門”中的實體對象和模擬數據為例,列一些常用查詢,方便開發時參考。

?

1、無匹配器的情況
要求:查詢地址是“河南省鄭州市”,且重點關注的客戶。
說明:對于默認匹配器滿足條件時,則不需要創建匹配器。

復制代碼
     //創建查詢條件數據對象Customer customer = new Customer();customer.setAddress("河南省鄭州市");customer.setFocus(true);//創建實例Example<Customer> ex = Example.of(customer); //查詢List<Customer> ls = dao.findAll(ex);//輸出結果System.out.println("數量:"+ls.size());for (Customer bo:ls){System.out.println(bo.getName());}
復制代碼

?

輸出結果:

數量:4
李明
劉芳
zhang ming
ZHANG SAN

?

2、通用情況
要求:根據姓名、地址、備注進行模糊查詢,忽略大小寫,地址要求開始匹配。
說明:這是通用情況,主要演示改變默認字符串匹配方式、改變默認大小寫忽略方式、屬性特定查詢方式配置、忽略屬性列表配置。

復制代碼
     //創建查詢條件數據對象Customer customer = new Customer();customer.setName("zhang");customer.setAddress("河南省");customer.setRemark("BB");//創建匹配器,即如何使用查詢條件ExampleMatcher matcher = ExampleMatcher.matching() //構建對象.withStringMatcher(StringMatcher.CONTAINING) //改變默認字符串匹配方式:模糊查詢.withIgnoreCase(true) //改變默認大小寫忽略方式:忽略大小寫.withMatcher("address", GenericPropertyMatchers.startsWith()) //地址采用“開始匹配”的方式查詢.withIgnorePaths("focus");  //忽略屬性:是否關注。因為是基本類型,需要忽略掉//創建實例Example<Customer> ex = Example.of(customer, matcher); //查詢List<Customer> ls = dao.findAll(ex);//輸出結果System.out.println("數量:"+ls.size());for (Customer bo:ls){System.out.println(bo.getName());}
復制代碼

?

輸出結果:?

數量:2
zhang ming
ZHANG SAN

??

3、多級查詢
要求:查詢所有潛在客戶
說明:主要演示多層級屬性查詢

復制代碼
     //創建查詢條件數據對象CustomerType type = new CustomerType();type.setCode("01"); //編號01代表潛在客戶Customer customer = new Customer();customer.setCustomerType(type);        //創建匹配器,即如何使用查詢條件ExampleMatcher matcher = ExampleMatcher.matching() //構建對象.withIgnorePaths("focus");  //忽略屬性:是否關注。因為是基本類型,需要忽略掉                //創建實例Example<Customer> ex = Example.of(customer, matcher); //查詢List<Customer> ls = dao.findAll(ex);//輸出結果System.out.println("數量:"+ls.size());for (Customer bo:ls){System.out.println(bo.getName());}
復制代碼

?

輸出結果:?

數量:4
李明
李莉
張強
ZHANG SAN

??

4、查詢Null值
要求:地址是null的客戶
說明:主要演示改變“Null值處理方式”

復制代碼
     //創建查詢條件數據對象Customer customer = new Customer();//創建匹配器,即如何使用查詢條件ExampleMatcher matcher = ExampleMatcher.matching() //構建對象.withIncludeNullValues() //改變“Null值處理方式”:包括.withIgnorePaths("id","name","sex","age","focus","addTime","remark","customerType");  //忽略其他屬性//創建實例Example<Customer> ex = Example.of(customer, matcher); //查詢List<Customer> ls = dao.findAll(ex);//輸出結果System.out.println("數量:"+ls.size());for (Customer bo:ls){System.out.println(bo.getName());}
復制代碼

?

輸出結果:?

數量:2
張強
劉明

?

七、寫在最后

對實例查詢的研究及本文的寫作,確入投入了精力,因此該文章也贏得了不少的點擊率。
但是...但是...就實用性而言,由于“實例查詢”的局限性和復雜性,在Spring Data JPA中其實是不實用的。用的最多的還是“簡單查詢”(因為簡單,所以...)和 基于JPA Criteria 的動態查詢(可以滿足所有需求,沒有局限性)。(僅個人觀點)
簡單查詢的兩篇博文:
http://www.cnblogs.com/rulian/p/6557471.html
http://www.cnblogs.com/rulian/p/6434631.html

轉載于:https://www.cnblogs.com/sharpest/p/8670425.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539040.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539040.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539040.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python可變參數函數二階導數公式_Python中函數的參數定義和可變參數

剛學用Python的時候&#xff0c;特別是看一些庫的源碼時&#xff0c;經常會看到func(*args, **kwargs)這樣的函數定義&#xff0c;這個*和**讓人有點費解。其實只要把函數參數定義搞清楚了&#xff0c;就不難理解了。先說說函數定義&#xff0c;我們都知道&#xff0c;下面的代…

windows找不到文件gpedit.msc_此電腦右鍵管理提示windows找不到文件的解決方法

也許當你右鍵點擊此電腦管理時&#xff0c;也許會出現Windows找不到文件的提示&#xff0c;下面提供一些解決方法&#xff1a;1、首先按下“Windows”R組合鍵打開運行&#xff0c;在彈出的“運行“對話框中輸入”compmgmt.msc“&#xff0c;點擊”確定“&#xff1b;2、如果此時…

java序列化流_java 序列化流與反序列化流

一 對象序列化流ObjectOutputStreamObjectOutputStream 將Java對象的基本數據類型和圖形寫入OutputStream。可以使用ObjectInputStream讀取(重構)對象。通過在流中使用文件可以實現對象的持久存儲。注意&#xff1a;只能將支持 java.io.Serializable 接口的對象寫入流中用于從流…

【spring boot】注解@ApiParam @PathVariable @RequestParam三者區別

1.ApiParam&#xff0c;就是用于swagger提供開發者文檔&#xff0c;文檔中生成的注釋內容。 ApiOperation( value "編輯公告", notes "編輯公告", httpMethod "POST" )RequestMapping( value "/edit", method RequestMethod.POST…

Zookeeper Watch監聽

概述 ZooKeeper -server host:port cmd args stat path [watch] ls path [watch] ls2 path [watch] get path [watch] watch監聽有不同的類型&#xff0c;有監聽狀態的stat &#xff0c;內容的get&#xff0c;目錄結構的ls。 命令使用一次&#xff0c;只監聽…

win10文件顯示后綴名_win10系統,如何去除“此電腦” 里的6個多余文件夾

Windows系統從XP到win7,再到進化到如今的win10&#xff0c;在系統性能和使用便捷性方面&#xff0c;確實改進了很多&#xff0c;但是&#xff0c;金無赤足&#xff0c;沒有完美的東西&#xff0c;總是有一些小細節讓我們感覺不舒服&#xff0c;如如鯁在喉。比如我們下面看到的這…

ubuntu sun-java6-jre_在 Ubuntu Lucid 下請回 Sun Java6 Jre, 趕走 OpenJDK

Ubuntu Lucid 將 sun-java6-jre 系列包移出了源&#xff0c;java軟件用 openjdk系列包提供支持。然而在某些軟件(比如FreeRapid)的使用中&#xff0c;openjdk還是喜歡出一些莫名其妙的錯誤(比如棧溢出)&#xff0c;因此考慮請回sun-java6-jre。具體方法很簡單&#xff0c;首先添…

數字化工廠的五大系統_如何搭建以MES系統為核心的數字化工廠?

MES強調車間級的過程集成、控制和監控&#xff0c;以及合理地配置和組織所有資源。滿足車間信息化需要&#xff0c;提高車間對隨機事件的快速響應和處理能力&#xff0c;有力地促進企業信息化進程向車間層拓展。通過構建以“精益生產、智能制造”為特點的車間管理系統&#xff…

zookeeper數據結構及Znode類型

結構 1、層次化的目錄結構&#xff0c;命名符合常規文件系統規范 2、每個節點在zookeeper中叫做znode,并且其有一個唯一的路徑標識。 3、節點Znode可以包含數據和子節點&#xff08;但是EPHEMERAL類型的節點不能有子節點&#xff09;。 4、客戶端應用可以在節點上設置監視器…

Windows10下手工強制清理刪掉安裝版的JRE8導致java.exe無法運行的解決辦法

error:could not open xxxx.jvm.cfg 參考&#xff1a;https://blog.csdn.net/u010102493/article/details/18425267 1.搜索并刪掉C:\Windows\System32下&#xff1a;java*.exe 仍然不行&#xff1a; 在WIN10的開始菜單搜索java C:\ProgramData\Oracle\Java下還有一些東西。 確認…

設計企業網站大綱_企業網站設計布局

網站制作一年350元&#xff0c;五站合一&#xff0c;快速建站 &#xff0c;www.sxjcwzjs.com,只需進入網站右上角注冊快速建站即可(需要電腦登錄注冊)&#xff0c;需要聯系我吧&#xff01;電話&#xff1a;13752214574&#xff0c;微信號&#xff1a;m1078582894企業網站布局很…

python畫子圖_Python使用add_subplot與subplot畫子圖操作示例

本文實例講述了Python使用add_subplot與subplot畫子圖操作。分享給大家供大家參考&#xff0c;具體如下&#xff1a;子圖&#xff1a;就是在一張figure里面生成多張子圖。Matplotlib對象簡介FigureCanvas 畫布Figure 圖Axes 坐標軸(實際畫圖的地方)注意&#…

vue導入靜態js_如何在vue js中加載靜態圖像

我有一個組件,它接受一個prop字符串,即一個url。它可以是遠程圖片,也可以是資產文件夾中的本地靜態資產。目錄結構:-assets/- logo.png-app.vue-components/-ImageTest.vue圖像測試.vue{{imagelink}}export default {name: "ImageTest",props:{imagelink: String,},c…

Zookeeper JavaApi 增刪改查

官網API http://zookeeper.apache.org/doc/r3.4.6/api/index.html JAR包 \zookeeper-3.3.6\lib\ jline-0.9.94.jar \zookeeper-3.3.6\lib\ log4j-1.2.15.jar \zookeeper-3.3.6\ zookeeper-3.3.6.jar Demo代碼 注意代碼中的注解 package hello.zookeeper.api;import java.uti…

搭建linux測試環境有什么用_談談現在搭建網站用什么程序好,選擇對的程序是很重要的開頭...

目前可以選擇的網站程序還是蠻多的&#xff0c;開源的系統也很多&#xff0c;也有很多精品。更多時候&#xff0c;選擇網站程序要結合網站的定位。說說dedecms&#xff0c;就是我們都知道的織夢程序&#xff0c;功能很齊全&#xff0c;作為一個簡單的資訊門戶網站&#xff0c;算…

python練習筆記——利用信號signal處理僵尸進程

1 signal處理僵尸進程的基于語法 利用信號signal處理僵尸進程的方法&#xff1a;signal(SIGCHLD,SIG_IGN)&#xff0c;該方法也是第三種處理僵尸進程的方法。 SIGCHLD&#xff1a;子進程狀態改變后產生此信號&#xff0c;父進程需要調用一個wait函數以確定發生了什么。 1&#…

Zookeeper應用:服務端上下線

需求 客戶端感知服務器的上下線。 示意圖 步驟 服務端&#xff1a; 1、所有機子向Zookeeper注冊&#xff0c;注冊znode為臨時的。 2、有機子下線&#xff0c;連接斷開后被Zookeeper自動刪除&#xff0c;觸發監聽事件。 3、有機子上線&#xff0c;觸發監聽事件。 客戶端&am…

哈希表查找失敗的平均查找長度_你還應該知道的哈希沖突解決策略

本文首發于 vivo互聯網技術 微信公眾號 鏈接&#xff1a;https://mp.weixin.qq.com/s/5vxYoeARG1nC7Z0xTYXELA作者&#xff1a;Xuegui Chen哈希是一種通過對數據進行壓縮, 從而提高效率的一種解決方法&#xff0c;但由于哈希函數有限&#xff0c;數據增大等緣故&#xff0c;哈希…

hive 創建訪問用戶_hive創建角色并賦權

1 角色管理命令1.1 創建角色創建一個新角色&#xff0c;需要 admin 用戶執行CREATE ROLE role_name;1.2 刪除角色刪除一個角色&#xff0c;需要 admin 用戶執行DROP ROLE role_name;1.3 顯示當前角色顯示用戶當前角色列表SHOW CURRENT ROLES;1.4 設定角色如果指定了role_name&a…

python 正則替換_5分鐘速覽Python正則表達式常用函數!五分鐘就掌握它!

導讀&#xff1a;正則表達式是處理字符串類型的"核武器"&#xff0c;不僅速度快&#xff0c;而且功能強大。本文不過多展開正則表達式相關語法&#xff0c;僅簡要介紹python中正則表達式常用函數及其使用方法&#xff0c;以作快速查詢瀏覽。01 Re概覽Re模塊是python的…