java mongodb spring_java操作mongodb & springboot整合mongodb

简单的研究原生API操作MongoDB以及封装的工具类操作,最后也会研究整合spring之后作为dao层的完整的操作。

1.原生的API操作

pom.xml

org.mongodb

mongodb-driver

3.10.1

测试类:

packagemongodb;importjava.util.ArrayList;importjava.util.List;importorg.bson.Document;importcom.mongodb.MongoClient;importcom.mongodb.client.FindIterable;importcom.mongodb.client.ListCollectionsIterable;importcom.mongodb.client.MongoCollection;importcom.mongodb.client.MongoCursor;importcom.mongodb.client.MongoDatabase;importcom.mongodb.client.model.Filters;public classDemo {public static voidmain(String[] args) {

}private static voiddeleteDoc() {try{//连接到 mongodb 服务

MongoClient mongoClient = new MongoClient("localhost", 27017);//连接到数据库

MongoDatabase mongoDatabase = mongoClient.getDatabase("test");

System.out.println("Connect to database successfully");

MongoCollection collection = mongoDatabase.getCollection("test");

System.out.println("集合 test 选择成功");

collection.deleteOne(Filters.eq("likes", 200));//删除所有符合条件的文档

collection.deleteMany(Filters.eq("likes", 200));//检索查看结果

FindIterable findIterable =collection.find();

MongoCursor mongoCursor =findIterable.iterator();while(mongoCursor.hasNext()) {

System.out.println(mongoCursor.next());

}

}catch(Exception e) {

System.err.println(e.getClass().getName()+ ": " +e.getMessage());

}

}private static voidupdateDocument() {try{//连接到 mongodb 服务

MongoClient mongoClient = new MongoClient("localhost", 27017);//连接到数据库

MongoDatabase mongoDatabase = mongoClient.getDatabase("test");

System.out.println("Connect to database successfully");

MongoCollection collection = mongoDatabase.getCollection("test");

System.out.println("集合 test 选择成功");//更新文档 将文档中likes=100的文档修改为likes=200

collection.updateMany(Filters.eq("likes", 100), new Document("$set", new Document("likes", 200)));//检索查看结果

FindIterable findIterable =collection.find();

MongoCursor mongoCursor =findIterable.iterator();while(mongoCursor.hasNext()) {

System.out.println(mongoCursor.next());

}

}catch(Exception e) {

System.err.println(e.getClass().getName()+ ": " +e.getMessage());

}

}private static voidqueryDocument() {try{//连接到 mongodb 服务

MongoClient mongoClient = new MongoClient("localhost", 27017);//连接到数据库

MongoDatabase mongoDatabase = mongoClient.getDatabase("test");

System.out.println("Connect to database successfully");

MongoCollection collection = mongoDatabase.getCollection("test");

System.out.println("集合 test 选择成功");//检索所有文档

/*** 1. 获取迭代器FindIterable 2. 获取游标MongoCursor 3.

* 通过游标遍历检索出的文档集合*/FindIterable findIterable =collection.find();

MongoCursor mongoCursor =findIterable.iterator();while(mongoCursor.hasNext()) {

System.out.println(mongoCursor.next());

}

}catch(Exception e) {

System.err.println(e.getClass().getName()+ ": " +e.getMessage());

}

}private static voidinsertDoc() {try{//连接到 mongodb 服务

MongoClient mongoClient = new MongoClient("localhost", 27017);//连接到数据库

MongoDatabase mongoDatabase = mongoClient.getDatabase("test");

System.out.println("Connect to database successfully");

MongoCollection collection = mongoDatabase.getCollection("test");

System.out.println("集合 test 选择成功");//插入文档

/*** 1. 创建文档 org.bson.Document 参数为key-value的格式 2. 创建文档集合List

* 3. 将文档集合插入数据库集合中 mongoCollection.insertMany(List

* ) 插入单个文档可以用 mongoCollection.insertOne(Document)*/Document document= new Document("title", "MongoDB").append("description", "database").append("likes", 100)

.append("by", "Fly");

List documents = new ArrayList();

documents.add(document);

collection.insertMany(documents);

System.out.println("文档插入成功");

}catch(Exception e) {

System.err.println(e.getClass().getName()+ ": " +e.getMessage());

}

}private static voidgetConnection() {try{//连接到 mongodb 服务

MongoClient mongoClient = new MongoClient("localhost", 27017);//连接到数据库

MongoDatabase mongoDatabase = mongoClient.getDatabase("test");

System.out.println("Connect to database successfully");//获取所有的集合

ListCollectionsIterable listCollections =mongoDatabase.listCollections();

MongoCursor iterator =listCollections.iterator();while(iterator.hasNext()) {

System.out.println(iterator.next());

}

MongoCollection collection = mongoDatabase.getCollection("test");

System.out.println("集合 test 选择成功");

}catch(Exception e) {

System.err.println(e.getClass().getName()+ ": " +e.getMessage());

}

}private static voidcreateCollection() {try{//连接到 mongodb 服务//连接到 mongodb 服务

MongoClient mongoClient = new MongoClient("localhost", 27017);//连接到数据库//连接到数据库

MongoDatabase mongoDatabase = mongoClient.getDatabase("test");

System.out.println("Connect to database successfully");

mongoDatabase.createCollection("test");

System.out.println("集合创建成功");

}catch(Exception e) {

System.err.println(e.getClass().getName()+ ": " +e.getMessage());

}

}private static voidconnectNoPassword() {try{//连接到 mongodb 服务

MongoClient mongoClient = new MongoClient("localhost", 27017);//连接到数据库

MongoDatabase mongoDatabase = mongoClient.getDatabase("test");

System.out.println("Connect to database successfully");

}catch(Exception e) {

System.err.println(e.getClass().getName()+ ": " +e.getMessage());

}

}

}

2.封装成工具类的操作

pom.xml

org.mongodb

mongodb-driver

3.10.1

org.apache.logging.log4j

log4j-api

2.7

org.apache.logging.log4j

log4j-core

2.7

org.slf4j

slf4j-log4j12

1.7.2

packageUtils;importjava.util.concurrent.BlockingQueue;importjava.util.concurrent.LinkedBlockingQueue;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importcom.mongodb.MongoClient;importcom.mongodb.client.MongoDatabase;public classMongoHelper {private static final Logger logger = LoggerFactory.getLogger(MongoHelper.class);static final String DBName = "test";static final String ServerAddress = "127.0.0.1";static final int PORT = 27017;privateMongoHelper() {

}private static MongoClient mongoClient = newMongoClient(ServerAddress, PORT);//模拟连接池(阻塞队列)

private static LinkedBlockingQueue mongoDatabases = new LinkedBlockingQueue(5);static{

initMongoDatabases();

}private static voidinitMongoDatabases() {for (int i = 0; i < 5; i++) {

MongoDatabase mDatabase=mongoClient.getDatabase(DBName);

mongoDatabases.add(mDatabase);

}

}public static voidcloseMongoClient(MongoDatabase mongoDatabase) {

mongoDatabases.add(mongoDatabase);

logger.debug("CloseMongoClient successfully");

}public staticMongoDatabase getMongoDataBase() {try{

MongoDatabase mDatabase=mongoDatabases.take();returnmDatabase;

}catch(InterruptedException e) {

e.printStackTrace();return null;

}

}

}

packageUtils;importjava.util.List;importjava.util.Map;importorg.bson.Document;importcom.mongodb.BasicDBObject;importcom.mongodb.client.FindIterable;importcom.mongodb.client.MongoDatabase;/*** MongoDB数据操作接口

**/

public interfaceMongoDao {/*** 根据id检索文档

*

*@paramdb

*@paramtable

*@paramid

*@return*@throwsException*/

public Map queryByID(MongoDatabase db, String table, Object id) throwsException;/*** 根据doc检索文档集合,当doc是空的时候检索全部

*

*@paramdb

*@paramtable

*@paramdoc

*@return*@throwsException*/

public List> queryByDoc(MongoDatabase db, String table, BasicDBObject doc) throwsException;/*** 检索全部返回集合

*

*@paramdb

*@paramtable

*@return*@throwsException*/

public List> queryAll(MongoDatabase db, String table) throwsException;/*** 遍历迭代器返回文档集合

*

*@paramiterable

*@return*@throwsException*/

public List findIterable(FindIterable iterable) throwsException;/*** 插入文档

*

*@paramdb

*@paramtable

*@paramdoc

*@return*@throwsException*/

public boolean insert(MongoDatabase db, String table, Document doc) throwsException;/*** 插入多条文档

*

*@paramdb

*@paramtable

*@paramdoc

*@return*@throwsException*/

public boolean insertMany(MongoDatabase db, String table, List doc) throwsException;/*** 删除文档

*

*@paramdb

*@paramtable

*@paramdoc

*@return*@throwsException*/

public boolean delete(MongoDatabase db, String table, BasicDBObject doc) throwsException;/*** 删除单条文档

*

*@paramdb

*@paramtable

*@paramdoc

*@return*@throwsException*/

public boolean deleteOne(MongoDatabase db, String table, BasicDBObject doc) throwsException;/*** 修改文档

*

*@paramdb

*@paramtable

*@paramoldDoc

*@paramnewDoc

*@return*@throwsException*/

public boolean update(MongoDatabase db, String table, BasicDBObject oldDoc, BasicDBObject newDoc) throwsException;/*** 修改单条文档

*

*@paramdb

*@paramtable

*@paramwhereDoc

*@paramupdateDoc

*@return*@throwsException*/

public booleanupdateOne(MongoDatabase db, String table, BasicDBObject whereDoc, BasicDBObject updateDoc)throwsException;/*** 创建集合

*

*@paramdb

*@paramtable

*@throwsException*/

public void createCol(MongoDatabase db, String table) throwsException;/*** 删除集合

*

*@paramdb

*@paramtable

*@throwsException*/

public void dropCol(MongoDatabase db, String table) throwsException;

}

packageUtils;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;importorg.bson.Document;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importcom.mongodb.BasicDBObject;importcom.mongodb.client.FindIterable;importcom.mongodb.client.MongoCollection;importcom.mongodb.client.MongoCursor;importcom.mongodb.client.MongoDatabase;importcom.mongodb.client.result.DeleteResult;importcom.mongodb.client.result.UpdateResult;/*** MongoDB数据操作实现类

**/

public class MongoDaoImpl implementsMongoDao {private static final Logger logger = LoggerFactory.getLogger(MongoDaoImpl.class);public Map queryByID(MongoDatabase db, String table, Object id) throwsException {

MongoCollection collection =db.getCollection(table);

BasicDBObject query= new BasicDBObject("_id", id);//DBObject接口和BasicDBObject对象:表示一个具体的记录,BasicDBObject实现了DBObject,是key-value的数据结构,用起来和HashMap是基本一致的。

FindIterable iterable =collection.find(query);

Map jsonStrToMap = null;

MongoCursor cursor =iterable.iterator();while(cursor.hasNext()) {

Document user=cursor.next();

String jsonString=user.toJson();

jsonStrToMap= JsonStrToMap.jsonStrToMap(jsonString);//这里用到我自己写的方法,主要是包json字符串转换成map格式,为后面做准备,方法放在后面

}

logger.debug("检索ID完毕,db:{},table:{},id:{} ", db.getName(), table, id);returnjsonStrToMap;

}public List> queryByDoc(MongoDatabase db, String table, BasicDBObject doc) throwsException {

MongoCollection collection =db.getCollection(table);

FindIterable iterable =collection.find(doc);/*** 1. 获取迭代器FindIterable 2. 获取游标MongoCursor

* 3.通过游标遍历检索出的文档集合*/List> list = new ArrayList>();

MongoCursor cursor =iterable.iterator();while(cursor.hasNext()) {

Document user=cursor.next();

String jsonString=user.toJson();

Map jsonStrToMap =JsonStrToMap.jsonStrToMap(jsonString);

list.add(jsonStrToMap);

}

logger.debug("检索doc完毕,db:{},table:{},doc:{} ", db.getName(), table, doc.toJson());returnlist;

}public List> queryAll(MongoDatabase db, String table) throwsException {

MongoCollection collection =db.getCollection(table);

FindIterable iterable =collection.find();

List> list = new ArrayList>();

MongoCursor cursor =iterable.iterator();while(cursor.hasNext()) {

Document user=cursor.next();

String jsonString=user.toJson();

Map jsonStrToMap =JsonStrToMap.jsonStrToMap(jsonString);

list.add(jsonStrToMap);

}

logger.debug("检索全部完毕,db:{},table:{}", db.getName(), table);returnlist;

}public List findIterable(FindIterable iterable) throwsException {

List list = new ArrayList();

MongoCursor cursor =iterable.iterator();while(cursor.hasNext()) {

Document doc=cursor.next();

list.add(doc);

}

cursor.close();returnlist;

}public boolean insert(MongoDatabase db, String table, Document doc) throwsException {

MongoCollection collection =db.getCollection(table);

collection.insertOne(doc);long count =collection.count(doc);if (count >= 1) {

logger.debug("文档插入成功,影响条数:{},db:{},table:{},doc:{} ", count, db.getName(), table, doc.toJson());return true;

}else{

logger.debug("文档插入失败,影响条数:{},db:{},table:{},doc:{} ", count, db.getName(), table, doc.toJson());return false;

}

}public boolean insertMany(MongoDatabase db, String table, List doc) throwsException {

MongoCollection collection =db.getCollection(table);long preCount =collection.count();

collection.insertMany(doc);long nowCount =collection.count();if ((nowCount - preCount) ==doc.size()) {

logger.debug("文档插入成功,影响条数:{},db:{},table:{}", doc.size(), db.getName(), table);return true;

}else{

logger.debug("文档插入失败,影响条数:{},db:{},table:{}", (nowCount -preCount), db.getName(), table);return false;

}

}public boolean delete(MongoDatabase db, String table, BasicDBObject doc) throwsException {

MongoCollection collection =db.getCollection(table);

DeleteResult deleteManyResult=collection.deleteMany(doc);long deletedCount =deleteManyResult.getDeletedCount();if (deletedCount > 0) {

logger.debug("文档删除成功,影响条数:{},db:{},table:{},doc:{} ", deletedCount, db.getName(), table, doc.toJson());return true;

}else{

logger.debug("文档删除失败,影响条数:{},db:{},table:{},doc:{} ", 0, db.getName(), table, doc.toJson());return false;

}

}public boolean deleteOne(MongoDatabase db, String table, BasicDBObject doc) throwsException {

MongoCollection collection =db.getCollection(table);

DeleteResult deleteOneResult=collection.deleteOne(doc);long deletedCount =deleteOneResult.getDeletedCount();

System.out.println("删除的数量: " +deletedCount);if (deletedCount == 1) {

logger.debug("文档删除成功,影响条数:{},db:{},table:{},doc:{} ", deletedCount, db.getName(), table, doc.toJson());return true;

}else{

logger.debug("文档删除失败,影响条数:{},db:{},table:{},doc:{} ", 0, db.getName(), table, doc.toJson());return false;

}

}public booleanupdate(MongoDatabase db, String table, BasicDBObject whereDoc, BasicDBObject updateDoc)throwsException {

MongoCollection collection =db.getCollection(table);

UpdateResult updateManyResult= collection.updateMany(whereDoc, new Document("$set", updateDoc));long modifiedCount =updateManyResult.getModifiedCount();

System.out.println("修改的数量: " +modifiedCount);if (modifiedCount > 0) {

logger.debug("文档更新成功,影响条数:{},db:{},table:{},whereDoc:{},updateDoc:{} ", modifiedCount, db.getName(), table,

whereDoc.toJson(), updateDoc.toJson());return true;

}else{

logger.debug("文档更新成功,影响条数:{},db:{},table:{},whereDoc:{},updateDoc:{} ", 0, db.getName(), table,

whereDoc.toJson(), updateDoc.toJson());return false;

}

}public booleanupdateOne(MongoDatabase db, String table, BasicDBObject whereDoc, BasicDBObject updateDoc)throwsException {

MongoCollection collection =db.getCollection(table);

UpdateResult updateOneResult= collection.updateOne(whereDoc, new Document("$set", updateDoc));long modifiedCount =updateOneResult.getModifiedCount();

System.out.println("修改的数量: " +modifiedCount);if (modifiedCount == 1) {

logger.debug("文档更新成功,影响条数:{},db:{},table:{},whereDoc:{},updateDoc:{} ", 1, db.getName(), table,

whereDoc.toJson(), updateDoc.toJson());return true;

}else{

logger.debug("文档更新成功,影响条数:{},db:{},table:{},whereDoc:{},updateDoc:{} ", 0, db.getName(), table,

whereDoc.toJson(), updateDoc.toJson());return false;

}

}public void createCol(MongoDatabase db, String table) throwsException {

db.createCollection(table);

logger.debug("集合创建成功,db:{},table:{}", db.getName(), table);

}public void dropCol(MongoDatabase db, String table) throwsException {

db.getCollection(table).drop();

logger.debug("集合删除成功,db:{},table:{}", db.getName(), table);

}

}

packageUtils;importjava.util.HashMap;importjava.util.Map;importcom.mongodb.util.JSON;public classJsonStrToMap {/*** json 字符串转化为map格式

*

*@paramjsonString

*@return

*/

public static MapjsonStrToMap(String jsonString) {

Object parseObj= JSON.parse(jsonString); //反序列化 把json 转化为对象

Map map = (HashMap) parseObj; //把对象转化为map

returnmap;

}

}

测试类:

packagemongodb;importjava.util.List;importjava.util.Map;importorg.bson.Document;importcom.mongodb.client.MongoDatabase;importUtils.MongoDao;importUtils.MongoDaoImpl;importUtils.MongoHelper;public classUtilsTest {public static void main(String[] args) throwsException {//增加文档

MongoDao mongoDao= newMongoDaoImpl();

String table= "test";for (int i = 0; i < 6; i++) {

MongoDatabase db=MongoHelper.getMongoDataBase();

List> queryAll = mongoDao.queryAll(db, "test");

System.out.println(queryAll);

}

}private static void insertDoc(MongoDatabase db, MongoDao mongoDao, String table) throwsException {

Document document= new Document("title222", "MongoDB222").append("description", "database")

.append("likes", 100).append("by", "Fly");

mongoDao.insert(db, table, document);

}

}

结果会打印五次结果,并且阻塞一次。

上面代码改为下面即可正常打印6次:

for (int i = 0; i < 6; i++) {

MongoDatabase db=MongoHelper.getMongoDataBase();

List> queryAll = mongoDao.queryAll(db, "test");

System.out.println(queryAll);

MongoHelper.closeMongoClient(db);

}

3.springboot整合mongoDB的使用

pom.xml文件引入自动整合的jar包:

org.springframework.boot

spring-boot-starter-data-mongodb

2.1.4.RELEASE

application.properties文件引入相关的配置

##mongodb相关配置

spring.data.mongodb.host=127.0.0.1

spring.data.mongodb.port=27017

spring.data.mongodb.database=mydb

spring.data.mongodb.username=admin

spring.data.mongodb.password=admin

相关配置的类在   MongoDataAutoConfiguratio  类中。

注意:上面是需要账户和密码的用户的配置方式,其用户和密码是在mongodb的admin数据库中创建的用户(这点有点类似于mysql),语句如下:

>use admin

switched to db admin> db.createUser({"user":"root",pwd:"123456",roles:[{role:"root",db:"admin"}]})

Successfully added user: {"user" : "root","roles": [

{"role" : "root","db" : "admin"}

]

}

30da81212e34d501f01e3ade8bc4101c.png

实体类User.java

packagecn.qs.bean.user;importorg.springframework.data.annotation.Id;importjava.util.Date;public classUser {

@IdprivateInteger id;privateString username;privateString password;privateString fullname;privateString sex;privateString phone;privateString email;privateDate createtime;privateDate updatetime;publicInteger getId() {returnid;

}public voidsetId(Integer id) {this.id =id;

}publicString getUsername() {returnusername;

}public voidsetUsername(String username) {this.username = username == null ? null: username.trim();

}publicString getPassword() {returnpassword;

}public voidsetPassword(String password) {this.password = password == null ? null: password.trim();

}publicString getFullname() {returnfullname;

}public voidsetFullname(String fullname) {this.fullname = fullname == null ? null: fullname.trim();

}publicString getSex() {returnsex;

}public voidsetSex(String sex) {this.sex = sex == null ? null: sex.trim();

}publicString getPhone() {returnphone;

}public voidsetPhone(String phone) {this.phone = phone == null ? null: phone.trim();

}publicString getEmail() {returnemail;

}public voidsetEmail(String email) {this.email = email == null ? null: email.trim();

}publicDate getCreatetime() {returncreatetime;

}public voidsetCreatetime(Date createtime) {this.createtime =createtime;

}publicDate getUpdatetime() {returnupdatetime;

}public voidsetUpdatetime(Date updatetime) {this.updatetime =updatetime;

}

@OverridepublicString toString() {return "User{" +

"id=" + id +

", username='" + username + '\'' +

", password='" + password + '\'' +

", fullname='" + fullname + '\'' +

", sex='" + sex + '\'' +

", phone='" + phone + '\'' +

", email='" + email + '\'' +

", createtime=" + createtime +

", updatetime=" + updatetime +

'}';

}

}

UserDao.java

packagecn.qs.dao;importcn.qs.bean.user.User;importcn.qs.bean.user.UserExample;importorg.springframework.data.mongodb.repository.MongoRepository;importjava.util.List;/*** @Author: qlq

* @Description

* @Date: 22:06 2019/4/8*/

public interfaceUserDao {voidinsert(User record);voiddeleteByPrimaryKey(Integer id);voidupdateByPrimaryKeySelective(User record);voidupdateByPrimaryKey(User record);

ListselectUsers();

}

UserDaoImpl.java(  mongoTemplate 封装了好多方法,其中还包括查询并删除等方法  )

packagecn.qs.dao;importcn.qs.bean.user.User;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.mongodb.core.MongoTemplate;importorg.springframework.data.mongodb.core.query.Criteria;importorg.springframework.data.mongodb.core.query.Query;importorg.springframework.data.mongodb.core.query.Update;importorg.springframework.stereotype.Component;importjava.util.List;/*** @Author: qlq

* @Description

* @Date: 22:18 2019/4/8*/@Componentpublic class UserDaoImpl implementsUserDao {

@AutowiredprivateMongoTemplate mongoTemplate;

@Overridepublic voidinsert(User record) {

mongoTemplate.save(record);

}

@Overridepublic voiddeleteByPrimaryKey(Integer id) {

Query query=new Query(Criteria.where("id").is(id));

mongoTemplate.remove(query,User.class);

}

@Overridepublic voidupdateByPrimaryKeySelective(User record) {

Query query=new Query(Criteria.where("id").is(record.getId()));

Update update= new Update().set("fullname", record.getFullname()).set("username", record.getUsername());//更新查询返回结果集的第一条

mongoTemplate.updateFirst(query,update,User.class);//更新查询返回结果集的所有//mongoTemplate.updateMulti(query,update,User.class);

}

@Overridepublic voidupdateByPrimaryKey(User record) {

}

@Overridepublic ListselectUsers() {

Query query=new Query(Criteria.where("fullname").is("张三"));//查询单个//User user = mongoTemplate.findOne(query , User.class);

List users = mongoTemplate.find(query,User.class);returnusers;

}

}

UserMongoDbController.java(这里测试直接注入dao)

packagecn.qs.controller.user;importcn.qs.bean.user.User;importcn.qs.dao.UserDao;importcn.qs.service.user.UserService;importcn.qs.utils.DefaultValue;importcn.qs.utils.JSONResultUtil;importcn.qs.utils.MD5Util;importcn.qs.utils.ValidateCheck;importcom.github.pagehelper.PageHelper;importcom.github.pagehelper.PageInfo;importorg.apache.commons.collections.MapUtils;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.ui.ModelMap;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.RestController;importjavax.servlet.http.HttpServletRequest;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;importjava.util.Map;

@RestController/**自动返回的是json格式数据 ***/@RequestMapping("userMon")public classUserMongoDbController {private static final Logger logger = LoggerFactory.getLogger(UserMongoDbController.class);

@AutowiredprivateUserDao userDao;

@RequestMapping("/insert")publicString insert(User record){for(int i=0;i<10;i++){

User user= newUser();

user.setId(i+1);

user.setFullname("张三");

user.setUsername("zhangsan");

userDao.insert(user);

}return "s";

}

@RequestMapping("/deleteByPrimaryKey")publicString deleteByPrimaryKey(Integer id){return "s";

}

@RequestMapping("/updateByPrimaryKeySelective")publicString updateByPrimaryKeySelective(User record){return "s";

}

@RequestMapping("/updateByPrimaryKey")publicString updateByPrimaryKey(User record){return "s";

}

@RequestMapping("/selectUsers")public ListselectUsers(){returnuserDao.selectUsers();

}

}

启动之后调用增加的方法然后查看mongodb的数据信息:(User的ID做为mongodb的docid)

2d138173deaa88cb4c0c1fd4503d4de4.png

补充:还有第二种方式是使用继承   MongoRepository  的方式(=========SpringData的用法=========)

这种方式可以实现判断用户是否存在,可以排序查询以及分页查询等,而且这种方式支持自定义方法查询。下面介绍其用法:

例如:编写User的dao层接口,不用写实现

packagecn.qs.dao.user;importcn.qs.bean.user.User;importorg.springframework.data.mongodb.repository.MongoRepository;/*** @Author: qlq

* @Description

* @Date: 14:29 2019/4/14*/

public interface UserRepository extends MongoRepository{

}

测试代码:

packagetourism;importcn.qs.MySpringBootApplication;importcn.qs.bean.user.User;importcn.qs.dao.user.UserRepository;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.data.domain.Example;importorg.springframework.data.domain.ExampleMatcher;importorg.springframework.data.domain.Pageable;importorg.springframework.data.domain.Sort;importorg.springframework.test.context.junit4.SpringRunner;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;/*** @Author: qlq

* @Description

* @Date: 15:21 2019/4/14*/@RunWith(SpringRunner.class)

@SpringBootTest(classes= MySpringBootApplication.class)public classMongoDBTest {

@AutowiredprivateUserRepository userRepository;}

(1)测试基本的增删改查:

增加:

@Testpublic voidinsert() {for(int i=0;i<5;i++){

User user= newUser();

user.setId(i+1);

user.setFullname("张三");

user.setUsername("zhangsan");

userRepository.insert(user);

}

}

结果:

e4332cd55bc6ff28f5b09c34c0ad7152.png

删除

@Testpublic voiddelete() {//删除所有//userRepository.deleteAll();//删除单个

userRepository.delete(1);//删除单个

User user = newUser();

user.setId(2);

userRepository.delete(user);

}

结果:

bac25d7dc013de22dc8c4e1caca15fc8.png

修改(比如修改ID为3的用户信息)

@Testpublic voidupdate(){

User user= userRepository.findOne(3);

user.setFullname("修改后的值");

userRepository.save(user);

}

结果:

34c17f65c79dcfd547ad4e4b680e2668.png

查询

@Testpublic voidfindAll(){//不带查询条件

List list =userRepository.findAll();

System.out.println(list);//带查询条件(根据ID集合查询)

List ids = new ArrayList<>(3);

ids.add(3);

ids.add(4);

ids.add(5);

List list2 = (List) userRepository.findAll(ids);

System.out.println(list2);

}

@Testpublic voidfindOne(){//根据ID查询

User user = userRepository.findOne(3);

System.out.println(user);

}

(2)测试  Example  类的用法:

Example类可以用于条件筛选,可以对查询你单个进行过滤,也可以对批量查询过滤。

查询   fullname  以修改开头的用户信息:(查询单个)

@Testpublic voidexampleUse() {

User user= newUser();

user.setFullname("修改");

user.setUsername("xxxxxx");

ExampleMatcher matcher= ExampleMatcher.matching().withMatcher("fullname",ExampleMatcher.GenericPropertyMatchers.startsWith())//查询以修改开头

.withIgnorePaths("username");//忽略username属性

Example example =Example.of(user,matcher);

User user2=userRepository.findOne(example);

System.out.println("user2"+user2);

}

结果:

user2User{id=3, username='zhangsan', password='null', fullname='修改后的值', sex='null', phone='null', email='null', createtime=null, updatetime=null}

查询集合:查询username包含zhang的用户集合:

@Testpublic voidexampleUse() {

User user= newUser();

user.setFullname("xxx");

user.setUsername("zhang");

ExampleMatcher matcher= ExampleMatcher.matching().withMatcher("username",ExampleMatcher.GenericPropertyMatchers.contains())//查询username包含zhang

.withIgnorePaths("fullname");//忽略fullname属性

Example example =Example.of(user,matcher);

List users =userRepository.findAll(example);

System.out.println(users);

}

结果:

[User{id=3, username='zhangsan', password='null', fullname='修改后的值', sex='null', phone='null', email='null', createtime=null, updatetime=null}, User{id=4, username='zhangsan', password='null', fullname='张三', sex='null', phone='null', email='null', createtime=null, updatetime=null}, User{id=5, username='zhangsan', password='null', fullname='张三', sex='null', phone='null', email='null', createtime=null, updatetime=null}]

(3)分页查询(注意页号从0开始,不带条件查询)

PagingAndSortingRepository 接口中的分页方法,也可以进行分页排序,但是不具备条件过滤功能:

@Testpublic voidpageFind() {

//构造请求参数,页号从0开始。

PageRequest pageRequest = new PageRequest(0,2);

Page page =userRepository.findAll(pageRequest);

System.out.println("总数:"+page.getTotalElements());

System.out.println("总页数:"+page.getTotalPages());

System.out.println(page.getContent());

}

结果:

总数:3

总页数:2

[User{id=3, username='zhangsan', password='null', fullname='修改后的值', sex='null', phone='null', email='null', createtime=null, updatetime=null}, User{id=4, username='zhangsan', password='null', fullname='张三', sex='null', phone='null', email='null', createtime=null, updatetime=null}]

增加id逆序查询:

@Testpublic voidpageFind() {//构造排序

List orders = new ArrayList();

orders.add(new Sort.Order(Sort.Direction.DESC, "id"));

Sort sort= newSort(orders);//构造请求参数,页号从0开始。

PageRequest pageRequest = new PageRequest(0,2,sort);

Page page =userRepository.findAll(pageRequest);

System.out.println("总数:"+page.getTotalElements());

System.out.println("总页数:"+page.getTotalPages());

System.out.println(page.getContent());

}

结果:

总数:3

总页数:2

[User{id=5, username='zhangsan', password='null', fullname='张三', sex='null', phone='null', email='null', createtime=null, updatetime=null}, User{id=4, username='zhangsan', password='null', fullname='张三', sex='null', phone='null', email='null', createtime=null, updatetime=null}]

(4)分页查询带条件:

QueryByExampleExecutor接口的方法。

@Testpublic voidpageFind() {

User user= newUser();

user.setFullname("修改");

user.setUsername("xxx");

ExampleMatcher matcher= ExampleMatcher.matching().withMatcher("fullname",ExampleMatcher.GenericPropertyMatchers.contains())//查询fullname包含修改

.withIgnorePaths("username");//忽略username属性

Example example =Example.of(user,matcher);//构造请求参数,页号从0开始。

Pageable pageRequest = new QPageRequest(0,2);

Page page =userRepository.findAll(example,pageRequest);

System.out.println("总数:"+page.getTotalElements());

System.out.println("总页数:"+page.getTotalPages());

System.out.println(page.getContent());

}

结果:

总数:1

总页数:1

[User{id=3, username='zhangsan', password='null', fullname='修改后的值', sex='null', phone='null', email='null', createtime=null, updatetime=null}]

(5)自定义方法进行查询:

And ---等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd);

Or---等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user, String addr);

Between--- 等价于 SQL 中的 between 关键字,比如 findBySalaryBetween(int max, intmin);

LessThan--- 等价于 SQL 中的 "

GreaterThan--- 等价于 SQL 中的">",比如 findBySalaryGreaterThan(intmin);

IsNull--- 等价于 SQL 中的 "is null",比如 findByUsernameIsNull();

IsNotNull--- 等价于 SQL 中的 "is not null",比如 findByUsernameIsNotNull();

NotNull---与 IsNotNull 等价;

Like--- 等价于 SQL 中的 "like",比如 findByUsernameLike(String user);

NotLike--- 等价于 SQL 中的 "not like",比如 findByUsernameNotLike(String user);

OrderBy--- 等价于 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user);

Not--- 等价于 SQL 中的 "! =",比如 findByUsernameNot(String user);

In--- 等价于 SQL 中的 "in",比如 findByUsernameIn(CollectionuserList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;

NotIn--- 等价于 SQL 中的 "not in",比如 findByUsernameNotIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;

例如:

packagecn.qs.dao.user;importcn.qs.bean.user.User;importorg.springframework.data.mongodb.repository.MongoRepository;importjava.util.List;/*** @Author: qlq

* @Description

* @Date: 14:29 2019/4/14*/

public interface UserRepository extends MongoRepository{publicUser findByUsernameAndFullname(String username,String fullname);public ListfindByFullnameNot(String fullname);

}

测试类:

@Testpublic voidexpandMethod(){

User user= userRepository.findByUsernameAndFullname("zhangsan","修改后的值");

System.out.println(user);

List users = userRepository.findByFullnameNot("修改后的值");

System.out.println(users);

}

结果:

User{id=3, username='zhangsan', password='null', fullname='修改后的值', sex='null', phone='null', email='null', createtime=null, updatetime=null}

[User{id=4, username='zhangsan', password='null', fullname='张三', sex='null', phone='null', email='null', createtime=null, updatetime=null}, User{id=5, username='zhangsan', password='null', fullname='张三', sex='null', phone='null', email='null', createtime=null, updatetime=null}]

解释:

1.Repository 是一个空接口,即是一个标记接口。源码

public interface Repository{

}

2.若我们定义的接口实现了 Repository,则该接口会被 IOC 容器识别为一个 Repository Bean,纳入到 IOC 容器中,进而可以在该接口中定义一些符合规范的方法

3.还可以通过 @RepositoryDefinition 注解来替代继承 Repository 接口

4.Repository 接口的实现类:(这都是属于spring data的模块)

1)CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法

2)PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法(但是不具备条件筛选功能)

3)自定义的 XxxxRepository 需要继承 PagingAndSortingRepository,这样的 XxxxRepository 接口就具备了通用的数据访问控制层的能力。(一般也会继承QueryByExampleExecutor接口,使分页具备条件查询  )

注: QueryByExampleExecutor: 不属于Repository体系,实现一组 JPA Criteria 查询相关的方法

//

//Source code recreated from a .class file by IntelliJ IDEA//(powered by Fernflower decompiler)//

packageorg.springframework.data.repository.query;importorg.springframework.data.domain.Example;importorg.springframework.data.domain.Page;importorg.springframework.data.domain.Pageable;importorg.springframework.data.domain.Sort;public interface QueryByExampleExecutor{ S findOne(Examplevar1); Iterable findAll(Examplevar1); Iterable findAll(Examplevar1, Sort var2); Page findAll(Examplevar1, Pageable var2); long count(Examplevar1); boolean exists(Examplevar1);

}

补充:如果bean的唯一标识是String类型,则insert的时候会自动添加设置id为mongodb的ObjectId

public classUser2 {

@IdprivateString id;privateString username;privateString password;privateString fullname;privateString sex;privateString phone;privateString email;privateDate createtime;privateDate updatetime;

...

}

测试插入:

@Testpublic voidinsert() {for(int i=0;i<5;i++){

User2 user= newUser2();

user.setFullname("张三");

user.setUsername("zhangsan");

userRepository.insert(user);

}

}

结果:

43d8d864ceec30f2f52912f87f323f80.png

补充:Page对象封装了分页所需要的全部参数(与普通分页封装类的区别是页号从0开始)

36cf0673b9bf3775b29d3bce10382bda.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值