diff --git a/README.md b/README.md
index f22ff71..0b8890d 100644
--- a/README.md
+++ b/README.md
@@ -31,9 +31,9 @@ spring-cloud:Finchley.SR2
| [spring-jdbc](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-jdbc)
[spring-jdbc-annotation](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-jdbc-annotation) | spring jdbc-template 的使用 | [Using JdbcTemplat](https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/data-access.html#jdbc-JdbcTemplate) |
| [spring-mybatis](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-mybatis)
[spring-mybatis-annotation](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-mybatis-annotation) | spring 整合 mybatis | [mybatis-spring中文文档](http://www.mybatis.org/spring/zh/index.html) |
| [spring-druid-mybatis](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-druid-mybatis)
[spring-druid-mybatis-annotation](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-druid-mybatis-annotation) | spring 整合druid、mybatis | [alibaba druid](https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98) |
-| spring-redis
spring-redis-annotation | spring 整合 redis | [redisson中文文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) |
-| spring-mongodb
spring-mongodb-annotation | spring 整合 mongodb | [Xmemcached中文文档](https://github.com/killme2008/xmemcached/wiki/Xmemcached%20%E4%B8%AD%E6%96%87%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97) |
-| spring-memcached
spring-memcached-annotation | spring 整合 memcached | |
+| spring-redis
spring-redis-annotation | spring 整合 redis 单机、集群(jedis)
spring 整合 redis 单机、集群(redisson) | [redisson中文文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) |
+| spring-mongodb
spring-mongodb-annotation | spring 整合 mongodb | |
+| spring-memcached
spring-memcached-annotation | spring 整合 memcached | [Xmemcached中文文档](https://github.com/killme2008/xmemcached/wiki/Xmemcached%20%E4%B8%AD%E6%96%87%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97) |
| spring-rabbitmq
spring-rabbitmq-annotation | spring 整合 rabbitmq | |
| spring-kafka
spring-kafka-annotation | spring 整合 kafka | |
| spring-dubbo
spring-dubbo-annotation | spring 整合 dubbo | |
diff --git a/spring/spring-mongodb-annotation/pom.xml b/spring/spring-mongodb-annotation/pom.xml
new file mode 100644
index 0000000..2f7c834
--- /dev/null
+++ b/spring/spring-mongodb-annotation/pom.xml
@@ -0,0 +1,69 @@
+
+
+ 4.0.0
+
+ com.heibaiying
+ spring-mongodb-annotation
+ 1.0-SNAPSHOT
+
+
+ 5.1.3.RELEASE
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-beans
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-core
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-web
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-webmvc
+ ${spring-base-version}
+
+
+
+ org.springframework.data
+ spring-data-mongodb
+ 2.1.3.RELEASE
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.springframework
+ spring-test
+ ${spring-base-version}
+ test
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-mongodb-annotation/src/main/java/com/heibaiying/bean/Programmer.java b/spring/spring-mongodb-annotation/src/main/java/com/heibaiying/bean/Programmer.java
new file mode 100644
index 0000000..5cff5ab
--- /dev/null
+++ b/spring/spring-mongodb-annotation/src/main/java/com/heibaiying/bean/Programmer.java
@@ -0,0 +1,25 @@
+package com.heibaiying.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Programmer {
+
+ private String name;
+
+ private int age;
+
+ private float salary;
+
+ private Date birthday;
+}
diff --git a/spring/spring-mongodb-annotation/src/main/java/com/heibaiying/config/MongoConfig.java b/spring/spring-mongodb-annotation/src/main/java/com/heibaiying/config/MongoConfig.java
new file mode 100644
index 0000000..8baedea
--- /dev/null
+++ b/spring/spring-mongodb-annotation/src/main/java/com/heibaiying/config/MongoConfig.java
@@ -0,0 +1,39 @@
+package com.heibaiying.config;
+
+import com.mongodb.MongoClient;
+import com.mongodb.MongoClientOptions;
+import com.mongodb.ServerAddress;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.mongodb.MongoDbFactory;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
+
+/**
+ * @author : heibaiying
+ * @description : Mongo 配置类
+ */
+
+@Configuration
+@ComponentScan(value = "com.heibaiying.*")
+public class MongoConfig {
+
+ @Bean
+ public MongoDbFactory mongoDbFactory(MongoProperty mongo) {
+ MongoClientOptions options = MongoClientOptions.builder()
+ .threadsAllowedToBlockForConnectionMultiplier(mongo.getMultiplier())
+ .connectionsPerHost(mongo.getConnectionsPerHost())
+ .connectTimeout(mongo.getConnectTimeout())
+ .maxWaitTime(mongo.getMaxWaitTime())
+ .socketTimeout(mongo.getSocketTimeout())
+ .build();
+ MongoClient client = new MongoClient(new ServerAddress(mongo.getHost(), mongo.getPort()), options);
+ return new SimpleMongoDbFactory(client, mongo.getDbname());
+ }
+
+ @Bean
+ public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory) {
+ return new MongoTemplate(mongoDbFactory);
+ }
+}
diff --git a/spring/spring-mongodb-annotation/src/main/java/com/heibaiying/config/MongoProperty.java b/spring/spring-mongodb-annotation/src/main/java/com/heibaiying/config/MongoProperty.java
new file mode 100644
index 0000000..b815d77
--- /dev/null
+++ b/spring/spring-mongodb-annotation/src/main/java/com/heibaiying/config/MongoProperty.java
@@ -0,0 +1,35 @@
+package com.heibaiying.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+/**
+ * @author : heibaiying
+ * @description : Mongo 配置属性
+ */
+@Data
+@Configuration
+@PropertySource(value = "classpath:mongodb.properties")
+public class MongoProperty {
+
+ @Value("${mongo.host}")
+ private String host;
+ @Value("${mongo.port}")
+ private int port;
+ @Value("${mongo.dbname}")
+ private String dbname;
+ @Value("${mongo.connectionsPerHost}")
+ private int connectionsPerHost;
+ @Value("${mongo.threadsAllowedToBlockForConnectionMultiplier}")
+ private int multiplier;
+ @Value("${mongo.connectTimeout}")
+ private int connectTimeout;
+ @Value("${mongo.maxWaitTime}")
+ private int maxWaitTime;
+ @Value("${mongo.socketKeepAlive}")
+ private boolean socketKeepAlive;
+ @Value("${mongo.socketTimeout}")
+ private int socketTimeout;
+}
diff --git a/spring/spring-mongodb-annotation/src/main/resources/mongodb.properties b/spring/spring-mongodb-annotation/src/main/resources/mongodb.properties
new file mode 100644
index 0000000..4ead0c0
--- /dev/null
+++ b/spring/spring-mongodb-annotation/src/main/resources/mongodb.properties
@@ -0,0 +1,17 @@
+mongo.host=192.168.200.228
+mongo.port=27017
+# ݿ. Ĭ'db'.
+mongo.dbname=database
+# ÿ
+mongo.connectionsPerHost=10
+# ̶߳connectionsPerHostֵ˵Ľ̶ֵ߳߳˶оͻ׳쳣
+mongo.threadsAllowedToBlockForConnectionMultiplier=5
+# ӳʱĺ 0Ĭֵ
+mongo.connectTimeout=1000
+# ȴӵ߳ʱ Ĭ120000 ms (2 minutes).
+mongo.maxWaitTime=1500
+# ֻ־Ƿֱֻʱ ٷĬΪtrue Ҳ
+mongo.socketKeepAlive=true
+# Ⱥӵֳʱ
+mongo.socketTimeout=1500
+
diff --git a/spring/spring-mongodb-annotation/src/test/java/com/heibaiying/mongo/MongoDBTest.java b/spring/spring-mongodb-annotation/src/test/java/com/heibaiying/mongo/MongoDBTest.java
new file mode 100644
index 0000000..173a528
--- /dev/null
+++ b/spring/spring-mongodb-annotation/src/test/java/com/heibaiying/mongo/MongoDBTest.java
@@ -0,0 +1,72 @@
+package com.heibaiying.mongo;
+
+import com.heibaiying.bean.Programmer;
+import com.heibaiying.config.MongoConfig;
+import com.mongodb.client.result.DeleteResult;
+import com.mongodb.client.result.UpdateResult;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import static org.springframework.data.mongodb.core.query.Criteria.where;
+import static org.springframework.data.mongodb.core.query.Query.query;
+import static org.springframework.data.mongodb.core.query.Update.update;
+
+/**
+ * @author : heibaiying
+ * @description : MongoDB 查询
+ */
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = MongoConfig.class)
+public class MongoDBTest {
+
+ @Autowired
+ private MongoTemplate mongoTemplate;
+
+ @Test
+ public void insert() {
+ // 单条插入
+ mongoTemplate.insert(new Programmer("xiaoming", 12, 5000.21f, new Date()));
+ List programmers = new ArrayList();
+ // 批量插入
+ programmers.add(new Programmer("xiaohong", 21, 52200.21f, new Date()));
+ programmers.add(new Programmer("xiaolan", 34, 500.21f, new Date()));
+ mongoTemplate.insert(programmers, Programmer.class);
+ }
+
+ // 条件查询
+ @Test
+ public void select() {
+ Criteria criteria = new Criteria();
+ criteria.andOperator(where("name").is("xiaohong"), where("age").is(21));
+ Query query = new Query(criteria);
+ Programmer one = mongoTemplate.findOne(query, Programmer.class);
+ System.out.println(one);
+ }
+
+
+ // 更新数据
+ @Test
+ public void MUpdate() {
+ UpdateResult updateResult = mongoTemplate.updateMulti(query(where("name").is("xiaoming")), update("age", 35), Programmer.class);
+ System.out.println("更新记录数:" + updateResult.getModifiedCount());
+ }
+
+ // 删除指定数据
+ @Test
+ public void delete() {
+ DeleteResult result = mongoTemplate.remove(query(where("name").is("xiaolan")), Programmer.class);
+ System.out.println("影响记录数:" + result.getDeletedCount());
+ System.out.println("是否成功:" + result.wasAcknowledged());
+ }
+
+}
diff --git a/spring/spring-mongodb/pom.xml b/spring/spring-mongodb/pom.xml
new file mode 100644
index 0000000..681bfb0
--- /dev/null
+++ b/spring/spring-mongodb/pom.xml
@@ -0,0 +1,68 @@
+
+
+ 4.0.0
+
+ com.heibaiying
+ spring-mongodb
+ 1.0-SNAPSHOT
+
+
+ 5.1.3.RELEASE
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-beans
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-core
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-web
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-webmvc
+ ${spring-base-version}
+
+
+
+ org.springframework.data
+ spring-data-mongodb
+ 2.1.3.RELEASE
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.springframework
+ spring-test
+ ${spring-base-version}
+ test
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-mongodb/src/main/java/com/heibaiying/bean/Programmer.java b/spring/spring-mongodb/src/main/java/com/heibaiying/bean/Programmer.java
new file mode 100644
index 0000000..5cff5ab
--- /dev/null
+++ b/spring/spring-mongodb/src/main/java/com/heibaiying/bean/Programmer.java
@@ -0,0 +1,25 @@
+package com.heibaiying.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Programmer {
+
+ private String name;
+
+ private int age;
+
+ private float salary;
+
+ private Date birthday;
+}
diff --git a/spring/spring-mongodb/src/main/resources/mongodb.properties b/spring/spring-mongodb/src/main/resources/mongodb.properties
new file mode 100644
index 0000000..4ead0c0
--- /dev/null
+++ b/spring/spring-mongodb/src/main/resources/mongodb.properties
@@ -0,0 +1,17 @@
+mongo.host=192.168.200.228
+mongo.port=27017
+# ݿ. Ĭ'db'.
+mongo.dbname=database
+# ÿ
+mongo.connectionsPerHost=10
+# ̶߳connectionsPerHostֵ˵Ľ̶ֵ߳߳˶оͻ׳쳣
+mongo.threadsAllowedToBlockForConnectionMultiplier=5
+# ӳʱĺ 0Ĭֵ
+mongo.connectTimeout=1000
+# ȴӵ߳ʱ Ĭ120000 ms (2 minutes).
+mongo.maxWaitTime=1500
+# ֻ־Ƿֱֻʱ ٷĬΪtrue Ҳ
+mongo.socketKeepAlive=true
+# Ⱥӵֳʱ
+mongo.socketTimeout=1500
+
diff --git a/spring/spring-mongodb/src/main/resources/mongodb.xml b/spring/spring-mongodb/src/main/resources/mongodb.xml
new file mode 100644
index 0000000..7db314b
--- /dev/null
+++ b/spring/spring-mongodb/src/main/resources/mongodb.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-mongodb/src/test/java/com/heibaiying/mongo/MongoDBTest.java b/spring/spring-mongodb/src/test/java/com/heibaiying/mongo/MongoDBTest.java
new file mode 100644
index 0000000..4697c89
--- /dev/null
+++ b/spring/spring-mongodb/src/test/java/com/heibaiying/mongo/MongoDBTest.java
@@ -0,0 +1,71 @@
+package com.heibaiying.mongo;
+
+import com.heibaiying.bean.Programmer;
+import com.mongodb.client.result.DeleteResult;
+import com.mongodb.client.result.UpdateResult;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import static org.springframework.data.mongodb.core.query.Criteria.where;
+import static org.springframework.data.mongodb.core.query.Query.query;
+import static org.springframework.data.mongodb.core.query.Update.update;
+
+/**
+ * @author : heibaiying
+ * @description : MongoDB 查询
+ */
+@RunWith(SpringRunner.class)
+@ContextConfiguration(locations = "classpath:mongodb.xml")
+public class MongoDBTest {
+
+ @Autowired
+ private MongoTemplate mongoTemplate;
+
+ @Test
+ public void insert() {
+ // 单条插入
+ mongoTemplate.insert(new Programmer("xiaoming", 12, 5000.21f, new Date()));
+ List programmers = new ArrayList();
+ // 批量插入
+ programmers.add(new Programmer("xiaohong", 21, 52200.21f, new Date()));
+ programmers.add(new Programmer("xiaolan", 34, 500.21f, new Date()));
+ mongoTemplate.insert(programmers, Programmer.class);
+ }
+
+ // 条件查询
+ @Test
+ public void select() {
+ Criteria criteria = new Criteria();
+ criteria.andOperator(where("name").is("xiaohong"), where("age").is(21));
+ Query query = new Query(criteria);
+ Programmer one = mongoTemplate.findOne(query, Programmer.class);
+ System.out.println(one);
+ }
+
+
+ // 更新数据
+ @Test
+ public void MUpdate() {
+ UpdateResult updateResult = mongoTemplate.updateMulti(query(where("name").is("xiaoming")), update("age", 35), Programmer.class);
+ System.out.println("更新记录数:" + updateResult.getModifiedCount());
+ }
+
+ // 删除指定数据
+ @Test
+ public void delete() {
+ DeleteResult result = mongoTemplate.remove(query(where("name").is("xiaolan")), Programmer.class);
+ System.out.println("影响记录数:" + result.getDeletedCount());
+ System.out.println("是否成功:" + result.wasAcknowledged());
+ }
+
+}