• Spring Boot集成mongodb


    引自尚硅谷项目-尚医通

    一、集成简介

    spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足。

    二、搭建开发环境

    2.1 初始化工程

    初始化一个SpringBoot工程

    2.2 pom文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.7.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.yqd</groupId>
        <artifactId>hello-mongodb</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>hello-mongodb</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>1.8</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-mongodb</artifactId>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>joda-time</groupId>
                <artifactId>joda-time</artifactId>
                <version>2.10.5</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    

    2.3 application.yml文件

    spring:
      data:
        mongodb:
          uri: mongodb://127.0.0.1:27017/test
    

    2.4 实体类User

    import lombok.Data;
    import org.springframework.data.annotation.Id;
    import org.springframework.data.mongodb.core.mapping.Document;
    
    @Data
    @Document("User")
    public class User {
        @Id
        private String id;
        private String name;
        private Integer age;
        private String email;
        private String createDate;
    }
    

    三、基于MongoTemplate 开发CRUD

    3.1 常用API

    常用方法
    mongoTemplate.findAll(User.class): 查询User文档的全部数据
    mongoTemplate.findById(, User.class): 查询User文档id为id的数据
    mongoTemplate.find(query, User.class);: 根据query内的查询条件查询
    mongoTemplate.upsert(query, update, User.class): 修改
    mongoTemplate.remove(query, User.class): 删除
    mongoTemplate.insert(User): 新增

    Query对象
    1、创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)
    2、 精准条件:criteria.and(“key”).is(“条件”)
    模糊条件:criteria.and(“key”).regex(“条件”)
    3、封装条件:query.addCriteria(criteria)
    4、大于(创建新的criteria):Criteria gt = Criteria.where(“key”).gt(“条件”)
    小于(创建新的criteria):Criteria lt = Criteria.where(“key”).lt(“条件”)
    5、Query.addCriteria(new Criteria().andOperator(gt,lt));
    6、一个query中只能有一个andOperator()。其参数也可以是Criteria数组。
    7、排序 :query.with(new Sort(Sort.Direction.ASC, "age"). and(new Sort(Sort.Direction.DESC, "date")))

    3.2 测试

    import com.mongodb.client.result.DeleteResult;
    import com.mongodb.client.result.UpdateResult;
    import com.yqd.entity.User;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.data.mongodb.core.query.Criteria;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.data.mongodb.core.query.Update;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Pattern;
    
    @SpringBootTest
    class HelloMongodbApplicationTests {
    
        @Autowired
        private MongoTemplate mongoTemplate;
    
        @Test
        void contextLoads() {
        }
    
        //添加
        @Test
        public void createUser() {
            User user = new User();
            user.setAge(20);
            user.setName("test");
            user.setEmail("4932200@qq.com");
            User user1 = mongoTemplate.insert(user);
            System.out.println(user1);
        }
    
        //查询所有
        @Test
        public void findUser() {
            List<User> userList = mongoTemplate.findAll(User.class);
            System.out.println(userList);
        }
    
        //根据id查询
        @Test
        public void getById() {
            User user = mongoTemplate.findById("607d7acaee711e63dac0e4d3", User.class);
            System.out.println(user);
        }
    
        //条件查询
        @Test
        public void findUserList() {
            Query query = new Query(Criteria
                    .where("name").is("test")
                    .and("age").is(20));
            List<User> userList = mongoTemplate.find(query, User.class);
            System.out.println(userList);
        }
    
        //模糊查询
        @Test
        public void findUsersLikeName() {
            String name = "est";
            String regex = String.format("%s%s%s", "^.*", name, ".*$");
            Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
            Query query = new Query(Criteria.where("name").regex(pattern));
            List<User> userList = mongoTemplate.find(query, User.class);
            System.out.println(userList);
        }
    
        //分页查询
        @Test
        public void findUsersPage() {
            String name = "est";
            int pageNo = 1;
            int pageSize = 10;
    
            Query query = new Query();
            String regex = String.format("%s%s%s", "^.*", name, ".*$");
            Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
            query.addCriteria(Criteria.where("name").regex(pattern));
            int totalCount = (int) mongoTemplate.count(query, User.class);
            List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);
    
            Map<String, Object> pageMap = new HashMap<>();
            pageMap.put("list", userList);
            pageMap.put("totalCount", totalCount);
            System.out.println(pageMap);
        }
    
        //修改
        @Test
        public void updateUser() {
            User user = mongoTemplate.findById("607d7acaee711e63dac0e4d3", User.class);
            user.setName("test_1");
            user.setAge(25);
            user.setEmail("493220990@qq.com");
            Query query = new Query(Criteria.where("_id").is(user.getId()));
            Update update = new Update();
            update.set("name", user.getName());
            update.set("age", user.getAge());
            update.set("email", user.getEmail());
            UpdateResult result = mongoTemplate.upsert(query, update, User.class);
            long count = result.getModifiedCount();
            System.out.println(count);
        }
    
        //删除操作
        @Test
        public void delete() {
            Query query =
                    new Query(Criteria.where("_id").is("607d7acaee711e63dac0e4d3"));
            DeleteResult result = mongoTemplate.remove(query, User.class);
            long count = result.getDeletedCount();
            System.out.println(count);
        }
    }
    

    四、基于MongoRepository开发CRUD

    4.1 实现

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

    SpringData 方法定义规范

    image-20210419233642653

    image-20210419233659833

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

    4.2 添加Repository类

    import com.yqd.entity.User;
    import org.springframework.data.mongodb.repository.MongoRepository;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public interface UserRepository extends MongoRepository<User, String> {
    
    }
    

    4.3 测试

    import com.yqd.entity.User;
    import com.yqd.repository.UserRepository;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.domain.*;
    
    import java.util.List;
    
    @SpringBootTest
    public class DemomogoApplicationRepositoryTest {
        @Autowired
        private UserRepository userRepository;
    
        //添加
        @Test
        public void createUser() {
            User user = new User();
            user.setAge(20);
            user.setName("张三");
            user.setEmail("3332200@qq.com");
            User user1 = userRepository.save(user);
        }
    
        //查询所有
        @Test
        public void findUser() {
            List<User> userList = userRepository.findAll();
            System.out.println(userList);
        }
    
        //id查询
        @Test
        public void getById() {
            User user = userRepository.findById("607d7b272ada460fd42c8dbf").get();
            System.out.println(user);
        }
    
        //条件查询
        @Test
        public void findUserList() {
            User user = new User();
            user.setName("张三");
            user.setAge(20);
            Example<User> userExample = Example.of(user);
            List<User> userList = userRepository.findAll(userExample);
            System.out.println(userList);
        }
    
        //模糊查询
        @Test
        public void findUsersLikeName() {
            //创建匹配器,即如何使用查询条件
            ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
                    .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
                    .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
            User user = new User();
            user.setName("三");
            Example<User> userExample = Example.of(user, matcher);
            List<User> userList = userRepository.findAll(userExample);
            System.out.println(userList);
        }
    
        //分页查询
        @Test
        public void findUsersPage() {
            Sort sort = Sort.by(Sort.Direction.DESC, "age");
    //0为第一页
            Pageable pageable = PageRequest.of(0, 10, sort);
    //创建匹配器,即如何使用查询条件
            ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
                    .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
                    .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
            User user = new User();
            user.setName("三");
            Example<User> userExample = Example.of(user, matcher);
    //创建实例
            Example<User> example = Example.of(user, matcher);
            Page<User> pages = userRepository.findAll(example, pageable);
            System.out.println(pages);
        }
    
        //修改
        @Test
        public void updateUser() {
            User user = userRepository.findById("607d7b272ada460fd42c8dbf").get();
            user.setName("张三_1");
            user.setAge(25);
            user.setEmail("883220990@qq.com");
            User save = userRepository.save(user);
            System.out.println(save);
        }
    
        //删除
        @Test
        public void delete() {
            userRepository.deleteById("607d7b272ada460fd42c8dbf");
        }
    }
    
  • 相关阅读:
    chapter01
    2019.07.11
    系统进程
    Linex第五-第七章
    Linex第三章第四章
    Linux 系统管理 第二章第三章
    2019/7/24
    使用.htaccess进行浏览器图片文件缓存
    div+css3实现漂亮的多彩标签云,鼠标移动会有动画
    搜索排序的作弊与反作弊,面壁人与智子的巅峰对决
  • 原文地址:https://www.cnblogs.com/smalldong/p/14679259.html
Copyright © 2020-2023  润新知