《深入实践Spring Boot》一2.3 使用MongoDB

简介: 本节书摘来自华章出版社《深入实践Spring Boot》一书中的第2章,第2.3节,作者陈韶健,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 2.3 使用MongoDB 在当前流行的NoSQL数据库中,MongoDB是大家接触比较早而且用得比较多的数据库。

本节书摘来自华章出版社《深入实践Spring Boot》一书中的第2章,第2.3节,作者陈韶健,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

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 findByUsername(String username);

}


3 53de39b4d1b96b0288f74ea5f2589710f571b637

MongoRepository的继承关系如图2-4所示,看起来跟JPA的资源库的继承关系没有什么两样,它也包含访问数据库的丰富功能。
代码清单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方法将用户对象保存到数据库中,最后使用f?indAll方法查询所有用户的列表,并使用一个循环输出用户的简要信息。
代码清单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 Conf?iguration配置中增加一个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" ] }
相关文章
|
4月前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
本文介绍RAG(检索增强生成)技术,结合Spring AI与本地及云知识库实现学术分析AI应用,利用阿里云Qwen-Plus模型提升回答准确性与可信度。
1627 90
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
|
6月前
|
前端开发 Java API
利用 Spring WebFlux 技术打造高效非阻塞 API 的完整开发方案与实践技巧
本文介绍了如何使用Spring WebFlux构建高效、可扩展的非阻塞API,涵盖响应式编程核心概念、技术方案设计及具体实现示例,适用于高并发场景下的API开发。
534 0
|
4月前
|
人工智能 监控 Java
Spring AI Alibaba实践|后台定时Agent
基于Spring AI Alibaba框架,可构建自主运行的AI Agent,突破传统Chat模式限制,支持定时任务、事件响应与人工协同,实现数据采集、分析到决策的自动化闭环,提升企业智能化效率。
Spring AI Alibaba实践|后台定时Agent
|
10月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
1475 0
|
10月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
356 0
|
6月前
|
Java 应用服务中间件 开发者
Spring Boot 技术详解与应用实践
本文档旨在全面介绍 Spring Boot 这一广泛应用于现代企业级应用开发的框架。内容将涵盖 Spring Boot 的核心概念、核心特性、项目自动生成与结构解析、基础功能实现(如 RESTful API、数据访问)、配置管理以及最终的构建与部署。通过本文档,读者将能够理解 Spring Boot 如何简化 Spring 应用的初始搭建和开发过程,并掌握其基本使用方法。
513 2
|
7月前
|
缓存 安全 Java
Spring 框架核心原理与实践解析
本文详解 Spring 框架核心知识,包括 IOC(容器管理对象)与 DI(容器注入依赖),以及通过注解(如 @Service、@Autowired)声明 Bean 和注入依赖的方式。阐述了 Bean 的线程安全(默认单例可能有安全问题,需业务避免共享状态或设为 prototype)、作用域(@Scope 注解,常用 singleton、prototype 等)及完整生命周期(实例化、依赖注入、初始化、销毁等步骤)。 解析了循环依赖的解决机制(三级缓存)、AOP 的概念(公共逻辑抽为切面)、底层动态代理(JDK 与 Cglib 的区别)及项目应用(如日志记录)。介绍了事务的实现(基于 AOP
270 0
|
10月前
|
Java 开发者 微服务
Spring Cloud OpenFeign详解与实践
总结起来说,Spring Cloud OpenFeign提供了一种简单易懂且高效的方式去实现微服务之间通信.它隐藏了许多复杂性,并且允许开发者以声明式方式编写HTTP客户端代码.如果你正在开发基于Spring Cloud 的微服务架构系统,Spring Cloud Open Feign是一个非常好用且强大工具.
727 33
|
10月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,处理前后端日期交互是一个常见问题。本文通过 **@DateTimeFormat** 和 **@JsonFormat** 两个注解,详细讲解了如何解析前端传来的日期字符串以及以指定格式返回日期数据。文章从实际案例出发,结合代码演示两者的使用场景与注意事项,解决解析失败、时区偏差等问题,并提供全局配置与局部注解的实践经验。帮助开发者高效应对日期时间格式化需求,提升开发效率。
3130 2

推荐镜像

更多