6,使用Java同步方式操作POJO对象进行CRUD实例

12 篇文章 0 订阅

1,创建maven项目,并在pom.xml引入以下依赖:

<!--测试包-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>compile</scope>
</dependency>

<!--mongodb 同步驱动包-->
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.3.0</version>
</dependency>

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.3.9</version>
</dependency>

2,启动MongoDB服务实例

mongod.exe --dbpath D:\UserData\mongodb --auth

3,获取MongoClient对象

import com.mongodb.MongoClientSettings;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;

import java.util.Arrays;

/**
 * @Package: com.lcj.mongodb.sync
 * @ClassName: MongoUtil
 * @Author: Administrator
 * @CreateTime: 2021/7/15 15:10
 * @Description:
 */
public class MongoUtil {

    /**
     * 通过指定host和port获得连接
     * @return MongoClient
     */
    public static MongoClient getInstance1(){
        // 添加认证
        MongoCredential credential = MongoCredential.createScramSha256Credential("admin", "admin", "123456".toCharArray());
        return MongoClients.create(
                MongoClientSettings.builder()
                        .applyToClusterSettings(builder ->
                                builder.hosts(Arrays.asList(new ServerAddress("127.0.0.1", 27017))))
                        .credential(credential)
                        .build());
    }

    /**
     * 通过连接字符串
     * @return MongoClient
     */
    public static MongoClient getInstance2(){
        return MongoClients.create("mongodb://admin:123456@127.0.0.1:27017/?authSource=admin&authMechanism=SCRAM-SHA-256");
    }
    
     /**
     * 创建编解码注册器,用来处理 pojo和bson之间的相互转换
     * @return CodecRegistry
     */
    public static CodecRegistry codecRegistry(){
        return CodecRegistries.fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),
                CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build()));
    }
}

4,创建Student实体

import org.bson.types.ObjectId;

/**
 * @Package: com.lcj.mongodb.sync.pojo
 * @ClassName: Student
 * @Author: Administrator
 * @CreateTime: 2021/7/16 9:17
 * @Description: 学生实体
 */
public class Student {
    // 学生编号
    private ObjectId id;
    // 姓名
    private String name;
    // 年龄
    private int age;
    // 性别
    private char sex;
    // 家庭住址
    private Address address;

    public Student() {
    }

    public Student(String name, int age, char sex, Address address) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.address = address;
    }

    public ObjectId getId() {
        return id;
    }

    public void setId(ObjectId id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}


public class Address {
    // 国家
    private String country;
    // 省份
    private String province;
    // 市
    private String city;
    // 街道
    private String street;

    public Address() {
    }

    public Address(String country, String province, String city, String street) {
        this.country = country;
        this.province = province;
        this.city = city;
        this.street = street;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }
}

5,使POJO对象进行CRUD操作

import cn.hutool.core.lang.Console;
import cn.hutool.json.JSONUtil;
import com.lcj.mongodb.sync.MongoUtil;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.InsertManyResult;
import com.mongodb.client.result.InsertOneResult;
import com.mongodb.client.result.UpdateResult;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * @Package: com.lcj.mongodb.sync
 * @ClassName: UseDocumentCRUDTest
 * @Author: Administrator
 * @CreateTime: 2021/7/16 8:26
 * @Description:
 */
public class UsePOJOCRUDTest {
    // 声明连接对象
    private static MongoClient client;
    // 声明集合变量
    private static MongoCollection<Student> student;

    /*
    使用CodecRegistry注册器方式:

    1,在实例化一个MongoClient对象时设置
    MongoClientSettings settings = MongoClientSettings.builder()
        .codecRegistry(pojoCodecRegistry)
        .build();
    MongoClient mongoClient = MongoClients.create(settings);

    2,使用另一种CodecRegistry与MongoDatabase
    database = database.withCodecRegistry(pojoCodecRegistry);

    3,可以使用另一种CodecRegistry与MongoCollection
    collection = collection.withCodecRegistry(pojoCodecRegistry);
    */
    // 所有方法执行前,创建集合对象
    @BeforeClass
    public static void setUp() {
        client = MongoUtil.getInstance1();
        // 访问指定的数据库,如果数据库不存在,自动创建
        MongoDatabase mongoDatabase = client.getDatabase("test").withCodecRegistry(MongoUtil.codecRegistry());
        // 访问指定的集合,如果集合不存在,在第一次存数据是创建
        student = mongoDatabase.getCollection("student",Student.class);
    }

    // 所有方法执行完后,释放资源
    @AfterClass
    public static void close() {
        // student.drop();
        client.close();
    }

    /**
     * 插入单个文档
     */
    @Test
    public void insertOne() {
       Student s = new Student("张三",18,'男',new Address("中国","湖北","十堰市","北京路38号"));
        // 插入单个文档,如果未指定_id字段,会自动添加
        InsertOneResult insertOneResult = student.insertOne(s);
        if (insertOneResult.wasAcknowledged()) {
            Console.log("插入文档成功,文档id:{}", insertOneResult.getInsertedId().toString());
        } else {
            System.out.println("插入文档失败");
        }
    }


    /**
     * 插入多个文档
     */
    @Test
    public void insertMany() {
       List<Student> students = Arrays.asList(
               new Student("李四",34,'女',new Address("中国","河北","合肥市","北京路38号"))
               ,new Student("王五",10,'女',new Address("中国","湖北","襄樊市","大连路67号"))
               ,new Student("赵六",58,'男',new Address("中国","湖北","宜昌市","北京路38号"))
       );
        // 插入文档,如果未指定_id字段,会自动添加
        InsertManyResult insertManyResult = student.insertMany(students);
        if (insertManyResult.wasAcknowledged()) {
            Console.log("插入文档成功,文档id:{}", insertManyResult.getInsertedIds());
        } else {
            System.out.println("插入文档失败");
        }
    }


    /**
     * 查询集合的第一个文档
     */
    @Test
    public void findFirst() {
        Student s = student.find().first();
        if (Objects.nonNull(s)) {
            System.out.println(JSONUtil.toJsonStr(s));
        }
    }

    /**
     * 查询集合的所有文档
     */
    @Test
    public void findAll() {
        // 返回一个游标
        try (MongoCursor<Student> iterator = student.find().iterator()) {  // 防止游标泄露
            // 遍历数据
            while (iterator.hasNext()) {
                Student next = iterator.next();
                System.out.println(JSONUtil.toJsonStr(next));
            }
        }
    }


    /**
     * 在查询Pojo时,您必须查询文档字段名,而不是Pojo的属性名。默认情况下,它们是相同的,但是可以更改POJO属性名的映射方式
     *
     * 查找 address.city=十堰市
     */
    @Test
    public void findFirstByFilter() {
        Student first = student.find(Filters.eq("address.city", "十堰市")).first();
        if (Objects.nonNull(first)) {
            System.out.println(JSONUtil.toJsonStr(first));
        }
    }


    /**
     * 查询学生年龄大于20的所有数据
     */
    @Test
    public void findAllByFilterGt() {
        // 返回一个游标
        try (MongoCursor<Student> iterator = student.find(Filters.gt("age", 20)).iterator()) {  // 防止游标泄露
            // 遍历数据
            while (iterator.hasNext()) {
                Student next = iterator.next();
                System.out.println(JSONUtil.toJsonStr(next));
            }
        }
    }


    /**
     * 查询学生年龄不小于20,并且性别为女的所有学生
     */
    @Test
    public void findAllByFilterAnd() {
        // 返回一个游标
        try (MongoCursor<Student> iterator = student.find(Filters.and(Filters.gte("age", 20), Filters.eq("sex", "女"))).iterator()) {  // 防止游标泄露
            // 遍历数据
            while (iterator.hasNext()) {
                Student next = iterator.next();
                System.out.println(JSONUtil.toJsonStr(next));
            }
        }
    }


    // 修改姓名为李四的学生,将年龄改为50,省份改为黑龙江
    @Test
    public void updateOne() {
        UpdateResult updateResult = student.updateOne(Filters.eq("name", "李四"), Updates.combine(Updates.set("age", 50),Updates.set("address.province", "黑龙江")));
        if(updateResult.wasAcknowledged()){
            System.out.println("更新数量: " + updateResult.getModifiedCount());
        }
    }

    /**
     * 更新所有省份为湖北的学生,将年龄加2
     */
    @Test
    public void updateMany() {
        UpdateResult updateResult = student.updateMany(Filters.eq("address.province", "湖北"), Updates.inc("age", 2));
        Console.log("更新数量:{}", updateResult.getModifiedCount());
    }


    /**
     * 将匹配的数据,用另一个数据进行替换
     */
    @Test
    public void replaceOne() {
        Student s = new Student("张三",18,'男',new Address("中国","湖北","十堰市","北京路38号"));
        UpdateResult updateResult = student.replaceOne(Filters.eq("name", "张三"), s);
        System.out.println("更新数: " + updateResult.getModifiedCount());
    }

    /**
     * 删除襄樊市的学生
     */
    @Test
    public void deleteOne() {
        DeleteResult deleteResult = student.deleteOne(Filters.eq("address.city", "襄樊市"));
        Console.log("删除数量: {}", deleteResult.getDeletedCount());
    }


    /**
     * 删除湖北省的学生
     */
    @Test
    public void deleteMany() {
        DeleteResult deleteResult = student.deleteMany(Filters.eq("address.province", "湖北"));
        Console.log("删除数量: {}", deleteResult.getDeletedCount());
    }

}

6,单测结果

image-20210716102923403

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值