这是一篇关于springboot项目中使用mongodb。
环境:
jdk 1.8
springboot 1.5.6.RELEASE
maven 3.5
springboot集成这个三方插件就是简单,只需要引入依赖,在properties或者yml中
添加相应的参数配置就好了。
(1) 引入依赖
以maven为例:
其中mongodb两个依赖包:
org.springframework.boot
spring-boot-starter-data-mongodb
1.5.6.RELEASE
org.mongodb
mongodb-driver
3.4.2
(2)properties或者yml配置(我这次没用到这个配置,是在工具类代码中直接写的)
以yml为例:
spring:
data:
mongodb:
host: 127.0.0.1
port: 27017
username: music
password: music
database: music
这里几个参数就是:
IP地址,端口号,用户名,密码,数据库。
2. mongodb的使用
(1)创建想存到mongo中的实体映射类,继承Document类
我这里是想存一些歌曲。
MusicInfo.java:
package com.test.test.test.bean;
import org.bson.BsonDocument;
import org.bson.BsonDocumentWrapper;
import org.bson.Document;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.types.ObjectId;
import java.io.Serializable;
/**
* Created by
*/
public class MusicInfo extends Document implements Serializable {
private Integer returnId;
private Integer id;
private String mid;
private String desc;
private String name;
private String singerName;
private String fileHash;
private String hqHash;
private String albumId;
private String type; //平台标识
private String keyword; //查询关键字
/**
* 无参构造=
*/
public MusicInfo() {
super();
}
/**
* 全参构造,添加到Map中
*/
public MusicInfo(Integer returnId, Long id, String mid, String desc, String name, String singerName, String fileHash, String hqHash, String albumId, String type) {
super();
this.append("returnId", returnId).append("id", id).append("mid", mid)
.append("desc", desc).append("name", name).append("singerName", singerName)
.append("fileHash", fileHash).append("albumId", albumId).append("type", type)
.append("keyword",keyword);
}
public MusicInfo(String keyword) {
super();
this.append("keyword", keyword);
}
/**
* 该方法用于collection的update
*/
public void setUpdate(MusicInfo musicInfo) {
this.append("$set", musicInfo);
}
/**
* mongo 中的_id
*
* @return
*/
public ObjectId get_Id() {
return this.getObjectId("_id");
}
public void set_Id(ObjectId id) {
this.append("_id", id);
}
public Integer getReturnId() {
//return returnId;
return this.getInteger("returnId");
}
public void setReturnId(Integer returnId) {
//this.returnId = returnId;
this.append("returnId", returnId);
}
public Integer getId() {
Integer integer = this.getInteger("id");
return integer;
//return id;
}
public void setId(Integer id) {
//this.id = id;
this.append("id", id);
}
public String getMid() {
return this.getString("mid");
//return mid;
}
public void setMid(String mid) {
//this.mid = mid;
this.append("mid", mid);
}
public String getDesc() {
return this.getString("desc");
// return desc;
}
public void setDesc(String desc) {
//this.desc = desc;
this.append("desc", desc);
}
public String getName() {
return this.getString("name");
// return name;
}
public void setName(String name) {
this.append("name", name);
// this.name = name;
}
public String getSingerName() {
return this.getString("singerName");
// return singerName;
}
public void setSingerName(String singerName) {
this.append("singerName", singerName);
//this.singerName = singerName;
}
public String getFileHash() {
return this.getString("fileHash");
//return fileHash;
}
public void setFileHash(String fileHash) {
this.append("fileHash", fileHash);
// this.fileHash = fileHash;
}
public String getHqHash() {
return this.getString("hqHash");
//return hqHash;
}
public void setHqHash(String hqHash) {
this.append("hqHash", hqHash);
// this.hqHash = hqHash;
}
public String getAlbumId() {
return this.getString("albumId");
//return albumId;
}
public void setAlbumId(String albumId) {
this.append("albumId", albumId);
// this.albumId = albumId;
}
public String getType() {
return this.getString("type");
//return albumId;
}
public void setType(String type) {
this.append("type", type);
// this.albumId = albumId;
}
public String getKeyword() {
return this.getString("keyword");
//return albumId;
}
public void setKeyword(String keyword) {
this.append("keyword", keyword);
// this.albumId = albumId;
}
public BsonDocument toBsonDocument(Class documentClass, CodecRegistry codecRegistry) {
// TODO Auto-generated method stub
return new BsonDocumentWrapper(this, codecRegistry.get(MusicInfo.class));
}
@Override
public String toString() {
return "MusicInfo[" +
"_id='" + this.get_Id() + '\'' +
"albumId='" + this.getAlbumId() + '\'' +
", returnId=" + this.getReturnId() +
", id=" + this.getId() +
", mid='" + this.getMid() + '\'' +
", desc='" + this.getDesc() + '\'' +
", name='" + this.getName() + '\'' +
", singerName='" + this.getSingerName() + '\'' +
", fileHash='" + this.getFileHash() + '\'' +
", hqHash='" + this.getHqHash() + '\'' +
", type='" + this.getType() + '\'' +
']';
}
}
(2) 创建歌曲对应操作mongodb的注册类
实现 CollectibleCodec接口
MusicInfoCodec.java:
package com.test.test.test.bean;
import org.bson.*;
import org.bson.assertions.Assertions;
import org.bson.codecs.*;
import org.bson.codecs.configuration.CodecRegistry;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import static java.util.Arrays.asList;
import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
/**
* Created by .
*
*
*/
public class MusicInfoCodec implements CollectibleCodec {
private static final String ID_FIELD_NAME = "_id";
private static final CodecRegistry DEFAULT_REGISTRY = fromProviders(asList(new ValueCodecProvider(),
new BsonValueCodecProvider(),
new DocumentCodecProvider()));
private static final BsonTypeClassMap DEFAULT_BSON_TYPE_CLASS_MAP = new BsonTypeClassMap();
private final CodecRegistry registry;
private final BsonTypeClassMap bsonTypeClassMap;
private final IdGenerator idGenerator;
private final Transformer valueTransformer;
public MusicInfoCodec() {
this(DEFAULT_REGISTRY, DEFAULT_BSON_TYPE_CLASS_MAP);
}
public MusicInfoCodec(final CodecRegistry registry, final BsonTypeClassMap bsonTypeClassMap) {
this(registry, bsonTypeClassMap, null);
}
public MusicInfoCodec(final CodecRegistry registry, final BsonTypeClassMap bsonTypeClassMap, final Transformer valueTransformer) {
this.registry = Assertions.notNull("registry", registry);
this.bsonTypeClassMap = Assertions.notNull("bsonTypeClassMap", bsonTypeClassMap);
this.idGenerator = Assertions.notNull("idGenerator", new ObjectIdGenerator());
this.valueTransformer = valueTransformer != null ? valueTransformer : new Transformer() {
@Override
public Object transform(final Object value) {
return value;
}
};
}
@Override
public boolean documentHasId(final MusicInfo document) {
return document.containsKey(ID_FIELD_NAME);
}
@Override
public BsonValue getDocumentId(final MusicInfo document) {
if (!documentHasId(document)) {
throw new IllegalStateException("The document does not contain an _id");
}
Object id = document.get(ID_FIELD_NAME);
if (id instanceof BsonValue) {
return (BsonValue) id;
}
BsonDocument idHoldingDocument = new BsonDocument();
BsonWriter writer = new BsonDocumentWriter(idHoldingDocument);
writer.writeStartDocument();
writer.writeName(ID_FIELD_NAME);
writeValue(writer, EncoderContext.builder().build(), id);
writer.writeEndDocument();
return idHoldingDocument.get(ID_FIELD_NAME);
}
@Override
public MusicInfo generateIdIfAbsentFromDocument(final MusicInfo document) {
if (!documentHasId(document)) {
document.put(ID_FIELD_NAME, idGenerator.generate());
}
return document;
}
@Override
public void encode(final BsonWriter writer, final MusicInfo document, final EncoderContext encoderContext) {
writeMap(writer, document, encoderContext);
}
@Override
public MusicInfo decode(final BsonReader reader, final DecoderContext decoderContext) {
MusicInfo document = new MusicInfo();
reader.readStartDocument();
while (reader.readBsonType() != BsonType.END_OF_DOCUMENT) {
String fieldName = reader.readName();
document.put(fieldName, readValue(reader, decoderContext));
}
reader.readEndDocument();
return document;
}
@Override
public Class getEncoderClass() {
return MusicInfo.class;
}
private void beforeFields(final BsonWriter bsonWriter, final EncoderContext encoderContext, final Map document) {
if (encoderContext.isEncodingCollectibleDocument() && document.containsKey(ID_FIELD_NAME)) {
bsonWriter.writeName(ID_FIELD_NAME);
writeValue(bsonWriter, encoderContext, document.get(ID_FIELD_NAME));
}
}
private boolean skipField(final EncoderContext encoderContext, final String key) {
return encoderContext.isEncodingCollectibleDocument() && key.equals(ID_FIELD_NAME);
}
@SuppressWarnings({"unchecked", "rawtypes"})
private void writeValue(final BsonWriter writer, final EncoderContext encoderContext, final Object value) {
if (value == null) {
writer.writeNull();
} else if (Iterable.class.isAssignableFrom(value.getClass())) {
writeIterable(writer, (Iterable
(3) MongoService:
(用于增删改查,这里只用到了查询和插入方法)
/**
* Created by
*/
@Service
public class MongoService {
/**
* 数据插入MongoDB(初版)
* @param Codec 用户将bson转化为Object的类
* @param musicInfos 需要存储的实体集合
* @param dbName 选择的db
*/
//insertMongo(KeyEnum.TYPE_XIAMI.getKey(),keyword,resultContent);
public void insertMongo(CollectibleCodec Codec,List musicInfos,String dbName){
String colName = "songlist";
MongoUtil instance = MongoUtil.instance;
CodecRegistry registry = CodecRegistries.fromCodecs(Codec);
MongoDatabase database = MongoUtil.instance.getDB(dbName);
if(instance.getCollection(dbName, colName) ==null ){
instance.createCollection(dbName, colName);
}
MongoCollection music = database.withCodecRegistry(registry).getCollection(colName, MusicInfo.class);
musicInfos.forEach(item->{
MusicInfo first = music.find(item, MusicInfo.class).first();
if(null != first){
return;
}
music.insertOne(item);
});
}
public MongoService() {
}
/**
*
* @param Codec 用户将bson转化为Object的类
* @param musicInfo 封装查询条件的实体
* @param dbName 选择的db
* @return List
*/
public List getSongFromMongo(CollectibleCodec Codec,MusicInfo musicInfo,String dbName){
String colName = "songlist";
MongoUtil instance = MongoUtil.instance;
CodecRegistry registry = CodecRegistries.fromCodecs(Codec);
MongoDatabase database = MongoUtil.instance.getDB(dbName);
if(instance.getCollection(dbName, colName) ==null ){
instance.createCollection(dbName, colName);
}
MongoCollection music = database.withCodecRegistry(registry).getCollection(colName, MusicInfo.class);
ArrayList musicInfos = new ArrayList<>();
Block block = new Block() {
public void apply(MusicInfo t) {
musicInfos.add(t);
}
};
music.find(musicInfo,MusicInfo.class).forEach(block);
return musicInfos;
}
public static void main(String[] args) {
//查询
// List musicInfoMongos = new MongoService().getSongFromMongo(new MusicInfoCodec(), new MusicInfo("小幸运"), "music";
// for (int i = 0; i < musicInfoMongos.size(); i++) {
// MusicInfo musicInfo = musicInfoMongos.get(i);
// System.out.println("mongo__"+musicInfo.getName());
// }
}
}
(4) MongoUtil
用于mongoClient 客户端的连接
package com.test.test.test.utils;
import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientOptions.Builder;
import com.mongodb.WriteConcern;
import com.mongodb.client.*;
import com.mongodb.client.model.Filters;
import com.mongodb.client.result.DeleteResult;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.bson.types.ObjectId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Projections.*;
import static com.mongodb.client.model.Sorts.ascending;
/**
* Created by .
*/
public enum MongoUtil {
/**
* 定义一个枚举的元素,它代表此类的一个实例
*/
instance;
private static MongoClient mongoClient;
static {
System.out.println("===============MongoDBUtil初始化========================");
String ip = "127.0.0.1";
int port =27017;
instance.mongoClient = new MongoClient(ip, port);
// 大部分用户使用mongodb都在安全内网下,但如果将mongodb设为安全验证模式,就需要在客户端提供用户名和密码:
// boolean auth = db.authenticate(myUserName, myPassword);
Builder options = new MongoClientOptions.Builder();
options.cursorFinalizerEnabled(true);
// options.autoConnectRetry(true);// 自动重连true
// options.maxAutoConnectRetryTime(10); // the maximum auto connect retry time
options.connectionsPerHost(300);// 连接池设置为300个连接,默认为100
options.connectTimeout(30000);// 连接超时,推荐>3000毫秒
options.maxWaitTime(5000); //
options.socketTimeout(0);// 套接字超时时间,0无限制
options.threadsAllowedToBlockForConnectionMultiplier(5000);// 线程队列数,如果连接线程排满了队列就会抛出“Out of semaphores to get db”错误。
options.writeConcern(WriteConcern.SAFE);//
options.build();
}
// ------------------------------------共用方法---------------------------------------------------
/**
* 获取DB实例 - 指定DB
*
* @param dbName
* @return
*/
public MongoDatabase getDB(String dbName) {
if (dbName != null && !"".equals(dbName)) {
MongoDatabase database = mongoClient.getDatabase(dbName);
return database;
}
return null;
}
//mongoDatabase.createCollection("test");
public void createCollection(String dbName, String collName){
try{
mongoClient.getDatabase(dbName).createCollection(collName);
}catch(Exception e){
System.err.println(e.getClass().getName() + ": " + e.getMessage() );
}
}
/**
* 获取collection对象 - 指定Collection
*
* @param collName
* @return
*/
public MongoCollection getCollection(String dbName, String collName) {
if (null == collName || "".equals(collName)) {
return null;
}
if (null == dbName || "".equals(dbName)) {
return null;
}
MongoCollection collection = mongoClient.getDatabase(dbName).getCollection(collName);
return collection;
}
/**
* 查询DB下的所有表名
*/
public List getAllCollections(String dbName) {
MongoIterable colls = getDB(dbName).listCollectionNames();
List _list = new ArrayList();
for (String s : colls) {
_list.add(s);
}
return _list;
}
/**
* 获取所有数据库名称列表
*
* @return
*/
public MongoIterable getAllDBNames() {
MongoIterable s = mongoClient.listDatabaseNames();
return s;
}
/**
* 删除一个数据库
*/
public void dropDB(String dbName) {
getDB(dbName).drop();
}
/**
* 查找对象 - 根据主键_id
*
* @param collection
* @param id
* @return
*/
public Document findById(MongoCollection collection, String id) {
Document myDoc = collection.find(Filters.eq("_id", id)).first();
return myDoc;
}
/** 统计数 */
public int getCount(MongoCollection coll) {
int count = (int) coll.count();
return count;
}
/** 条件查询 */
public MongoCursor find(MongoCollection coll, Bson filter) {
return coll.find(filter).iterator();
}
/** 分页查询 */
public MongoCursor findByPage(MongoCollection coll, Bson filter, int pageNo, int pageSize) {
Bson orderBy = new BasicDBObject("_id", 1);
return coll.find(filter).sort(orderBy).skip((pageNo - 1) * pageSize).limit(pageSize).iterator();
}
/**
* 通过ID删除
*
* @param coll
* @param id
* @return
*/
public int deleteById(MongoCollection coll, String id) {
int count = 0;
ObjectId _id = null;
try {
_id = new ObjectId(id);
} catch (Exception e) {
return 0;
}
Bson filter = Filters.eq("_id", _id);
DeleteResult deleteResult = coll.deleteOne(filter);
count = (int) deleteResult.getDeletedCount();
return count;
}
/**
* FIXME
*
* @param coll
* @param id
* @param newdoc
* @return
*/
public Document updateById(MongoCollection coll, String id, Document newdoc) {
ObjectId _idobj = null;
try {
_idobj = new ObjectId(id);
} catch (Exception e) {
return null;
}
Bson filter = Filters.eq("_id", _idobj);
// coll.replaceOne(filter, newdoc); // 完全替代
coll.updateOne(filter, new Document("$set", newdoc));
return newdoc;
}
public void dropCollection(String dbName, String collName) {
getDB(dbName).getCollection(collName).drop();
}
/**
* 关闭Mongodb
*/
public void close() {
if (mongoClient != null) {
mongoClient.close();
mongoClient = null;
}
}
/**
* 测试入口
*
* @param args
* @throws CloneNotSupportedException
*/
public static void main(String[] args) {
String dbName = "music";
String collName = "songlist";
MongoCollection coll = MongoUtil.instance.getCollection(dbName, collName);
ListIndexesIterable list = coll.listIndexes();//查询所有索引
for (Document document : list) {
System.out.println("---"+document.toJson());
}
}
}
(5) MongoService的使用:
@Autowired
private MongoService mongoService;
public void insertMongo(){
List musicInfos = new ArrayList<>();
mongoService.insertMongo(new MusicInfoCodec(),monicInfos, "music");
}
上一张成功的图:
最后安利一个mongodb的PC图形化客户端:
Robo 3T
Robo 3T官网