Home | 简体中文 | 繁体中文 | 杂文 | 知乎专栏 | Github | OSChina 博客 | 云社区 | 云栖社区 | Facebook | Linkedin | 视频教程 | 打赏(Donations) | About
知乎专栏多维度架构 微信号 netkiller-ebook | QQ群:128659835 请注明“读者”

第 7 章 Spring Data

目录

7.1. Jackson
7.1.1. @JsonIgnore 返回json是不含有该字段
7.1.2. @JsonFormat 格式化 json 时间格式
7.1.2.1. 日期格式化
7.1.2.2. 时区
7.1.2.3. 枚举
7.1.2.4. 枚举
7.1.3. @JsonComponent
7.2. Spring Data with Redis
7.2.1. 集成 Redis XML 方式
7.2.1.1. pom.xml
7.2.1.2. springframework-servlet.xml
7.2.1.3. Controller
7.2.1.4. index.jsp
7.2.1.5. 测试
7.2.2. RedisTemplate
7.2.2.1. stringRedisTemplate 基本用法
7.2.2.2. 设置缓存时间
7.2.2.3. 字符串截取
7.2.2.4. 追加字符串
7.2.2.5. 设置键的字符串值并返回其旧值
7.2.2.6. increment
7.2.2.7. 删除 key
7.2.2.8. 返回字符串长度
7.2.2.9. 如果key不存便缓存。
7.2.2.10. 缓存多个值 /获取多个值 multiSet / multiGet
7.2.2.11. List
7.2.2.11.1. rightPush
7.2.2.11.2. rightPushAll
7.2.2.11.3. rightPushIfPresent
7.2.2.11.4. leftPush
7.2.2.11.5. leftPushAll
7.2.2.11.6. range
7.2.2.12. SET 数据类型
7.2.2.12.1. 返回集合中的所有成员
7.2.2.12.2. 取出一个成员
7.2.2.12.3. 随机获取无序集合中的一个元素
7.2.2.12.4. 随机获取 n 个成员(存在重复数据)
7.2.2.12.5. 随机获取 n 个不重复成员
7.2.2.12.6. 在两个 SET 间移动数据
7.2.2.12.7. 成员删除
7.2.2.12.8. 返回集合数量
7.2.2.12.9. 判断元素是否在集合成员中
7.2.2.12.10. 对比两个集合求交集
7.2.2.12.11. 对比两个集合求交集,然后存储到新的 key 中
7.2.2.12.12. 合并两个集合,并去处重复数据
7.2.2.12.13. 合并两个集合去重复后保存到新的 key 中
7.2.2.12.14. 计算两个合集的差集
7.2.2.12.15. 计算两个合集的差集,然后保存到新的 key 中
7.2.2.12.16. 遍历 SET 集合
7.2.2.13. 有序的 set 集合
7.2.2.14. Hash
7.2.2.14.1. put
7.2.2.14.2. putAll
7.2.2.14.3. 从键中的哈希获取给定hashKey的值
7.2.2.14.4. delete
7.2.2.14.5. 确定哈希hashKey是否存在
7.2.2.14.6. 从哈希中获取指定的多个 hashKey 的值
7.2.2.14.7. 只有hashKey不存在时才能添加值
7.2.2.14.8. 获取整个Hash
7.2.2.14.9. 获取所有key
7.2.2.14.10. 通过 hashKey 获取所有值
7.2.2.14.11. 值加法操作
7.2.2.14.12. 遍历 Hash 表
7.2.2.15. 过期时间未执行
7.2.2.16. setBit / getBit 二进制位操作
7.2.2.17. 存储 Json 对象
7.2.2.17.1. 集成 RedisTemplate 定义新类 JsonRedisTemplate
7.2.2.17.2. 配置 Redis
7.2.2.17.3. 测试
7.2.3. Spring Data Redis - Repository Examples
7.2.3.1. @EnableRedisRepositories 启动 Redis 仓库
7.2.3.2. 定义 Domain 类
7.2.3.3. Repository 接口
7.2.3.4. 测试代码
7.3. Spring Data with MongoDB
7.3.1. Example Spring Data MongoDB
7.3.1.1. pom.xml
7.3.1.2. springframework-servlet.xml
7.3.1.3. POJO
7.3.1.4. Controller
7.3.1.5. 查看测试结果
7.3.1.6. 条件查询
7.3.2. @Document
7.3.2.1. 指定表名
7.3.2.2. @Id
7.3.2.3. @Version
7.3.2.4. @Field 定义字段名
7.3.2.5. @Indexed
7.3.2.5.1. 普通索引
7.3.2.5.2. 唯一索引
7.3.2.5.3. 索引排序方式
7.3.2.5.4. 稀疏索引
7.3.2.5.5. 索引过期时间设置
7.3.2.6. @CompoundIndex 复合索引
7.3.2.6.1. 普通复合索引
7.3.2.6.2. 唯一复合索引
7.3.2.7. @TextIndexed
7.3.2.8. @GeoSpatialIndex 地理位置索引
7.3.2.9. @Transient 丢弃数据,不存到 mongodb
7.3.2.10. @DBRef 做外外键引用
7.3.2.10.1. Article 类
7.3.2.10.2. Hypermedia 类
7.3.2.10.3. MongoRepository
7.3.2.10.4. RestController
7.3.2.10.5. 运行结果
7.3.2.11. @DateTimeFormat
7.3.2.12. @NumberFormat
7.3.2.13. 在 @Document 中使用 Enum 类型
7.3.2.14. 在 @Document 中定义数据结构 List/Map
7.3.2.15. GeoJson 数据类型
7.3.3. MongoRepository
7.3.3.1. 扫描仓库接口
7.3.3.2. findAll()
7.3.3.3. deleteAll()
7.3.3.4. save()
7.3.3.5. count()
7.3.3.6. exists() 判断是否存在
7.3.3.7. existsById()
7.3.3.8. findByXXXX
7.3.3.9. findAll with OrderBy
7.3.3.9.1. order by boolean 布尔型数据排序
7.3.3.10. findAll with Sort
7.3.3.11. FindAll with Pageable
7.3.3.11.1. PageRequest - springboot 1.x 旧版本
7.3.3.12. StartingWith 和 EndingWith
7.3.3.13. Between
7.3.3.14. Before / After
7.3.3.15. @Query
7.3.4. mongoTemplate
7.3.4.1. Save 保存
7.3.4.2. Insert
7.3.4.3. updateFirst 修改符合条件第一条记录
7.3.4.4. updateMulti 修改符合条件的所有
7.3.4.5. 查找并保存
7.3.4.6. upsert - 修改符合条件时如果不存在则添加
7.3.4.7. 删除
7.3.4.8. 查找一条数据
7.3.4.9. 查找所有数据
7.3.4.10. Query
7.3.4.10.1. 翻页
7.3.4.10.2. between
7.3.4.11. Criteria
7.3.4.11.1. is
7.3.4.11.2. Regex 正则表达式搜索
7.3.4.11.3. lt 和 gt
7.3.4.11.4. exists()
7.3.4.11.5. 包含
7.3.4.12. Update
7.3.4.12.1. set
7.3.4.12.2. 追加数据
7.3.4.12.3. 更新数据
7.3.4.12.4. 删除数据
7.3.4.12.5. inc
7.3.4.12.6. update.addToSet
7.3.4.13. BasicUpdate
7.3.4.14. Sort
7.3.4.15. Query + PageRequest
7.3.4.16. newAggregation
7.3.4.17. 创建索引
7.3.4.18. 子对象操作
7.3.4.18.1. List 类型
7.3.5. GeoJson 反序列化
7.3.6. FAQ
7.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
7.4. Spring Data with MySQL
7.4.1. 选择数据库表引擎
7.4.2. 声明实体
7.4.2.1. @Entity 声明实体
7.4.2.2. @Table 定义表名
7.4.2.2.1. catalog
7.4.2.2.2. schema
7.4.2.2.3. uniqueConstraints
7.4.2.3. @Id 定义主键
7.4.2.4. @Column 定义字段
7.4.2.4.1. 字段长度
7.4.2.4.2. 浮点型
7.4.2.4.3. 创建于更新控制
7.4.2.4.4. TEXT 类型
7.4.2.4.5. 整形数据类型
7.4.2.5. @Lob 注解属性将被持久化为 Blog 或 Clob 类型
7.4.2.6. @NotNull 不能为空声明
7.4.2.7. @Temporal 日期定义
7.4.2.8. @DateTimeFormat 处理日期时间格式
7.4.2.9. 默认时间规则
7.4.2.9.1. CreatedDate
7.4.2.9.2. 与时间日期有关的 hibernate 注解
7.4.2.9.3. 数据库级别的默认创建日期时间定义
7.4.2.9.4. 数据库级别的默认创建日期与更新时间定义
7.4.2.9.5. 最后修改时间
7.4.2.10. Enum 枚举数据类型
7.4.2.10.1. 实体中处理 enum 类型
7.4.2.10.2. 数据库枚举类型
7.4.2.11. SET 数据结构
7.4.2.12. JSON 数据类型
7.4.2.13. 索引
7.4.2.13.1. 普通索引
7.4.2.13.2. 唯一索引
7.4.2.13.3. 复合索引
7.4.2.14. 创建复合主键
7.4.2.15. @JoinColumn
7.4.2.16. @OneToOne
7.4.2.17. OneToMany 一对多
7.4.2.18. ManyToMany 多对多
7.4.2.19. 外键级联删除
7.4.2.20. 其他
7.4.2.20.1. Cascade
7.4.2.20.2. @JsonIgnore
7.4.2.20.3. @EnableJpaAuditing 开启 JPA 审计功能
7.4.3. 实体继承
7.4.4. Repository
7.4.4.1. CrudRepository
7.4.4.2. JpaRepository
7.4.4.3. findByXXX
7.4.4.3.1. 传 Boolean 参数
7.4.4.3.2. Eunm 传递枚举参数
7.4.4.4. count 操作
7.4.4.5. OrderBy
7.4.4.6. GreaterThan
7.4.4.7. PageRequest 翻页操作
7.4.4.7.1. PageRequest.of
7.4.4.7.2. Pageable
7.4.4.8. Sort 排序操作操作
7.4.4.9. Query
7.4.4.9.1. 参数传递
7.4.4.9.2. 原生 SQL
7.4.4.9.3. @Query 与 Pageagble
7.4.4.9.4. 返回指定字段
7.4.4.9.5. 返回指定的模型
7.4.4.10. @Transactional
7.4.4.10.1. 删除更新需要 @Transactional 注解
7.4.4.10.2. 回滚操作
7.4.4.11. 锁 @Lock
7.5. EntityManager
7.6. Spring Data with JdbcTemplate
7.6.1. execute
7.6.2. queryForInt
7.6.3. queryForLong
7.6.4. queryForObject
7.6.4.1. 返回整形与字符型
7.6.4.2. 查询 Double 类型数据库
7.6.4.3. 返回日期
7.6.4.4. 返回结果集
7.6.4.5. 通过 "?" 向SQL传递参数
7.6.4.6. RowMapper 记录映射
7.6.5. queryForList
7.6.5.1. Iterator 用法
7.6.5.2. for 循环
7.6.5.3. forEach 用法
7.6.6. queryForMap
7.6.7. query
7.6.7.1. ResultSet
7.6.7.2. ResultSetExtractor
7.6.7.3. RowMapper
7.6.8. queryForRowSet
7.6.9. update
7.6.10.
7.6.11. 实例参考
7.6.11.1. 参数传递技巧
7.7. Spring Data with Elasticsearch
7.7.1. 内嵌 Elasticsearch
7.7.1.1. Maven
7.7.1.2. src/main/resources/application.properties
7.7.1.3. Domain Class
7.7.1.4. ElasticsearchRepository
7.7.1.5. SearchRestController
7.7.1.6. 测试
7.7.2. 集群模式
7.7.3. Document
7.7.4. Elasticsearch 删除操作
7.7.5. FAQ
7.7.5.1. java.lang.IllegalStateException: Received message from unsupported version: [2.0.0] minimal compatible version is: [5.0.0]
7.8. Spring Data FAQ
7.8.1. No identifier specified for entity
7.8.2. Oracle Date 类型显示日期和时间
7.8.3. java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
7.8.4. Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query

7.1. Jackson

7.1.1. @JsonIgnore 返回json是不含有该字段

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

7.1.2. @JsonFormat 格式化 json 时间格式

7.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();			
			
			

7.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;	
} 			
			
			

7.1.2.3. 枚举

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

7.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
} 
			
			

7.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();
	}

}