使用Java操作MongoDB
使用原生API和 SpringBootDataMongodb 操作 MongoDB

MongoDB原生API

准备工作

  1. 引入依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.imxushuai</groupId>
    <artifactId>mongodb-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
    <!-- MongoDB驱动 -->
    <dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver</artifactId>
    <version>3.8.2</version>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>2.0.1.RELEASE</version>
    </dependency>
    </dependencies>

    </project>

    引入MongoDB驱动以及测试依赖

  2. 创建测试类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package com.imxushua.mongodb.nativeapi;

    import org.junit.Test;

    /**
    * MongoDB 原生JAVA API
    */
    public class NativeMongoDB {

    }

API

连接数据库

  1. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    private final String HOST = "192.168.136.104";
    private final int PORT = 27017;

    private MongoDatabase mongoDatabase;

    @Test
    public void connectMongoDB() {
    try {
    // 创建Java Client,如果端口是27017可以省略第二个参数
    MongoClient client = new MongoClient(HOST, PORT);
    // 获取数据库,这个数据库是我提前在mongodb中创建好的
    mongoDatabase = client.getDatabase("imxushuai");
    log.info("Connect to mongoDB successfully, connect database name is [{}]", mongoDatabase.getName());
    } catch (Exception e) {
    log.error("Connect to mongoDB failure", e);
    }
    }
  2. 运行结果

连接成功后,将@Test注解更换为@Before注解,这样运行其他测试方法的时候,就会先连接到数据库了。

创建集合(collection)

  1. 代码

    1
    2
    3
    4
    5
    6
    @Test
    public void createCollection() {
    // 创建Collection
    mongoDatabase.createCollection("imxushuai collection 1");
    mongoDatabase.createCollection("imxushuai collection 2");
    }
  2. 运行结果

  3. 使用GUI查看

    这里使用的是Navicat Premium 12,如果需要下载安装的小伙伴可以参考:Navicat Premium 12破解)

插入文档

  1. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @Test
    public void createDocument() {
    // 获取集合
    MongoCollection<Document> collection = mongoDatabase.getCollection("imxushuai collection 1");
    /*
    * 创建文档
    * 方式1:document.append(String key, Object value);
    * 方式2:new Document(Map<String, Object> map);
    */
    Document document = new Document();
    document.append("name", "imxushuai")
    .append("age", "20")
    .append("address", "China");
    // 插入多个, 插入单个 collection.insertOne(document);
    collection.insertMany(Collections.singletonList(document));
    }
  2. 运行结果

  3. 使用GUI查看

查询集合所有数据

  1. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    @Test
    public void findAllByDocument() {
    MongoCollection<Document> collection = mongoDatabase.getCollection("imxushuai collection 1");
    FindIterable<Document> documents = collection.find();
    for (Document document : documents) {
    System.out.println(document.toString());
    }
    }
  2. 运行结果

按条件查询数据

  1. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Test
    public void findByParams() {
    MongoCollection<Document> collection = mongoDatabase.getCollection("imxushuai collection 1");
    // 构建查询条件按
    BasicDBObject params = new BasicDBObject("name", "imxushuai");
    // 查询
    FindIterable<Document> documents = collection.find(params);
    for (Document document : documents) {
    System.out.println(document.toString());
    }
    }
  2. 运行结果

更新文档

  1. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Test
    public void update() {
    MongoCollection<Document> collection = mongoDatabase.getCollection("imxushuai collection 1");
    // 修改age为25的地址为 China ChengDu
    collection.updateMany(
    Filters.eq("age", "25"),
    new Document("$set", new Document("address", "China ChengDu"))
    );
    }
  2. 运行结果

  3. 使用GUI查看

删除文档

  1. 代码

    1
    2
    3
    4
    5
    6
    7
    @Test
    public void delete() {
    MongoCollection<Document> collection = mongoDatabase.getCollection("imxushuai collection 1");
    // 删除所有符合条件的文档
    // 我这里删除address中的值包含China的数据,为了测试我又新增了一条数据
    collection.deleteMany(Filters.regex("address", Pattern.compile("^.*China.*$", Pattern.CASE_INSENSITIVE)));
    }
  2. 使用GUI查看

    另外两条数据成功删除。

Spring Data MongoDB

准备工作

  1. 引入依赖

    1
    2
    3
    4
    5
    6
    <!-- Spring Data MongoDB -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>2.0.1.RELEASE</version>
    </dependency>
  2. 创建application.yml配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    spring:
    data:
    mongodb:
    # 主机地址
    host: 192.168.136.104
    # 端口号, 默认为27017 可省略
    port: 27017
    # 数据库名
    database: imxushuai
  3. 创建测试类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package com.imxushua.mongodb.springdata;

    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;

    /**
    * 使用Spring Data MongoDB操作MongoDB
    */
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class SpringDataMongoDB {

    }
  4. 创建User实体

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package com.imxuhsuai.mongodb.pojo;

    import lombok.Data;
    import org.springframework.data.annotation.Id;
    import org.springframework.data.mongodb.core.mapping.Document;

    @Data
    @Document(collection = "imxushuai collection 1")
    public class User {

    @Id
    private String _id;
    private String name;
    private String age;
    private String address;
    }
  5. 创建UserRepository

    1
    2
    3
    4
    5
    6
    7
    package com.imxuhsuai.mongodb.repository;

    import com.imxuhsuai.mongodb.pojo.User;
    import org.springframework.data.mongodb.repository.MongoRepository;

    public interface UserRepository extends MongoRepository<User, String> {
    }

不要问为什么创建UserRepository,用过Spring Data的小伙伴都知道!!!

Sping Boot Data MongoDB

创建集合

  1. 代码

    1
    2
    3
    4
    5
    6
    7
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void createCollection() {
    mongoTemplate.createCollection(User.class);
    }
  2. GUI查看结果

插入文档

  1. 代码

    1
    2
    3
    4
    5
    @Test
    public void createDocument() {
    User user = new User(null, "xushuai", "22", "SiChuan ChengDu");
    userRepository.insert(user);
    }
  2. GUI查看结果

    有趣的是,保存后,多了一个_class的字段,这个字段是Spring Data帮我们生成的,用于记录实体的全类名。

查询集合所有数据

  1. 代码

    1
    2
    3
    4
    5
    @Test
    public void findAllByDocument() {
    List<User> userList = userRepository.findAll();
    userList.forEach(user -> System.out.println(user.toString()));
    }
  2. 运行结果

按条件查询数据

  1. 代码

    1
    2
    3
    4
    5
    @Test
    public void findByParams() {
    List<User> byAddressLike = userRepository.findByAddressLike("Bei");
    byAddressLike.forEach(user -> System.out.println(user.toString()));
    }

    需要在UserRepository中定义方法:

    ​ List findByAddressLike(String address);

  2. 运行结果

更新文档

  1. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Test
    public void update() {
    Optional<User> optionalUser = userRepository.findById("5d07a7330a6c462c5822adf0");
    if (optionalUser.isPresent()) {
    User user = optionalUser.get();
    user.setName("Jerry");
    userRepository.save(user);
    }
    }
  2. GUI查看结果

删除文档

  1. 代码

    1
    2
    3
    4
    @Test
    public void delete() {
    userRepository.deleteById("5d07a7330a6c462c5822adf0");
    }

代码获取

GitHub:Demo

文章作者: imxushuai
文章链接: https://www.imxushuai.com/2019/04/20/使用Java操作MongoDB/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 imxushuai
支付宝打赏
微信打赏