springboot学习笔记-3 整合redis&mongodb
Posted 大胡龙的小圈子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot学习笔记-3 整合redis&mongodb相关的知识,希望对你有一定的参考价值。
一.整合redis
1.1 建立实体类
@Entity @Table(name="user") public class User implements Serializable { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String name; @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date createDate; @JsonBackReference //防止json的重复引用问题 private Department department; private Set<Role> roles; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } public Set<Role> getRoles() { return roles; } public void setRoles(Set<Role> roles) { this.roles = roles; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", createDate=" + createDate + ", department=" + department + ", roles=" + roles + "]"; } }
1.2 建立Redis的配置类
首先导入pom.xml相应的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency>
在springboot中,没有去提供直接操作Redis的Repository,但是我们可以使用RedisTemplate去访问Redis.想要去使用RedisTemplate,首先需要完成一些必要的配置.这里使用配置类去完成.
在application.properties中建立Redis的相关配置:
建立配置类,配置RedisTemplate,而要使用RedisTemplate还需要配置RedisConnectionFactory:
@ConfigurationProperties("application.properties") @Configuration public class RedisConfig { @Value("${spring.redis.hostName}") private String hostName; @Value("${spring.redis.port}") private Integer port; @Bean public RedisConnectionFactory redisConnectionFactory() { JedisConnectionFactory cf = new JedisConnectionFactory(); cf.setHostName(hostName); cf.setPort(port); cf.afterPropertiesSet(); return cf; } @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template=new StringRedisTemplate(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om=new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } }
1.3 建立UserRedis类,它实现了与Redis的交互
注意,在UserRedis中,使用了Redis的数据结构中最常用的key-value都是字符串的形式,采用Gson将对象转化为字符串然后存放到redis中.
@Repository public class UserRedis { @Autowired private RedisTemplate<String, String> redisTemplate; public void add(String key,User user) { Gson gson=new Gson(); redisTemplate.opsForValue().set(key,gson.toJson(user)); } public void add(String key,List<User> users) { Gson gson=new Gson(); redisTemplate.opsForValue().set(key,gson.toJson(users)); } public User get(String key ) { Gson gson=new Gson(); User user=null; String userStr=redisTemplate.opsForValue().get(key); if(!StringUtils.isEmpty(userStr)) user=gson.fromJson(userStr, User.class); return user; } public List<User> getList(String key) { Gson gson=new Gson(); List<User> users=null; String listJson=redisTemplate.opsForValue().get(key); if(!StringUtils.isEmpty(listJson)) { users=gson.fromJson(listJson,new TypeToken<List<User>>(){}.getType()); } return users; } public void delete(String key) { redisTemplate.opsForValue().getOperations().delete(key); } }
1.4 建立UserController类
它自动注入了UserRedis类,通过不同的url实现了向redis存储数据,获取数据的功能.
@Controller public class UserController { @Autowired UserRedis userRedis; @RequestMapping("/user/testRedisSave") public String testRedis() { Department department=new Department(); department.setName("开发部"); Role role=new Role(); role.setName("admin"); User user=new User(); user.setName("hlhdidi"); user.setCreateDate(new Date()); user.setDepartment(department); Set<Role> roles=new HashSet<>(); roles.add(role); user.setRoles(roles); userRedis.delete(this.getClass().getName()+":username:"+user.getName()); userRedis.add(this.getClass().getName()+":username:"+user.getName(), user); return null; } @RequestMapping("/user/testRedisGet") public String testRedis2() { User user=userRedis.get(this.getClass().getName()+":username:hlhdidi"); System.out.println(user); return null; } }
先访问localhost:8080/user/testRedisSave,再访问localhost:8080/user/testRedisGet,即可测试成功!
二.整合MongoDB
MongoDB是一种文档类型的NoSql数据库.它内部有三个层次的概念,分别为数据库,集合,文档.使用springboot可以非常方便的整合MongoDB
2.1 建立mongo.properties配置文件
导入依赖:
<dependency> <groupId>org.pegdown</groupId> <artifactId>pegdown</artifactId> <version>1.4.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-hateoas</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> </dependency>
2.2 建立MongoConfig配置类,完成对于MongoDB的配置
@Configuration @EnableMongoRepositories(basePackages={"com.hlhdidi.springboot.mongo"})//MongoRepository的扫描包 @PropertySource("classpath:mongo.properties")//注入配置文件属性 public class MongoConfig extends AbstractMongoConfiguration{ @Autowired private Environment env; @Override protected String getDatabaseName() { return env.getRequiredProperty("mongo.name"); } @Override @Bean public Mongo mongo() throws Exception { ServerAddress serverAddress=new ServerAddress(env.getRequiredProperty("mongo.host")); List<MongoCredential> credentials=new ArrayList<>(); return new MongoClient(serverAddress, credentials); } }
2.3 建立SysUser实体类.
该实体类需要被存储到MongoDB数据库中.
@Document(collection="user")//配置collection的名称,如果没有将会自动建立对应的Collection public class SysUser { @Id private String userId; @NotNull @Indexed(unique=true) private String username; @NotNull private String password; @NotNull private String name; @NotNull private String email; @NotNull private Date registrationDate=new Date(); private Set<String> roles=new HashSet<>(); public SysUser(){} @PersistenceConstructor public SysUser(String userId, String username, String password, String name, String email, Date registrationDate, Set<String> roles) { super(); this.userId = userId; this.username = username; this.password = password; this.name = name; this.email = email; this.registrationDate = registrationDate; this.roles = roles; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Date getRegistrationDate() { return registrationDate; } public void setRegistrationDate(Date registrationDate) { this.registrationDate = registrationDate; } public Set<String> getRoles() { return roles; } public void setRoles(Set<String> roles) { this.roles = roles; } @Override public String toString() { return "SysUser [userId=" + userId + ", username=" + username + ", password=" + password + ", name=" + name + ", email=" + email + ", registrationDate=" + registrationDate + ", roles=" + roles + "]"; } }
2.4 建立SysUserRepository
由于springboot已经帮我们提供了操作MongoDB数据库的API,因此直接继承对应的类即可(和JPA一致)
@Repository public interface SysUserRepository extends MongoRepository<SysUser, String>{ }
2.5 测试
测试类先向MongoDB中存储了一个实体类对象,随后获取指定对象的指定Collections下面的所有文档
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes={MongoConfig.class}) @FixMethodOrder public class MongoTest { @Autowired SysUserRepository repository; @Before public void setup() { Set<String> roles=new HashSet<>(); roles.add("manage"); SysUser sysUser=new SysUser("1", "hlhdidi", "123", "xiaohulong", "email@com.cn", new Date(), roles); repository.save(sysUser); } @Test public void findAll() { List<SysUser> users=repository.findAll(); for(SysUser user:users) { System.out.println(user); } } }
以上是关于springboot学习笔记-3 整合redis&mongodb的主要内容,如果未能解决你的问题,请参考以下文章
微服务SpringBoot 整合Redis 实现点赞点赞排行榜