1、准备工作
1、导入依赖:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.12.4</version>
</dependency>
2、编写代码
//创建连接对象
MongoClient mongoClient = new MongoClient("127.0.0.1",27017);
//获取数据库
DB db = mongoClient.getDB("test");
//获取集合
DBCollection users = db.getCollection("users");
2、基本操作
1、新增
/**
* 新增
* 方式一
* 创建BasicDBObject对象,一次插入一条数据
*/
@Test
public void test_BasicDBObject(){
BasicDBObject object = new BasicDBObject();
object.put("username","wang");
object.append("age",15).append("birthday",new Date());
users.insert(object);
}
/**
* 新增
* 方式二
* 创建BasicDBObjectBuilder对象
*/
@Test
public void test_BasicDBObjectBuilder(){
BasicDBObjectBuilder builder = BasicDBObjectBuilder.start().
add("username","bing").
add("age",20).
add("birthday",new Date());
users.insert(builder.get());
}
/**
* 新增
* 方式三
* 构造BasicDBObject对象,构造方法参数传一个map
*/
@Test
public void test_Map(){
Map<String,Object> data = new HashMap<>();
data.put("username","wangbing");
data.put("age",11);
data.put("birthday",new Date());
users.insert(new BasicDBObject(data));
}
/**
* 新增
* 方式四
* 直接构造json
*/
@Test
public void test_json(){
String json = "{'username':'zhangsan','age':12}";
DBObject object = (DBObject) JSON.parse(json);
users.insert(object);
}
2、删除
/**
* 删除
* 通过包装BasicDBObject("username","zhangsan")对象删除,
* 直接创建一个空对象,即为删除全部
*/
@Test
public void test_remove(){
WriteResult writeResult = users.remove(new BasicDBObject("username","zhangsan"));
//删除的条数
int n = writeResult.getN();
System.out.println(n);
}
3、更新
/**
* 修改
*/
@Test
public void test_update(){
WriteResult update = users.update(new BasicDBObject("username", "bing"),
new BasicDBObject("username", "lisi").
//append("age", 13).
append("birthday", new Date()));
int n = update.getN();
System.out.println(n);
}
/**
* 使用修改器更新
*/
@Test
public void test_update2(){
users.update(new BasicDBObject("username","lisi"),
new BasicDBObject("$set",new BasicDBObject("username","lisi2")));
}
4、查询
1、匹配查询
MongoDB使用BasicDBObject类型封装查询条件,构造方法的参数为key 和value 。
BasicDBObject dbObject = new BasicDBObject("username","zhangsan");
DBCursor dbObjects = users.find(dbObject);
while (dbCursor.hasNext()){
DBObject dbObject = dbCursor.next();
System.out.println(dbObject);
}
2、模糊查询
构建模糊查询条件是通过正则表达式的方式来实现的
(1)完全匹配Pattern pattern = Pattern.compile(“^name$”);
(2)右匹配Pattern pattern = Pattern.compile(“^.*name$”);
(3)左匹配Pattern pattern = Pattern.compile(“^name.*$”);
(4)模糊匹配Pattern pattern = Pattern.compile(“^.name.$”);
//查询集合中address含有“洞”的文档
Pattern pattern = Pattern.compile("^.*洞.*$");
BasicDBObject basicDBObject1 = new BasicDBObject("address",pattern);
DBCursor cursor = users.find(basicDBObject1);
3、大于小于
//age大于20的文档
BasicDBObject bson=new BasicDBObject("age", new BasicDBObject("$lt",20));
4、并且
查询年龄大于等于20并且小于30的文档记录
//查询年龄大于等于20的
BasicDBObject bson1=new BasicDBObject("age", new BasicDBObject("$gte",20));
//查询年龄小于30的
BasicDBObject bson2=new BasicDBObject("age", new BasicDBObject("$lt",30));
//构建查询条件and
BasicDBObject bson=new BasicDBObject("$and", Arrays.asList(bson1,bson2) );
5、或者
BasicDBObject bson1=new BasicDBObject("age", new BasicDBObject("$lte",20));
BasicDBObject bson2=new BasicDBObject("sex", "女");
//构建查询条件or
BasicDBObject bson=new BasicDBObject("$or", Arrays.asList( bson1, bson2 ) );
3、MongoDB连接池
MongoClient内部实现了一个连接池,默认初始化10个连接,MongoClient对象是线程安全的,因此可以只创建一个,在多线程环境下安全使用。
另外要注意,close方法将关闭当前所有活跃的连接,所以应该在确定不再使用 MongoDB的时候才应该关闭。
参数设置:
//对mongoClient初始化
private static void init(){
//连接池选项
Builder builder = new MongoClientOptions.Builder();//选项构建者
builder.connectTimeout(5000);//设置连接超时时间
builder.socketTimeout(5000);//读取数据的超时时间
builder.connectionsPerHost(30);//每个地址最大请求数
builder.writeConcern(WriteConcern.NORMAL);//写入策略,仅抛出网络异常
MongoClientOptions options = builder.build();
mongoClient=new MongoClient("127.0.0.1",options);
}
写入策略:
- WriteConcern.NONE:没有异常抛出
- WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
- WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
- WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
- WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
- WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
- WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。