Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

第 8 章 Spring Data

目錄

8.1. Jackson
8.1.1. @JsonIgnore 返回json是不含有該欄位
8.1.2. @JsonFormat 格式化 json 時間格式
8.1.2.1. 日期格式化
8.1.2.2. 時區
8.1.2.3. 枚舉
8.1.2.4. 枚舉
8.1.3. @JsonComponent
8.2. Spring Data with Redis
8.2.1. 整合 Redis XML 方式
8.2.1.1. pom.xml
8.2.1.2. springframework-servlet.xml
8.2.1.3. Controller
8.2.1.4. index.jsp
8.2.1.5. 測試
8.2.2. RedisTemplate
8.2.2.1. stringRedisTemplate 基本用法
8.2.2.2. 設置緩存時間
8.2.2.3. 字元串截取
8.2.2.4. 追加字元串
8.2.2.5. 設置鍵的字元串值並返回其舊值
8.2.2.6. increment
8.2.2.7. 刪除 key
8.2.2.8. 返回字元串長度
8.2.2.9. 如果key不存便緩存。
8.2.2.10. 緩存多個值 /獲取多個值 multiSet / multiGet
8.2.2.11. List
8.2.2.11.1. rightPush
8.2.2.11.2. rightPushAll
8.2.2.11.3. rightPushIfPresent
8.2.2.11.4. leftPush
8.2.2.11.5. leftPushAll
8.2.2.11.6. range
8.2.2.12. SET 數據類型
8.2.2.12.1. 返回集合中的所有成員
8.2.2.12.2. 取出一個成員
8.2.2.12.3. 隨機獲取無序集合中的一個元素
8.2.2.12.4. 隨機獲取 n 個成員(存在重複數據)
8.2.2.12.5. 隨機獲取 n 個不重複成員
8.2.2.12.6. 在兩個 SET 間移動數據
8.2.2.12.7. 成員刪除
8.2.2.12.8. 返回集合數量
8.2.2.12.9. 判斷元素是否在集合成員中
8.2.2.12.10. 對比兩個集合求交集
8.2.2.12.11. 對比兩個集合求交集,然後存儲到新的 key 中
8.2.2.12.12. 合併兩個集合,並去處重複數據
8.2.2.12.13. 合併兩個集合去重複後保存到新的 key 中
8.2.2.12.14. 計算兩個合集的差集
8.2.2.12.15. 計算兩個合集的差集,然後保存到新的 key 中
8.2.2.12.16. 遍歷 SET 集合
8.2.2.13. 有序的 set 集合
8.2.2.14. Hash
8.2.2.14.1. put
8.2.2.14.2. putAll
8.2.2.14.3. 從鍵中的哈希獲取給定hashKey的值
8.2.2.14.4. delete
8.2.2.14.5. 確定哈希hashKey是否存在
8.2.2.14.6. 從哈希中獲取指定的多個 hashKey 的值
8.2.2.14.7. 只有hashKey不存在時才能添加值
8.2.2.14.8. 獲取整個Hash
8.2.2.14.9. 獲取所有key
8.2.2.14.10. 通過 hashKey 獲取所有值
8.2.2.14.11. 值加法操作
8.2.2.14.12. 遍歷 Hash 表
8.2.2.15. 過期時間未執行
8.2.2.16. setBit / getBit 二進制位操作
8.2.2.17. 存儲 Json 對象
8.2.2.17.1. 整合 RedisTemplate 定義新類 JsonRedisTemplate
8.2.2.17.2. 配置 Redis
8.2.2.17.3. 測試
8.2.3. Spring Data Redis - Repository Examples
8.2.3.1. @EnableRedisRepositories 啟動 Redis 倉庫
8.2.3.2. 定義 Domain 類
8.2.3.3. Repository 介面
8.2.3.4. 測試代碼
8.3. Spring Data with MongoDB
8.3.1. Example Spring Data MongoDB
8.3.1.1. pom.xml
8.3.1.2. springframework-servlet.xml
8.3.1.3. POJO
8.3.1.4. Controller
8.3.1.5. 查看測試結果
8.3.1.6. 條件查詢
8.3.2. @Document
8.3.2.1. 指定表名
8.3.2.2. @Id
8.3.2.3. @Version
8.3.2.4. @Field 定義欄位名
8.3.2.5. @Indexed
8.3.2.5.1. 普通索引
8.3.2.5.2. 唯一索引
8.3.2.5.3. 索引排序方式
8.3.2.5.4. 稀疏索引
8.3.2.5.5. 索引過期時間設置
8.3.2.6. @CompoundIndex 復合索引
8.3.2.6.1. 普通復合索引
8.3.2.6.2. 唯一復合索引
8.3.2.7. @TextIndexed
8.3.2.8. @GeoSpatialIndex 地理位置索引
8.3.2.9. @Transient 丟棄數據,不存到 mongodb
8.3.2.10. @DBRef 做外外鍵引用
8.3.2.10.1. Article 類
8.3.2.10.2. Hypermedia 類
8.3.2.10.3. MongoRepository
8.3.2.10.4. RestController
8.3.2.10.5. 運行結果
8.3.2.11. @DateTimeFormat
8.3.2.12. @NumberFormat
8.3.2.13. 在 @Document 中使用 Enum 類型
8.3.2.14. 在 @Document 中定義資料結構 List/Map
8.3.2.15. GeoJson 數據類型
8.3.3. MongoRepository
8.3.3.1. 掃瞄倉庫介面
8.3.3.2. findAll()
8.3.3.3. deleteAll()
8.3.3.4. save()
8.3.3.5. count()
8.3.3.6. exists() 判斷是否存在
8.3.3.7. existsById()
8.3.3.8. findByXXXX
8.3.3.9. findAll with OrderBy
8.3.3.9.1. order by boolean 布爾型數據排序
8.3.3.10. findAll with Sort
8.3.3.11. FindAll with Pageable
8.3.3.11.1. PageRequest - springboot 1.x 舊版本
8.3.3.12. StartingWith 和 EndingWith
8.3.3.13. Between
8.3.3.14. Before / After
8.3.3.15. @Query
8.3.4. mongoTemplate
8.3.4.1. Save 保存
8.3.4.2. Insert
8.3.4.3. updateFirst 修改符合條件第一條記錄
8.3.4.4. updateMulti 修改符合條件的所有
8.3.4.5. 查找並保存
8.3.4.6. upsert - 修改符合條件時如果不存在則添加
8.3.4.7. 刪除
8.3.4.8. 查找一條數據
8.3.4.9. 查找所有數據
8.3.4.10. Query
8.3.4.10.1. 翻頁
8.3.4.10.2. between
8.3.4.11. Criteria
8.3.4.11.1. is
8.3.4.11.2. Regex 正則表達式搜索
8.3.4.11.3. lt 和 gt
8.3.4.11.4. exists()
8.3.4.11.5. 包含
8.3.4.12. Update
8.3.4.12.1. set
8.3.4.12.2. 追加數據
8.3.4.12.3. 更新數據
8.3.4.12.4. 刪除數據
8.3.4.12.5. inc
8.3.4.12.6. update.addToSet
8.3.4.13. BasicUpdate
8.3.4.14. Sort
8.3.4.15. Query + PageRequest
8.3.4.16. newAggregation
8.3.4.17. 創建索引
8.3.4.18. 子對象操作
8.3.4.18.1. List 類型
8.3.5. GeoJson 反序列化
8.3.6. FAQ
8.3.6.1. location object expected, location array not in correct format; nested exception is com.mongodb.MongoWriteException: location object expected, location array not in correct format
8.4. Spring Data with MySQL
8.4.1. 選擇資料庫表引擎
8.4.2. 聲明實體
8.4.2.1. @Entity 聲明實體
8.4.2.2. @Table 定義表名
8.4.2.2.1. catalog
8.4.2.2.2. schema
8.4.2.2.3. uniqueConstraints
8.4.2.3. @Id 定義主鍵
8.4.2.4. @Column 定義欄位
8.4.2.4.1. 欄位長度
8.4.2.4.2. 浮點型
8.4.2.4.3. 創建於更新控制
8.4.2.4.4. TEXT 類型
8.4.2.4.5. 整形數據類型
8.4.2.5. @Lob 註解屬性將被持久化為 Blog 或 Clob 類型
8.4.2.6. @NotNull 不能為空聲明
8.4.2.7. @Temporal 日期定義
8.4.2.8. @DateTimeFormat 處理日期時間格式
8.4.2.9. 預設時間規則
8.4.2.9.1. CreatedDate
8.4.2.9.2. 與時間日期有關的 hibernate 註解
8.4.2.9.3. 資料庫級別的預設創建日期時間定義
8.4.2.9.4. 資料庫級別的預設創建日期與更新時間定義
8.4.2.9.5. 最後修改時間
8.4.2.10. Enum 枚舉數據類型
8.4.2.10.1. 實體中處理 enum 類型
8.4.2.10.2. 資料庫枚舉類型
8.4.2.11. SET 資料結構
8.4.2.12. JSON 數據類型
8.4.2.13. 索引
8.4.2.13.1. 普通索引
8.4.2.13.2. 唯一索引
8.4.2.13.3. 復合索引
8.4.2.14. 創建復合主鍵
8.4.2.15. @JoinColumn
8.4.2.16. @OneToOne
8.4.2.17. OneToMany 一對多
8.4.2.18. ManyToMany 多對多
8.4.2.19. 外鍵級聯刪除
8.4.2.20. 其他
8.4.2.20.1. Cascade
8.4.2.20.2. @JsonIgnore
8.4.2.20.3. @EnableJpaAuditing 開啟 JPA 審計功能
8.4.3. 實體繼承
8.4.4. Repository
8.4.4.1. CrudRepository
8.4.4.2. JpaRepository
8.4.4.3. findByXXX
8.4.4.3.1. 傳 Boolean 參數
8.4.4.3.2. Eunm 傳遞枚舉參數
8.4.4.4. count 操作
8.4.4.5. OrderBy
8.4.4.6. GreaterThan
8.4.4.7. PageRequest 翻頁操作
8.4.4.7.1. PageRequest.of
8.4.4.7.2. Pageable
8.4.4.8. Sort 排序操作操作
8.4.4.9. Query
8.4.4.9.1. 參數傳遞
8.4.4.9.2. 原生 SQL
8.4.4.9.3. @Query 與 Pageagble
8.4.4.9.4. 返回指定欄位
8.4.4.9.5. 返回指定的模型
8.4.4.10. @Transactional
8.4.4.10.1. 刪除更新需要 @Transactional 註解
8.4.4.10.2. 回滾操作
8.4.4.11. 鎖 @Lock
8.5. EntityManager
8.6. Spring Data with JdbcTemplate
8.6.1. execute
8.6.2. queryForInt
8.6.3. queryForLong
8.6.4. queryForObject
8.6.4.1. 返回整形與字元型
8.6.4.2. 查詢 Double 類型資料庫
8.6.4.3. 返回日期
8.6.4.4. 返回結果集
8.6.4.5. 通過 "?" 向SQL傳遞參數
8.6.4.6. RowMapper 記錄映射
8.6.5. queryForList
8.6.5.1. Iterator 用法
8.6.5.2. for 循環
8.6.5.3. forEach 用法
8.6.6. queryForMap
8.6.7. query
8.6.7.1. ResultSet
8.6.7.2. ResultSetExtractor
8.6.7.3. RowMapper
8.6.8. queryForRowSet
8.6.9. update
8.6.10.
8.6.11. 實例參考
8.6.11.1. 參數傳遞技巧
8.7. Spring Data with Elasticsearch
8.7.1. 內嵌 Elasticsearch
8.7.1.1. Maven
8.7.1.2. src/main/resources/application.properties
8.7.1.3. Domain Class
8.7.1.4. ElasticsearchRepository
8.7.1.5. SearchRestController
8.7.1.6. 測試
8.7.2. 集群模式
8.7.3. Document
8.7.4. Elasticsearch 刪除操作
8.7.5. FAQ
8.7.5.1. java.lang.IllegalStateException: Received message from unsupported version: [2.0.0] minimal compatible version is: [5.0.0]
8.8. Spring Data FAQ
8.8.1. No identifier specified for entity
8.8.2. Oracle Date 類型顯示日期和時間
8.8.3. java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
8.8.4. Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query

8.1. Jackson

8.1.1. @JsonIgnore 返回json是不含有該欄位

			
	@JsonIgnore
	private String entityName = this.getClass().getSimpleName();	
			
		

8.1.2. @JsonFormat 格式化 json 時間格式

8.1.2.1. 日期格式化

預設 json 中的時間格式是這樣的

			
"createDate":"2018-09-11T07:34:20.106+0000","updateDate":"2018-09-11T07:34:20.106+0000"			
			
			

@JsonFormat 可以格式化 json 返回的時間格式。

			
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")			
			
			

格式化後

			
"createDate":"2018-09-11 07:42:44","updateDate":"2018-09-11 07:42:44"			
			
			

解決時區問題,MongoDb 預設使用UTC,顯示時間相差8小時

			
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")	
private Date createdDate = new Date();			
			
			

8.1.2.2. 時區

			
public class Test {
   @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MMM-dd HH:mm:ss z", timezone="EST")
   @JsonProperty("pubDate")
   private Date recentBookPubDate;	
} 			
			
			

8.1.2.3. 枚舉

			
public class Test {
   @JsonFormat(shape=JsonFormat.Shape.NUMBER)
   @JsonProperty("birthDate")
   private Date birthDate;
} 
			
			
			
{
  "birthDate" : 1528702883858
} 			
			
			

8.1.2.4. 枚舉

			
package cn.netkiller;
import com.fasterxml.jackson.annotation.JsonFormat;

@JsonFormat(shape=JsonFormat.Shape.NUMBER)
enum Code {
    BLOCKING,
    CRITICAL,
    MEDIUM,
    LOW;
} 

@JsonFormat(shape=JsonFormat.Shape.STRING)
enum Lang {
	Java,
	PHP,
	Python
} 
			
			

8.1.3. @JsonComponent

		
package cn.netkiller.json;

public class Member {
	private String name;

	public Member() {
		// TODO Auto-generated constructor stub
	}

	public Member(String name) {
		// TODO Auto-generated constructor stub
		this.name = name;

	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Member [name=" + name + "]";
	}

}
		
		
		
		
package cn.netkiller.json;

import java.io.IOException;

import org.springframework.boot.jackson.JsonComponent;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.TreeNode;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.node.TextNode;

@JsonComponent
public class Json {

	public Json() {
		// TODO Auto-generated constructor stub
	}

	public static class MemberJsonSerializer extends JsonSerializer<Member> {

		@Override
		public void serialize(Member value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
			// TODO Auto-generated method stub
			gen.writeStartObject();
			gen.writeStringField("member", value.toString());
			gen.writeEndObject();

		}
	}

	public static class MemberJsonDeserializer extends JsonDeserializer<Member> {

		@Override
		public Member deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
			// TODO Auto-generated method stub
			TreeNode treeNode = p.getCodec().readTree(p);
			TextNode member = (TextNode) treeNode.get("member");
			return new Member(member.asText());
		}
	}
}		
		
		
		
package cn.netkiller.json.controller;

import cn.netkiller.json.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 *
 * @author neo
 */
@RestController
public class SimpleController {

	@Autowired
	public ObjectMapper objectMapper;

	@GetMapping("/")
	public String home() throws JsonMappingException, JsonProcessingException {
		String json = "{\"name\":\"netkiller\"}";
		Member member = objectMapper.readValue(json, Member.class);
		System.out.println(member.getName());
		return member.getName();
	}

}