IDEA操作MongoDB快速上手开发(maven项目)

写在前面:最近在公司实习,需要完成一个实习任务。这个任务用的是SSH框架,数据库需要使用mongoDB完成。由于刚接触MongoDB,所以不是很熟练,在网上查找了大量的资料,许多都是抄来抄去的,运行一堆错误。如今,我的工作任务已经完成,现在写下此篇,希望后来的打工人少一点痛苦!

首先,我有一定的数据库基础,但对于mongo还是一无所知的小白。所以有以下疑问:

1. 数据库怎么连接?(工具类封装)

2. 数据库连接后怎么进行CRUD?(API调用肯定和命令行有区别)

3. java实体类怎么才能入mongo的库?(很重要)

4. mongo查寻出来的数据,怎么映射到实体类中,转换成Java的数据结构?(很重要)

1. 数据库的连接

首先我是win10 系统,用的最新版的mongo数据库,这里就不介绍怎么安装mongo了。其次是,我这是纯净的maven项目,没有用springboot之类的,所以就从最原生的来。

(1)导入maven坐标

        <!--MongoDB-->
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver-sync</artifactId>
            <version>4.4.1</version>
        </dependency>

注意:我在查阅资料的时候发现,mongo3.0+的创建数据库连接方式和mongo4.0+有区别。这里只说4.0+的。

(2)创建工具类

import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import org.bson.codecs.configuration.CodecRegistries;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.codecs.pojo.PojoCodecProvider;

public class MongoDBUtil {
    private static final String CONNECTION_STRING = "mongodb://localhost:27017";
    private static final String DATABASE_NAME = "weeklyTask";
    //不通过认证获取连接数据库对象
    public static MongoDatabase getConnect(){
        //连接到 mongodb 服务
        MongoClient mongoClient = MongoClients.create(CONNECTION_STRING);;
        //连接到数据库
        //返回连接数据库对象
        return mongoClient.getDatabase(DATABASE_NAME);
    }

    //处理pojo和Bson之间的编码问题
    public static CodecRegistry getCodecRegistry(){
        //进行编码处理
        return CodecRegistries.fromRegistries(
                MongoClientSettings.getDefaultCodecRegistry(),
                CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build()));
    }
}

注意:这个工具类里面使用的本地无认证模式的。因为我没有设置mongo的密码。

2. CRUD操作

这里的CRUD操作,我就和上述中的2,3,4问题一起说了。直接上案例:

Pojo实体类创建

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String uid;
    private String name;
    private String number;
    private String password;
    private int role;
}
获取集合对象
        // 获取集合对象
MongoCollection<User> collection =  MongoDBUtil.getConnect().getCollection("user", User.class).withCodecRegistry(MongoDBUtil.getCodecRegistry());
       

PS:其实这一步就是做Java实体类和mongo文档数据映射的!因为 MongoCollection<Document>,泛型默认是Document的。这里我们直接指定是User的,然后使用了编码转换withCodecRegistry(MongoDBUtil.getCodecRegistry())。这样就可以实现互转了。后面通过collection调用的方法中的Document都可以具体的写成User了。

新增操作

(1)单个新增:

collection.insertOne(new User("1","ceshi","ceshi","123456",0));
collection.insertOne(new User("2","zhuguan","zhuguan","123456",1));

(2)批量新增:

        List<User> userList = Arrays.asList(
                new User("1","ceshi","ceshi","123456",0),
                new User("2","zhuguan","zhuguan","123456",1)
        );
        collection.insertMany(userList);

PS:我们完成上述操作后,执行新增操作,不用关注mongoDB中是否存在这个集合(表),他会自己去创建这个表的,并且将结构和数据映射上去。

修改操作

(1)修改单个数据

Bson filter = Filters.eq("uid", "1");
Bson update = Updates.set("name", "ceshi");
collection.updateOne(filter, update);

(2)修改多个数据

        Bson filter = Filters.eq("uid", "1");
        Bson update = Updates.combine(
                Updates.set("name", "Test"),
                Updates.set("password", "ceshi"));
        collection.updateOne(filter, update);

(3)批量修改

Bson filter = Filters.eq("password", "123456");
Bson update = Updates.set("password", "147258");
UpdateResult result = collection.updateMany(filter, update);

(4)整行修改

场景:有时候前台直接传过来的是一个对象,你不能确定它具体修改的属性是啥。

        // 构造Bson对象,用于匹配需要更新的文档
        Bson filter = Filters.eq("uid", "1");
        // 执行替换操作
        collection.replaceOne(filter, new User(...));

PS:mongo的数据格式BSON类型的,他的写法和Json类似。所以写过滤条件需要使用BSON。

删除操作

(1)单个删除

        Bson filter = Filters.eq("uid", "1");
        collection.deleteOne(filter);

(2)批量删除(删除密码所有为:‘123456’的)

Bson filter = Filters.eq("password", "123456");
collection.deleteMany(filter);

查询操作

(1)单个查询

        Bson filter = Filters.eq("uid",uid);
        FindIterable<User> users= collection.find(filter);
        User user = users.first();

(2)多个查询(List<User>)

        Bson filter = Filters.eq("uid","1");
        FindIterable<User> users= collection.find(filter);
        List<User> userList = new ArrayList<>();
        //防止资源和内存泄漏,自动关闭
        try (MongoCursor<Weekly> iterator = users.iterator()){
            while (iterator.hasNext()){
                userList.add(iterator.next());
            }
        }catch (Exception e){
            logger.error("查询错误:" + e.getMessage());
        }

PS:当使用MongoCursor遍历查询结果时,一定要手动关闭它,否则会造成资源泄露。可以使用try-with-resources语句块来自动关闭MongoCursor。当然数据量小,不写也不影响。

(3)分页查询(List<User>)

        page = (page == 0) ? 1 : page;// 当前页数
        pageSize = (pageSize == 0) ? 10 : pageSize; // 每页数据量
        Bson filter = Filters.eq("uid","1");
        FindIterable<User> users= collection.find(filter)
                .sort(Sorts.descending("startTime"))                                     
                .skip((page -1) * pageSize)
                .limit(pageSize);;
        List<User> userList = new ArrayList<>();
        //防止资源和内存泄漏,自动关闭
        try (MongoCursor<Weekly> iterator = users.iterator()){
            while (iterator.hasNext()){
                userList.add(iterator.next());
            }
        }catch (Exception e){
            logger.error("查询错误:" + e.getMessage());
        }

(4)其他查询

查询某个字段大于特定值的数据:

Bson filter = Filters.gt("age", 18);
FindIterable<Document> result = collection.find(filter);

查询某个字段小于特定值的数据:

Bson filter = Filters.lt("age", 18);
FindIterable<Document> result = collection.find(filter);

查询某个字段包含特定值的数据:

Bson filter = Filters.in("gender", Arrays.asList("female", "unknown"));
FindIterable<Document> result = collection.find(filter);

PS:常见的查询还有很多,如:范围查询、分页查询、嵌套查询、空查询、正则表达式查询等等。有空再开博客写吧。

以上就是Idea中用java快速上手MongoDB的过程了,基本的CRUD感觉足够了。个人感觉实现业务的方式有很多种,这种可能不是最好的,但我觉得还挺方便的。本篇就大概做了快速入门,有时间写个专栏,把这段时间来的问题梳理梳理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记录菌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值