写在前面:最近在公司实习,需要完成一个实习任务。这个任务用的是SSH框架,数据库需要使用mongoDB完成。由于刚接触MongoDB,所以不是很熟练,在网上查找了大量的资料,许多都是抄来抄去的,运行一堆错误。如今,我的工作任务已经完成,现在写下此篇,希望后来的打工人少一点痛苦!
首先,我有一定的数据库基础,但对于mongo还是一无所知的小白。所以有以下疑问:
1. 数据库怎么连接?(工具类封装)
2. 数据库连接后怎么进行CRUD?(API调用肯定和命令行有区别)
3. java实体类怎么才能入mongo的库?(很重要)
4. mongo查寻出来的数据,怎么映射到实体类中,转换成Java的数据结构?(很重要)
首先我是win10 系统,用的最新版的mongo数据库,这里就不介绍怎么安装mongo了。其次是,我这是纯净的maven项目,没有用springboot之类的,所以就从最原生的来。
(1)导入maven坐标
org.mongodb
mongodb-driver-sync
4.4.1
注意:我在查阅资料的时候发现,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的密码。
这里的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 collection = MongoDBUtil.getConnect().getCollection("user", User.class).withCodecRegistry(MongoDBUtil.getCodecRegistry());
PS:其实这一步就是做Java实体类和mongo文档数据映射的!因为 MongoCollection
新增操作
(1)单个新增:
collection.insertOne(new User("1","ceshi","ceshi","123456",0));
collection.insertOne(new User("2","zhuguan","zhuguan","123456",1));
(2)批量新增:
List 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 users= collection.find(filter);
User user = users.first();
(2)多个查询(List
Bson filter = Filters.eq("uid","1");
FindIterable users= collection.find(filter);
List userList = new ArrayList<>();
//防止资源和内存泄漏,自动关闭
try (MongoCursor 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
page = (page == 0) ? 1 : page;// 当前页数
pageSize = (pageSize == 0) ? 10 : pageSize; // 每页数据量
Bson filter = Filters.eq("uid","1");
FindIterable users= collection.find(filter)
.sort(Sorts.descending("startTime"))
.skip((page -1) * pageSize)
.limit(pageSize);;
List userList = new ArrayList<>();
//防止资源和内存泄漏,自动关闭
try (MongoCursor 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 result = collection.find(filter);
查询某个字段小于特定值的数据:
Bson filter = Filters.lt("age", 18);
FindIterable result = collection.find(filter);
查询某个字段包含特定值的数据:
Bson filter = Filters.in("gender", Arrays.asList("female", "unknown"));
FindIterable result = collection.find(filter);
PS:常见的查询还有很多,如:范围查询、分页查询、嵌套查询、空查询、正则表达式查询等等。有空再开博客写吧。
以上就是Idea中用java快速上手MongoDB的过程了,基本的CRUD感觉足够了。个人感觉实现业务的方式有很多种,这种可能不是最好的,但我觉得还挺方便的。本篇就大概做了快速入门,有时间写个专栏,把这段时间来的问题梳理梳理。