1. 程式人生 > >第二章-查詢與快取

第二章-查詢與快取

第二章-查詢與快取

1. 基礎微服務條件查詢

1.1 標籤-條件查詢

POST /label/search 根據條件查詢城市列表

  1. 修改LabelService ,增加方法

    /**
     * 根據條件查詢
     * @param label
     * @return
     */
    public List<Label> findSearch(Label label) {
        return labelDao.findAll(createSpecification(label));
    }

    /**
     * 動態條件構建
     * @param label
     * @return
     */
private Specification<Label> createSpecification(Label label) { return new Specification<Label>() { @Override public Predicate toPredicate(Root<Label> root, CriteriaQuery<?> query, CriteriaBuilder cb) { List<Predicate>
predicateList = new ArrayList<Predicate>(); //new一個list集合。來存放所有的條件 List<Predicate> list = new ArrayList<>(); if (label.getLabelname() != null && !"".equals(label.getLabelname())) { Predicate predicate = cb.like
(root.get("labelname").as(String.class), "%" + label.getLabelname() + "%");// labelname like "%小明%" list.add(predicate); } if (label.getState() != null && !"".equals(label.getState())) { Predicate predicate = cb.equal(root.get("state").as(String.class), label.getState());// state = "1" list.add(predicate); } //new一個數組作為最終返回值的條件 Predicate[] parr = new Predicate[list.size()]; //把list直接轉成陣列 parr = list.toArray(parr); return cb.and(parr);// where labelname like "%小明%" and state = "1" } }; }
  1. 修改LabelController,增加方法
    /**
     * 根據條件查詢
     * @param label
     * @return
     */
    @PostMapping("/search")
    public Result findSearch(@RequestBody Label label){
        List<Label> list = labelService.findSearch(label);
        return new Result(true, StatusCode.OK, "查詢成功", list);
    }

1.2 帶分頁的條件查詢

  1. 修改LabelService,增加方法
  /**
     * 帶分頁的條件查詢
     * @param label
     * @param page
     * @param size
     * @return
     */
    public Page<Label> pageQuery(Label label, int page, int size) {
        //封裝分頁物件
        Pageable pageable = PageRequest.of(page-1, size);
        return labelDao.findAll(createSpecification(label), pageable);
    }
  1. 修改LabelController,增加方法
    /**
     * 根據條件查詢帶分頁
     * @param label
     * @param page
     * @param size
     * @return
     */
    @PostMapping("/search/{page}/{size}")
    public Result pageQuery(@RequestBody Label label, @PathVariable int page, @PathVariable int size){
        Page<Label> pageData = labelService.pageQuery(label, page, size);
        return new Result(true, StatusCode.OK, "查詢成功", new PageResult<Label>(pageData.getTotalElements(), pageData.getContent()));
    }

2. 招聘微服務開發

2.1 表結構分析

招聘微服務包括 企業資訊招聘資訊

  • 企業表 tb_enterprise
欄位名稱 欄位含義 欄位型別 備註
id ID 文字
name 企業名稱 文字
summary 企業簡介 文字
address 企業地址 文字
labels 標籤列表 文字 用逗號分隔
coordinate 企業位置座標 文字 經度,緯度
ishot 是否熱門 文字 0:非熱門 1:熱門
logo LOGO 文字
jobcount 職位數 數字
url URL 文字
  • 招聘資訊表 tb_recruit
欄位名稱 欄位含義 欄位型別 備註
id ID 文字
jobname 招聘職位 文字
salary 薪資範圍 文字
condition 經驗要求 文字
education 學歷要求 文字
type 任職方式 文字
address 辦公地址 文字
eid 企業ID 文字
createtime 釋出日期 日期
state 狀態 文字 0:關閉 1:開啟

2.2 程式碼生成

  • (1) 使用程式碼生成器生成招聘微服務程式碼 tensquare_recruit
  • (2)拷貝到當前工程,並在父工程引入。
  • (3) 修改Application類名稱為RecruitApplication
  • (4)修改application.yml 中的埠為9002 ,url 為

jdbc:mysql://localhost:3306/tensquare_recruit?characterEncoding=UTF8

  • (5)進行瀏覽器測試

2.3 程式碼編寫

2.3.1 熱門企業列表

查詢企業表ishot欄位為1的記錄

  • (1)EnterpriseDao新增方法定義
/**
* 根據熱門狀態獲取企業列表,這個通過JPA自動實現了
* @param ishot
* @return
*/
public List<Enterprise> findByIshot(String ishot);
  • (2)EnterpriseService新增方法
/**
* 熱門企業列表
* @return
*/
public List<Enterprise> hotlist(){
return enterpriseDao.findByIshot("1");
}
  • (3)EnterpriseController新增方法
/**
	 * 查詢熱門企業
	 * @return
	 */
	@GetMapping("/search/hotlist")
	public Result hotlist(){
		return new Result(true, StatusCode.OK,"查詢成功",enterpriseService.hotlist());
	}
  • (4)測試 http://localhost:9002/enterprise/search/hotlist

2.3.2 推薦職位列表

需求分析: 查詢狀態為2並以建立日期降序排序,查詢前6條記錄

  • (1) 在RecruitDao新增方法定義
     /**
     * 查詢最新職位列表按照 state 來查詢(按照建立日期降序)
     * @param state
     * @return
     */
     List<Recruit> findTop6ByStateOrderByCreatetimeDesc(String state);//where state=? order by createime

  • (2) RecruitService新增方法
	/**
	 * 根據狀態查詢
	 * @param state
	 * @return
	 */
	public List<Recruit> findTop6ByStateOrderByCreatetimeDesc(String  state){
		return recruitDao.findTop6ByStateOrderByCreatetimeDesc(state);
	}
  • (3) RecruitController新增方法
	@GetMapping("/search/recommend")
	public Result recommend(){
		List<Recruit> list = recruitService.findTop6ByStateOrderByCreatetimeDesc("2");
		return new Result(true,StatusCode.OK,"查詢成功",list);
	}
  • (4) 測試 http://localhost:9002/recruit/search/recommend

2.3.3 最新職位列表

需求分析:查詢狀態不為0並以建立日期降序排序,查詢前6條記錄

  • (1) 在RecruitDao新增方法定義
    /**
     * 查詢最新職位列表不按照 state 來查詢(按照建立日期降序)查詢狀態不為0並以建立日期降序排序,查詢前12條記錄
     * @param state
     * @return
     */
     List<Recruit> findTop6ByStateNotOrderByCreatetimeDesc(String state);//where state!=? order by createime

  • (2) RecruitService新增方法
 	/**
	 * 最新職位列表
	 * @return
	 */
	public List<Recruit> newlist(){
		return recruitDao.findTop6ByStateNotOrderByCreatetimeDesc("0");
	}
  • (3) RecruitController新增方法
	/**
	 * 最新職位列表
	 * @return
	 */
	@GetMapping("/search/newlist")
	public Result newlist(){
		return new Result(true,StatusCode.OK,"查詢成功",recruitService.newlist());
	}
  • (4)測試 http://localhost:9002/recruit/search/newlist

3. 問答微服務開發

3.1 表結構分析

  • 招聘資訊表 tb_recruit
欄位名稱 欄位含義 欄位型別 備註
id ID 文字
title 問題標題 文字
content 問題內容 文字
createtime 釋出日期 日期
updatetime 更新日期 日期
userid 釋出人ID 文字
nickname 釋出人暱稱 文字
visits 瀏覽量 整型
thumbup 點贊數 整型
reply 回覆數 整型
solve 是否解決 文字
replyname 最新回覆人 文字
replytime 最新回覆時間 日期

3.2 程式碼生成

  • (1)使用程式碼生成器生成招聘微服務程式碼 tensquare_qa
  • (2)拷貝到當前工程,並在父工程引入。
  • (3)修改Application類名稱為QaApplication
  • (4)修改application.yml 中的埠為9003 ,url 為
    jdbc:mysql://localhost:3306/tensquare_qa?characterEncoding=UTF8
  • (5) 進行瀏覽器測試

3.3 程式碼編寫

3.3.1 最新回答列表

需求分析:最新回覆的問題顯示在上方, 按回復時間降序排序

  • (1) ProblemDao新增方法定義
    /**
     * 根據標籤ID查詢最新問題列表
     * @param labelid
     * @param pageable
     * @return
     */
    @Query(value = "SELECT * FROM tb_problem, tb_pl WHERE id = problemid AND labelid=? ORDER BY replytime DESC", nativeQuery = true)
    public Page<Problem> newlist(String labelid, Pageable pageable);

  • (2) ProblemService新增方法
	/**
	 * 根據標籤ID查詢問題列表
	 * @param lableId 標籤ID
	 * @param page 頁碼
	 * @param size 頁大小
	 * @return
	 */
	public Page<Problem> findNewListByLabelId(String lableId,int page,int size) {
		PageRequest pageRequest = PageRequest.of(page-1, size);
		return problemDao.newlist(lableId,pageRequest);
	}
  • (3) ProblemController新增方法
	/**
	 * 根據標籤ID查詢最新問題列表
	 * @param labelid
	 * @return
	 */
	@GetMapping("/newlist/{labelid}/{page}/{size}")
	public Result findNewListByLabelId(@PathVariable String labelid,@PathVariable int page,@PathVariable int size ){
		Page<Problem> pageList = problemService.findNewListByLabelId(labelid, page, size);
		PageResult<Problem> pageResult = new PageResult<>(pageList.getTotalElements(), pageList.getContent());
		return new Result(true, StatusCode.OK, "查詢成功",pageResult);
	}
  • (4) 測試 http://localhost:9003//problem/newlist/{labelid}/{page}/{size}

3.3.2 熱門問答列表

  • (1) ProblemDao新增方法定義
    /**
     * 熱門問題列表
     * @param labelid
     * @param pageable
     * @return
     */
    @Query(value = "SELECT * FROM tb_problem, tb_pl WHERE id = problemid AND labelid=? ORDER BY reply DESC", nativeQuery = true)
    public Page<Problem> hotlist(String labelid, Pageable pageable);
  • (2) ProblemService新增方法
	/**
	 * 根據標籤ID查詢熱門問題列表
	 * @param lableId 標籤ID
	 * @param page 頁碼
	 * @param size 頁大小
	 * @return
	 */
	public Page<Problem> findHotListByLabelId(String lableId,int page,int size) {
		PageRequest pageRequest = PageRequest.of(page-1, size);
		return problemDao.hotlist(lableId,pageRequest);
	}
  • (3) ProblemController新增方法
	/**
	 * 根據標籤ID查詢熱門問題列表
	 * @param labelid 標籤ID
	 * @param page 頁碼
	 * @param size 頁大小
	 * @return
	 */
	@GetMapping("/hotlist/{labelid}/{page}/{size}")
	public Result findHotListByLabelId(@PathVariable String labelid,@PathVariable int page,@PathVariable int size ){
		Page<Problem> pageList = problemService.findHotListByLabelId(labelid, page, size);
		PageResult<Problem> pageResult = new PageResult<>(pageList.getTotalElements(), pageList.getContent());
		return new Result(true, StatusCode.OK, "查詢成功",pageResult);
	}
  • (4) 測試 ``

3.3.3 等待問答列表

  • (1) ProblemDao新增方法定義
    /**
     * 等待回答問題列表
     * @param labelid
     * @param pageable
     * @return
     */
    @Query(value = "SELECT * FROM tb_problem, tb_pl WHERE id = problemid AND labelid=? AND reply=0 ORDER BY createtime DESC", nativeQuery = true)
    Page<Problem> waitlist(String labelid, Pageable pageable);
  • (2) ProblemService新增方法
	/**
	 * 根據標籤ID查詢等待問題列表
	 * @param lableId 標籤ID
	 * @param page 頁碼
	 * @param size 頁大小
	 * @return
	 */
	public Page<Problem> findWaitListByLabelId(String lableId,int page,int size) {
		PageRequest pageRequest = PageRequest.of(page-1, size);
		return problemDao.waitlist(lableId,pageRequest);
	}
  • (3) ProblemController新增方法
	/**
	 * 根據標籤ID查詢等待問題列表
	 * @param labelid 標籤ID
	 * @param page 頁碼
	 * @param size 頁大小
	 * @return
	 */
	@GetMapping("/waitlist/{labelid}/{page}/{size}")
	public Result findWaitListByLabelId(@PathVariable String labelid,@PathVariable int page,@PathVariable int size ){
		Page<Problem> pageList = problemService.findWaitListByLabelId(labelid, page, size);
		PageResult<Problem> pageResult = new PageResult<>(pageList.getTotalElements(), pageList.getContent());
		return new Result(true, StatusCode.OK, "查詢成功",pageResult);
	}
  • (4) 測試 ``

4. 文章微服務開發

4.1 表結構分析

  • 招聘資訊表 tb_article
欄位名稱 欄位含義 欄位型別 備註
id ID 文字
columnid 專欄ID 文字
userid 使用者ID 文字
title 文章標題 文字
content 文章內容 文字
image 文章封面 文字
createtime 發表日期 日期
updatetime 修改日期 日期
ispublic 是否公開 文字 0:不公開 1:公開
istop 是否置頂 文字 0:不置頂 1:置頂
visits 瀏覽量 整型
thumbup 點贊數 整型
comment 評論數 整型
state 稽核狀態 文字 0:未稽核 1:已稽核
channelid 所屬頻道 整型 關聯頻道表ID
url URL地址 文字
type 文章型別 文字 0:分享 1:專欄

4.2 程式碼生成

  • (1) 使用程式碼生成器生成招聘微服務程式碼 tensquare_article
  • (2) 拷貝到當前工程,並在父工程引入。
  • (3) 修改Application類名稱為ArticleApplication
  • (4) 修改application.yml 中的埠為9004 ,url 為
    jdbc:mysql://192.168.184.134:3306/tensquare_article?characterEncoding=UTF8
  • (5) 瀏覽器測試

4.3 程式碼編寫

4.3.1 文章稽核

  • (1) ArticleDao新增方法
    /**
     * 文章稽核
     * @param id 需要稽核的文章ID
     */
    @Modifying
    @Query(value = "UPDATE tb_article SET state=1 WHERE id = ?", nativeQuery = true)
    void examine(String id);
  • (2) ArticleService新增方法
	/**
	 * 文章稽核
	 * @param id 需要稽核的文章ID
	 */
	public void examine(String id){
		articleDao.examine(id);
	}
  • (3) ArticleController新增方法
	/**
	 * 稽核
	 * @param id
	 * @return
	 */
	@PutMapping("/examine/{id}")
	public Result examine(@PathVariable String id){
		articleService.examine(id);
		return new Result(true, StatusCode.OK, "稽核成功!");
	}

4.3.2 文章點贊

  • (1) ArticleDao新增方法
    /**
     * 文章稽核
     * @param id 需要稽核的文章ID
     */
    @Modifying
    @Query(value = "UPDATE tb_article SET state=1 WHERE id = ?", nativeQuery = true)
    void examine(String id);
  • (2) ArticleService新增方法
	/**
	 * 文章稽核
	 * @param id 需要稽核的文章ID
	 */
	public void examine(String id){
		articleDao.examine(id);
	}
  • (3) ArticleController新增方法
    /**
     * 文章點贊
     * <pre>
     *     thumbup=thumbup+1
     * </pre>
     * 上面的是為了防止錯誤,這樣寫了之後第一次點贊不會報錯
     * @param id 需要點讚的文章id
     */
    @Modifying
    @Query(value = "UPDATE tb_article SET thumbup=thumbup+1 WHERE id = ?", nativeQuery = true)
    void addThumbup(String id);

  • (2) ArticleService新增方法
	/**
	 * 點贊
	 * @param id 文章ID
	 * @return
	 */
	public void addThumbup(String id){
		 articleDao.addThumbup(id);
	}
  • (3) ArticleController新增方法
	/**
	 * 文章點贊
	 * @param id 需要點讚的文章ID
	 * @return
	 */
	@PutMapping("/thumbup/{id}")
	public Result updateThumbup(@PathVariable String id){
		articleService.addThumbup(id);
		return new Result(true, StatusCode.OK,"點贊成功");
	}

5. 快取處理

為了提高查詢效能,我們通常使用redis快取解決

5.1 Redis環境搭建

我們以docker的方式搭建redis服務

docker run -di --name=tensquare_redis -p 6379:6379 redis

5.2 SpringDataRedis

Spring-data-redis是spring大家族的一部分,提供了在srping應用中通過簡單的配置訪問
redis服務,對reids底層開發包(Jedis, JRedis, and RJC)進行了高度封裝,RedisTemplate
提供了redis各種操作。

5.3 實現文章的快取處理

5.3.1 查詢文章操作快取

  • (1) : 再tensquare-article的pom檔案中引入依賴
	  <dependency>
		  <groupId>org.springframework.boot</groupId>
		  <artifactId>spring-boot-starter-data-redis</artifactId>
	  </dependency>
  • (2) : 修改application.yml ,在spring節點下新增配置
redis:
 host: 127.0.0.1
  • (3) : 修改ArticleService 引入RedisTemplate,並修改findById方法
	/**
	 * 根據ID查詢實體
	 * @param id
	 * @return
	 */
	public Article findById(String id) {
		//查詢快取
		Article article= (Article)redisTemplate.opsForValue().get("article_"+id);
		if(article == null){
			article = articleDao.findById(id).get();
			//預設保留一天,這樣在查詢的時候,就會自動將文章放入快取
			redisTemplate.opsForValue().set("article_"+id,article,1,TimeUnit.DAYS);
		}
		return article;
	}

5.3.2 修改或刪除後清除快取

	
            
           

相關推薦

第二-查詢快取

第二章-查詢與快取 1. 基礎微服務條件查詢 1.1 標籤-條件查詢 POST /label/search 根據條件查詢城市列表 修改LabelService ,增加方法 /** * 根據條件查詢 * @param

【HTTP權威指南】第二-URL資源

理想 還需要 端口號 劃分 說明 字符 span http權威指南 網關 【統一資源定位符URL】通過位置來標示資源,其表達的格式如下:https://item.jd.com/523961.html 第一部分(https)是方案,告知客戶端要【怎樣訪問】,這裏使用的是htt

Python學習系列-----第二 操作符表達式

2.4 學習 -- alt ges 操作符 bsp nbsp images   2.1 數學運算和賦值的簡便方法     例如:        2.2 優先級     在python中運算符有優先級之分,高優先級的運算符先執行,低優先級的運算符後執行。下面是運算符優先級:(

網路是怎樣連線的學習筆記-第二-IP乙太網的包收發操作(二)

2.5.3 生成包含接收方 IP 地址的 IP 頭部 IP頭部包含的內容 IP 模組接受 TCP 模組的委託負責包的收發工作,它會生成 IP 頭部並附加在 TCP 頭部前面。 IP 頭部包含的內容如表 2.2 所示,其中最重要的內容就是 IP 地址,它表示這個包應該發到哪裡去。 接受方IP地址:應用程

網絡是怎樣連接的學習筆記-第二-IP以太網的包收發操作(四)

出現 init 信號 height 這樣的 介質 操作系統 初始化 關於 2.5.9 向集線器發送網絡包 發送信號的半雙工和全雙工模式 加上報頭、起始幀分界符和 FCS 之後,我們就可以將包通過網線發送出去了。 發送信號的操作分為兩種,一種是使用集線器的半雙工模式,另一種是

網路是怎樣連線的學習筆記-第二-IP乙太網的包收發操作(四)

2.5.9 向集線器傳送網路包 傳送訊號的半雙工和全雙工模式 加上報頭、起始幀分界符和 FCS 之後,我們就可以將包通過網線傳送出去了。 傳送訊號的操作分為兩種,一種是使用集線器的半雙工模式,另一種是使用交換機的全雙工模式。 傳送和接收同時並行的方式叫作“全雙工”,相對地,某一時刻只能進行傳送或

第二指標Pro SQL Server Internal (Dmitri Korotkev)

聚合索引 聚集索引就是表中資料的物理順序,它是按照聚集索引分類的。表只能定義一個聚集索引。   如果你要在一個有資料的堆表中建立一個聚集索引,如2-5所示,第一步要做的就是SQL伺服器建立另一個根據聚集索引鍵分類的資料副本。資料頁連線到雙向連結串列,雙向連結串列的每一頁都包含指向下一頁

Spring——第二 SpringIoC(二)

2.2.7  Bean的生命週期 Spring 內的Bean物件從建立到銷燬,可控點很多。 2.2.8 <bean>的id與name 屬性 name對格式沒有限制,id有 2.3 基於XML的DI 2.3.1 注入分類 設值注入:        基本

Spring——第二 SpringIoC(三)

cirl + shift + F 格式化程式碼 2.3.6 使用內部Bean注入 <bean id="myStudent" class="com.bjpowernode.di10.Student"> <property name="name

第二 集合排序 3-1 對錶進行聚合排序

一、聚合函式 用於彙總的函式稱為聚合函式或者聚集函式。所謂聚合,就是將多行彙總為一行。 二、計算表中資料的行數(COUNT()函式) 1、計算全部資料的行數。 SELECT COUNT(*) FROM Product; 2、計算NULL之外的資料的行數 將包含NULL值的列作為引數時,輸出的結果為非空的行

python 第二 物件型別

可變物件和不可變物件 1,可變物件,list(列表),dict(字典),集合(set),位元組陣列。 2,不可變物件,數值型別,字串,位元組串,元組(具體形式 ())。 注意條件:可變和不可變指的是該物件指向的記憶體是否可以改變。當修改不可變物件的時候,它會重新複製一份

2018年12月20日;第二變數資料型別及運算子

本次課程所有的編譯程式下載地址: 連結:https://pan.baidu.com/s/1bVTquFh4yaOPZjQGQpn15A 提取碼:482t 複製這段內容後開啟百度網盤手機App,操作更方便哦 一、作業 1、商場為員工提供了基本工資、物價津貼及房租津貼。其中,物價津貼為基本工資的40%,房租

第十三 查詢排序

13.1 Java類庫中的查詢與排序 (1) ArrayList或者LinkedList物件,可以呼叫它的indexOf方法來進行查詢. 該方法通過檢查列表中的每一個元素來查詢目標值, 列表如果含有所要查詢的資料, 它將返回第一個符合條件的資料的索引值,否則返回-1.  index

浙江中醫藥大學-《資料結構》(C語言版)-第一-第二概念程式碼

ZCMU-Data Structure(C language) Part 1 Exordium 1、Data:能夠輸入到計算機中並被計算機程式處理的符號的總稱。 2、Data Element:資料的基本單位,資料元素用以完整的描述一個物件。 3、Data Item:組成資料

Python學習系列-----第二 操作符表示式

  2.1 數學運算和賦值的簡便方法     例如:        2.2 優先順序     在python中運算子有優先順序之分,高優先順序的運算子先執行,低優先順序的運算子後執行。下面是運算子優先順序:(同一行的運算子具有相同的優先順序)        2.3 改變優先

《Hadoop生態》——第二 資料庫資料管理——Accumulo

Accumulo 許可證: Apache License, Version 2.0 活躍度: 高 目的: 帶有單元級安全的Name-value資料庫 官方地址: Hadoop整合: 完全整合 你有這麼一個應用,它可以很好

《現代作業系統(中文第三版)》課後習題——第二 程序執行緒

第二章 程序和執行緒 1、圖2-2中給出了三個程序狀態,在理論上,三個狀態可以有六種轉換,每個狀態兩個。但是,圖中只給出了四種轉換。有沒有可能發生其他兩種轉換中的一個或兩個? 答:從阻塞到執行的轉換是可以想象的。假設某個程序在I/O上阻塞,而且I/O結束,如果此時CPU空

第二 檢視檢視控制器

2.1    Window-你的工作平臺 2.1.1 視窗、 2.1.2 視窗與檢視 2.2    檢視簡介 2.2.1 檢視基本概念 2.2.2 檢視與介面控制元件的關係 2.2.3 檢視的frame和bounds 2.2.4 新增與刪除子檢視 2.3    UIKit

自考(2017年版)《作業系統》——第二思考練習題參考答案(自做)

1.請簡述處理器的組成和工作原理。你認為哪些部分和作業系統密切相關,為什麼? 答:處理器一般由運算器、控制器、一系列的暫存器以及快取記憶體構成。其中,運算器實現指令中的算術和邏輯運算,是計算機的核心。控制器負責控制長征執行的流程。暫存器是一種暫時儲存器件,用於

HTTP 權威指南 第二 URL 資源

機制 應用程序 之間 轉義 mailto amp 路徑 path 內容 前言 這一章節講述了關於 URL 的相關知識,主要包括下面的內容: URL 語法 URL 快捷方式 URL 編碼與字符規則 常見的 URL 方案 URL 的未來—&mdash