写在前面
Spring Boot 系列文章源于 深入实践Spring Boot 一书(感谢作者)。时过境迁,我使用了更新的版本来学习。写下系列的博客,一则为了加强记忆,便于回顾,再则也希望帮助到正在学习 Spring Boot 的同学。当然,这也算给自己列下了学习计划吧!
一、依赖配置
MongoDB
是一个开源的NoSQL
文档数据库,它使用类似json
的模式,而不是传统的基于表的关系数据。Spring Boot为使用MongoDB
提供了一些便利,包括spring-boot-starter-data-mongodb
和spring-boot-start-data-mongodb-reactive
“starters”。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
二、连接 MongoDB
访问 MongoDb
,可以注入一个自动配置的 org.springframework.data.mongodb.MongoDbFactory
。默认情况下,这个实例将尝试连接到 mongodb://localhost/test
的 mongoDB
服务器。下面的例子展示了怎样连接到一个 mongodb 数据库:
import org.springframework.data.mongodb.MongoDbFactory;
import com.mongodb.DB;
@Component
public class MyBean {
private final MongoDbFactory mongo;
@Autowired
public MyBean(MongoDbFactory mongo) {
this.mongo = mongo;
}
// ...
public void example() {
DB db = mongo.getDb();
// ...
}
}
三、建模
MongoDB 是文档型数据库,使用 MongoDB 也可以像使用关系型数据库那样为文档建模。
@Document(collection = "admin")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Admin {
@Id
private String adminId;
private String username;
private String password;
private String email;
private Date registrationDate;
private Set<String> roles = new HashSet<>();
}
四、MongoTemplate
Spring Data MongoDB
提供了一个MongoTemplate
类,它的设计与Spring的JdbcTemplate
非常相似。与JdbcTemplate
一样,Spring Boot会自动配置一个bean来注入template
。
五、Spring Data MongoDB Repositories
MongoDB
也有像使用 JPA 那样的资源库:
@Repository
public interface AdminRepository extends MongoRepository<Admin,String> {
}
MongoDB
的配置如下:
@Configuration
@EnableMongoRepositories(basePackages = {"com.duofei.db.mongodb.repository"})
public class MongoConfig {
@Bean
public MongoDbFactory mongoDbFactory(){
MongoClientURI mongoClientURI = new MongoClientURI("mongodb://localhost/test");
MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClientURI);
return mongoDbFactory;
}
}
六、测试
测试代码如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class MongodbTest {
private static Logger logger = LoggerFactory.getLogger(MongodbTest.class);
@Autowired
private AdminRepository adminRepository;
@Before
public void setup(){
HashSet<String> roles = new HashSet<>();
roles.add("manage");
Admin admin = new Admin("1", "duofei", "545454", "324@qq.com", new Date(), roles);
adminRepository.save(admin);
}
@Test
public void findAll(){
List<Admin> admins = adminRepository.findAll();
Assert.assertNotNull(admins);
admins.forEach(admin -> {
logger.info("===admin=== adminId:{},userName:{},pass:{},email:{},registDate:{},roles:{}",
admin.getAdminId(), admin.getUsername(), admin.getPassword(), admin.getEmail(), admin.getRegistrationDate(), admin.getRoles());
});
}
}