版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shuaixingrumo/article/details/82151061
需求场景:
有时候我们需要一个模型对象去映射多张集合, 比如每天的运行日志, 每天采集的大量用户数据, 行为数据等, 这样数据库中是有多个集合的, 并且结构相同, 而我们要读取数据的时候, 就需要用同一个对象映射多个集合
解决办法:
使用spring el表达式
数据对象模型:
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection="#{userRepository.collectionName}")
public class User {
@Id
private String id;
private String username;
private String password;
private String role;
private String permission;
/* getter and setter, toString */
}
#{userRepository.collectionName} userRepository是一个继承MongoRepository的bean对象,collectionName是该对象的一个自定义属性, 用来指定集合名称, 具体代码往下看
编写mongodb的repository
import com.example.BlitzDataStatistics.models.User;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface UserRepository extends MongoRepository<User, String>, UserCustomRepository {
}
可以看到我们的UserRepository不仅继承了接口MongoRepository, 还继承了一个我们自定义的接口UserCustomRepository, 这个自定义接口就是用来设置集合名称的
public interface UserCustomRepository {
String getCollectionName();
void setCollectionName(String collectionName);
}
给这个自定义接口添加一个实现类
public class UserCustomRepositoryImpl implements UserCustomRepository {
private String collectionName="default";
@Override
public String getCollectionName() {
return collectionName;
}
@Override
public void setCollectionName(String collectionName) {
this.collectionName = collectionName;
}
}
到此我们就可以用spring el表达式去设置集合名称了, 下面测试代码
package com.example.BlitzDataStatistics;
import com.example.BlitzDataStatistics.models.User;
import com.example.BlitzDataStatistics.mongodb.MongoConfig;
import com.example.BlitzDataStatistics.mongodb.UserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MongoConfig.class)
public class tests {
@Autowired
private UserRepository ur;
@Test
public void test(){
System.out.println("=========user=========");
ur.setCollectionName("user");
List<User> lu = ur.findAll();
for(User u : lu){
System.out.println(u);
}
System.out.println("===========user2=======");
ur.setCollectionName("user2");
lu = ur.findAll();
for(User u : lu){
System.out.println(u);
}
}
}
先读取集合user中的数据, 再读取集合user2中的数据
测试输出:
=========user=========
User{id='5b3d86c0f9626b11ac000038', username='admin', password='admin', role='admin', permission='1'}
User{id='5b3d86fbf9626b11ac00003c', username='user', password='user', role='user', permission='2'}
===========user2=======
User{id='5b3d86c0f9626b11ac000038', username='admin', password='admin', role='admin', permission='1'}