返回 导航

SpringBoot / Cloud

hangge.com

SpringBoot - 整合并操作MongoDB数据库教程1(使用MongoRepository)

作者:hangge | 2019-12-05 08:10
    借助于 Spring Data MongoDBSpring BootMongoDB 也提供了开箱即用的自动化配置方案,下面通过样例进行演示。

一、安装配置

(1)首先编辑 pom.xml 文件,添加相关依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

(2)接着在 application.properties 中配置 MongoDB 的连接信息:
# 验证登录信息的库
spring.data.mongodb.authentication-database=admin
# 要连接的库
spring.data.mongodb.database=test
# 连接地址和认证信息
spring.data.mongodb.host=192.168.60.133
spring.data.mongodb.port=24017
spring.data.mongodb.username=root
spring.data.mongodb.password=123

二、使用 MongoRepository 操作数据库 

 1,创建实体类

首先我们创建 Book 实体类:
@Setter
@Getter
@NoArgsConstructor
public class Book {
    private Integer id;
    private String name;
    private String author;
}

2,创建数据库访问层

接着创建 BookDao 接口,继承 MongoRepository,代码如下:
    自定义的 BookDao 继承自 MongoRepositoryMongoRepository 中提供了一些基本的数据操作方法,有基本的增删改查、分页查询、排序查询等,只要方法的定义符合既定规范,Spring Data MongoDB 就能分析出开发者的意图,避免开发者自定义查询语句 (类似于 Spring Data JPA 中的 JpaRepository)。方法命名规则可以参考我之前写的文章:
public interface BookDao extends MongoRepository<Book, Integer> {
    // 查询作者名包含某文字的所有书籍(使用既定规范命名的方法进行查询)
    List<Book> findByAuthorContains(String author);

    // 根据书名查询指定书籍(使用既定规范命名的方法进行查询)
    Book findByNameEquals(String nameMongoRepository);
}

3,运行测试

(1)创建一个 Contoller,调用 BookDaoinsert 方法将数据插入到数据库中。
注意insert 方法是 MongoRepository 接口原生就提供的。
@RestController
public class HelloController {

    @Autowired
    BookDao bookDao;

    @RequestMapping("/save")
    public void save(){
        List<Book> books = new ArrayList<Book>();

        Book b1 = new Book();
        b1.setId(2);
        b1.setName("克苏鲁神话");
        b1.setAuthor("H.P.洛夫克拉夫特 ");
        books.add(b1);

        Book b2 = new Book();
        b2.setId(3);
        b2.setName("筋膜拉伸");
        b2.setAuthor("克里斯·弗雷德里克 ");
        books.add(b2);

        bookDao.insert(books);
        return;
    }
}

(2)下面是使用 BookDaofindAll 方法进行分页查询。该方法返回值为 Page<Book>,该对象中包含有分页常用数据,例如总记录数、总页数、没页记录数、当前页记录数等。
注意findAll 方法同样是 MongoRepository 接口原生就提供的。
@RestController
public class HelloController {

    @Autowired
    BookDao bookDao;

    @RequestMapping("/findAll")
    public void findAll(){
        PageRequest pageable = PageRequest.of(1,2); //第1个参数是页数,从0开始。第2个参数为每页条数
        Page<Book> page = bookDao.findAll(pageable);
        System.out.println("总页数:" + page.getTotalPages());
        System.out.println("总记录数:" + page.getTotalElements());
        System.out.println("查询结果:" + page.getContent());
        System.out.println("当前页数:" + (page.getNumber()+1));
        System.out.println("当前记录数:" + page.getNumberOfElements());
        System.out.println("每页记录数:" + page.getSize());
    }
}

(3)下面是调用 BookDao 中各个自定义的方法进行数据查询。
@RestController
public class HelloController {

    @Autowired
    BookDao bookDao;

    @RequestMapping("/search")
    public void search(){
        List<Book> books = bookDao.findByAuthorContains("克");
        Book book = bookDao.findByNameEquals("时间的秩序");

        System.out.println("作者名包含'克'字的书籍:" + books);
        System.out.println("书名为'时间的秩序'的书籍:" + book);
    }
}

注:使用自动生成的主键 Id

(1)通常来说主键 id 不需要我们自己手动设置,如果想要自动生成,只需在主键字段上添加 @id 注解即可(参数类型为 String
注意:@Id 表示主键,不可重复,自带索引。如果自己不设置 @Id 主键,mongo 会自动生成一个唯一主键,并且插入时效率远高于自己设置主键。
@Setter
@Getter
@NoArgsConstructor
public class Book {
    @Id
    private String id;
    private String name;
    private String author;
}

(2)由于主键类型变成了 String,在 BookDao 这边也要做同步修改:
public interface BookDao extends MongoRepository<Book, String> {
}

(3)再次调用 BookDaoinsert 方法将数据插入到数据库中。只不过这次我们不再手动设置 id
@RestController
public class HelloController {

    @Autowired
    BookDao bookDao;

    @RequestMapping("/save")
    public void save(){
        List<Book> books = new ArrayList<Book>();

        Book b1 = new Book();
        b1.setName("克苏鲁神话");
        b1.setAuthor("H.P.洛夫克拉夫特 ");
        books.add(b1);

        Book b2 = new Book();
        b2.setName("筋膜拉伸");
        b2.setAuthor("克里斯·弗雷德里克 ");
        books.add(b2);

        bookDao.insert(books);
        return;
    }
}

(4)数据插入后,可以发现数据已经有自动生成的 id 了:
评论

全部评论(0)

回到顶部