- 前言
- 第一部分 基础应用开发
- 第 1 章 Spring Boot 入门
- 第 2 章 在 Spring Boot 中使用数据库
- 第 3 章 Spring Boot 界面设计
- 第 4 章 提高数据库访问性能
- 第 5 章 Spring Boot 安全设计
- 第二部分 分布式应用开发
- 第 6 章 Spring Boot SSO
- 第 7 章 使用分布式文件系统
- 第 8 章 云应用开发
- 第 9 章 构建高性能的服务平台
- 第三部分 核心技术源代码分析
- 第 10 章 Spring Boot 自动配置实现原理
- 第 11 章 Spring Boot 数据访问实现原理
- 第 12 章 微服务核心技术实现原理
- 附录 A 安装 Neo4j
- 附录 B 安装 MongoDB
- 附录 C 安装 Redis
- 附录 D 安装 RabbitMQ
- 结束语
2.3 使用 MongoDB
在当前流行的 NoSQL 数据库中,MongoDB 是大家接触比较早而且用得比较多的数据库。MongoDB 是文档型的 NoSQL 数据库,具有大数据量、高并发等优势,但缺点是不能建立实体关系,而且也没有事务管理机制。
2.3.1 MongoDB 依赖配置
在 Spring Boot 中使用 MongoDB 也像使用 JPA 一样容易,并且同样拥有功能完善的资源库。同样的,要使用 MongoDB,首先必须在工程的 Maven 中引入它的依赖,如代码清单 2-14 所示。除了 MongoDB 本身的依赖之外,还需要一些附加的工具配套使用。
代码清单 2-14 使用 MongoDB 的 Maven 依赖配置
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
</dependency>
<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>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
</dependencies>
2.3.2 文档建模
MongoDB 是文档型数据库,使用 MongoDB 也可以像使用关系型数据库那样为文档建模。如代码清单 2-15 所示,为用户文档建模,它具有用户名、密码、用户名称、邮箱和注册日期等字段,有一个用来保存用户角色的数据集,还定义了一个构造函数,可以很方便地用来创建一个用户实例。
代码清单 2-15 用户文档建模
@Document(collection = "user")
public class User {
@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 User() { }
@PersistenceConstructor
public User(String userId, String username, String password, String name, String email,
Date registrationDate, Set<String> roles) {
this.userId = userId;
this.username = username;
this.password = password;
this.name = name;
this.email = email;
this.registrationDate = registrationDate;
this.roles = roles;
}……
2.3.3 文档持久化
MongoDB 也有像使用 JPA 那样的资源库,如代码清单 2-16 所示,为用户文档创建了一个 Repository 接口,继承于 MongoRepository,实现了文档持久化。
代码清单 2-16 用户文档持久化
public interface UserRepository extends MongoRepository<User, String> {
User findByUsername(String username);
}
MongoRepository 的继承关系如图 2-4 所示,看起来跟 JPA 的资源库的继承关系没有什么两样,它也包含访问数据库的丰富功能。

图 2-4 MongoRepository 接口继承关系
代码清单 2-17 是用在测试中的使用 MongoDB 的一个配置类定义,其中 @PropertySource 指定读取数据库配置文件的位置和名称,@EnableMongoRepositories 启用资源库并设定定义资源库接口放置的位置,这里使用环境变量 Environment 来读取配置文件的一些数据库配置参数,然后使用一个数据库客户端,连接 MongoDB 服务器。
代码清单 2-17 TestDataSourceConfig 配置类
@Configuration
@EnableMongoRepositories(basePackages = "dbdemo.mongo.repositories")
@PropertySource("classpath:test.properties")
public class TestDataSourceConfig extends AbstractMongoConfiguration {
@Autowired private Environment env;
@Override
public 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.4 MongoDB 测试
如果还没有安装 MongoDB 服务器,可以参照附录 B 的方法安装并启动一个 MongoDB 服务器。然后,使用如代码清单 2-18 所示的配置方法配置连接服务器的一些参数,该配置假定你的 MongoDB 服务器安装在本地,并使用默认的数据库端口:27017。
代码清单 2-18 MongoDB 数据库配置
# MongoDB mongo.host=localhost mongo.name=test mongo.port=27017
这样就可以编写一个 JUint 测试例子来测试 UserRepository 接口的使用情况,如代码清单 2-19 所示。测试例子首先使用用户文档类创建一个用户对象实例,然后使用资源库接口调用 save 方法将用户对象保存到数据库中,最后使用 findAll 方法查询所有用户的列表,并使用一个循环输出用户的简要信息。
代码清单 2-19 MongoDB 测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestDataSourceConfig.class})
@FixMethodOrder
public class RepositoryTests {
private static Logger logger = LoggerFactory.getLogger(RepositoryTests.class);
@SuppressWarnings("SpringJavaAutowiringInspection") @Autowired
UserRepository userRepository;
@Before
public void setup(){
Set<String> roles = new HashSet<>();
roles.add("manage");
User user = new User("1","user","12345678","name","email@com.cn",new Date(),
roles);
userRepository.save(user);
}
@Test
public void findAll(){
List<User> users = userRepository.findAll();
Assert.notNull(users);
for(User user : users){
logger.info("===user=== userid:{}, username:{}, pass:{}, registra
tionDate:{}",
user.getUserId(), user.getName(), user.getPassword(), user.
getRegistrationDate());
}
}
}
现在可以在 IDEA 的 Run/Debug Configuration 配置中增加一个 JUint 测试项目,模块选择 mongodb,工作目录选择模块所在的工程根目录,类选择上面编写的测试例子,即 dbdemo.mongo.test.RepositoryTests,并将配置保存为 mongotest。
使用 Debug 方式运行测试项目 mongotest。如果通过测试,将输出查到的用户的简要信息,如下所示:
dbdemo.mongo.test.RepositoryTests - ===user=== userid:1, username:name, pass:12345678, registrationDate:Tue Jun 07 14:26:02 CST 2016
这时使用 MongoDB 数据库客户端输入下面的查询指令,也可以查到这条文档的详细信息,这是一条 JSON 结构的文本信息。
> db.user.find()
{ "_id" : "1", "_class" : "dbdemo.mongo.models.User", "username" :
"user", "password" : "12345678", "name" : "name", "email" : "email@com.cn",
"registrationDate" : ISODate("2016-04-13T06:27:02.423Z"), "roles" : [ "manage" ] }
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论