• Springboot 整合 MongoDB


    Springboot 整合 MongoDB

    这节我们将整合 Spring Boot 与 Mongo DB 实现增删改查的功能,并且实现序列递增。

    Mongo DB 的基本介绍和增删改查的用法可以参考我之前的文章:MongoDB 的安装和基本操作

    新建一个 Spring Boot 项目,版本为 2.3.7.RELEASE,并引入如下依赖:

     <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-mongodb</artifactId>
     </dependency>
    

    然后可以通过 Mongo Shell 或者 Navicat 工具创建一个名称为 test 的数据库,并新增 user 文档(文档,类似与关系型数据库里的数据表):navicat 破解

    img

    在配置文件中配置 mongo 的连接信息:

    spring:
      data:
        mongodb:
          host: localhost #地址
          port: 27017 #端口号
          database: test #数据库名
    

    Mongo DB 的默认端口为 27017,使用的数据库为刚刚创建的 test。

    创建 User 实体类:

    @Document("User")表示这是文档对象,名称为 User,对应 Mongo DB 里的 User 集合。@Id标注主键字段,String 类型的主键值在插入的时候 Mongo DB 会帮我们自动生成。如果对象中的某个属性为非表字段,可以使用注解@Transient进行排除。

    @Data
    @Document("User")
    public class User {
        @Id
        private String id;
        private String name;
        private Integer age;
    }
    

    MongoRepository

    简单增删改查

    创建一个 UserDao 接口:

    @Repository
    public interface UserDao extends MongoRepository<User, String> {
    }
    

    接口继承自MongoRepository,泛型分别为实体对象和主键类型。通过继承MongoRepositoryUserDao包含了一些增删改查的方法,如下图所示:

    img

    为了方便演示,接下来直接去到测试类进行测试:

    记得注入 UserDao

    import look.word.mongo.bean.User;
    import look.word.mongo.dao.UserDao;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    @SpringBootTest
    class MongoDaoTest {
    
        @Resource
        private UserDao userDao;
    
        /**
         * 新增和修改都是 save方法,
         * id 存在为修改,id 不存在为新增
         */
        @Test
        void save() {
            User user = new User();
            user.setName("张三");
            user.setAge(18);
            System.out.println(userDao.save(user));
            userDao.save(user);
        }
    
        /**
         * 删除
         */
        @Test
        void remove(){
            userDao.deleteById("62c155be562fb86d5bcce2d0");
        }
    
        /**
         * 查询所有
         */
        @Test
        void findAll(){
            List<User> users = userDao.findAll();
            users.stream().forEach(user -> System.out.println(user));
        }
    
    }
    
    
    折叠

    上面我们编写了基本的增删改查样例,新增和修改都是通过save方法完成的,当主键存在时则为修改,主键不存在则为新增。

    测试新增用户:

    这里没有传入 id 做的是新增

    新增成功后 会返回当前插入的文档对象

    img

    测试删除用户:

    删除成功后 没有任何信息的提示 这里演示的是根据 id 去删除

    img

    测试修改用户:

    • 可以看到 根据 id 修改时 会把我们不需要修改的值修改成 null 了 因为我们没有传入 如何避免呢?
    • 可以先根据 id 查询出文档信息 然后在修改需要修改的字段即可。

    img

    测试查询用户:

    img

    多条件查询:

    Spring Data 提供了对 mongodb 数据访问的支持,我们只需要继承 MongoRepository 类,按照 Spring Data 规范就可以了

    SpringData 方法定义规范

    img

    img

    规则:

    1、不是随便声明的,而需要符合一定的规范
    2、 查询方法以 find | read | get 开头
    3、 涉及条件查询时,条件的属性用条件关键字连接
    4、 要注意的是:条件属性首字母需要大写
    5、 支持属性的级联查询,但若当前类有符合条件的属性则优先使用,而不使用级联属性,若需要使用级联属性,则属性之间使用_强制进行连接

    比如通过用户的年龄段来查询:

    注意: 方法参数个数需要和方法名中所需要的参数个数对应上。

    @Repository
    public interface UserDao extends MongoRepository<User, String> {
    
        /**
         * 根据年龄段来查找
         *
         * @param from from
         * @param to   to
         * @return List<User>
         */
        List<User> findByAgeBetween(Integer from, Integer to);
    }
    

    img

    在输入findBy后,IDEA 会根据实体对象的属性和 SQL 的各种关键字自动组合提示:

    img

    排序与分页:

    增删改查可以用MongoTemplate也可以实现

    排序和分页需要使用MongoTemplate对象来完成,在UserService里新增一个getUserByCondition方法:

        @Resource
        private MongoTemplate mongoTemplate;	
    
        @Test
        void getUserByCondition(){
            // 查询条件对象
            Query query = new Query();
            Criteria criteria = new Criteria();
            Sort sort = Sort.by(Sort.Direction.DESC, "age");
            //查询第一页 每页1条 按照年龄升序
            Pageable pageable = PageRequest.of(0, 10, sort);
            // 模糊查询
            criteria.and("name").regex("三");
            // 把查询规则加入 查询对象中
            query.addCriteria(criteria);
            List<User> users = mongoTemplate.find(query.with(pageable), User.class);
            System.out.println(users);
        }
    

    img

  • 相关阅读:
    HTML的段落中怎么样显示出标签要使用的尖括号<>?
    基于PHP的学生选修课网上选课系统设计与实现
    Spring事务之@Transactional注解详解
    Power BI简介
    iOS 在OC旧项目中使用Swift进行混编
    【毕业设计】基于SSM的新闻管理系统
    「进阶篇」Vue Router 核心原理的 5 个问题你会了吗?
    破圈的可能性
    mindspore.scipy 入门使用指导
    Matlab中脚本的运用
  • 原文地址:https://www.cnblogs.com/look-word/p/16440322.html