一.整合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); } } }