MongoDB简介
1.MongoDB是什么
- MongoDB是使用C++编写,开源的,面向文档的NoSql(Not Only SQL)数据库
2.NoSql是什么
- NoSql(not only sql)是非关系型数据库的统称,常见的NoSql有Redis,MongoDB,Hbase,Cassandra等
3.为什么要使用NoSql
为了解决常规数据库以下问题
- 高并发下读写压力大
- 海量数据的高效存储和访问
- 数据库的高可用和高拓展性
4.MongoDB的特点
- 高性能易于使用,易于拓展
- 面向集合存储
- 支持动态查询,支持索引
- 支持分片
5.Spring整合MongoDB
springboot项目
- 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2. 在application.perproties/yml配置mongodb的连接地址
spring.data.mongodb.uri=mongodb://127.0.0.1:27017/myMongoDB
3. 创建存储的User实体
public class User {
@Id
private Long id;
private String username;
private Integer age;
public User(Long id, String username, Integer age) {
this.id = id;
this.username = username;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", age=" + age +
'}';
}
}
4. 实现User的数据访问对象
public interface UserRepository extends MongoRepository<User, Long> {
User findByUsername(String username);
}
5. 测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class MongodbConnectionTestTest {
@Autowired
private UserRepository userRepository;
@Autowired
protected MongoTemplate mongoOperations;
@Test
public void test() throws Exception {
// 创建三个User,并验证User总数
userRepository.save(new User(1L, "didi", 30));
userRepository.save(new User(2L, "mama", 40));
userRepository.save(new User(3L, "kaka", 50));
Assert.assertEquals(3, userRepository.findAll().size());
// 删除一个User,再验证User总数
User u = userRepository.findOne(1L);
userRepository.delete(u);
Assert.assertEquals(2, userRepository.findAll().size());
// 删除一个User,再验证User总数
u = userRepository.findByUsername("mama");
userRepository.delete(u);
Assert.assertEquals(1, userRepository.findAll().size());
}
@Test
public void test1() throws Exception {
List<User> users = mongoOperations.findAll(User.class);
users.forEach(System.out::println);
}
}
- 非springboot项目
1. 依赖
```xml
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.14.2</version>
</dependency>
xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">
<mongo:mongo-client id="mongoClient" host="127.0.0.1" port="27017">
<mongo:client-options
connections-per-host="8"
threads-allowed-to-block-for-connection-multiplier="4"
connect-timeout="1000"
max-wait-time="1500"
socket-keep-alive="true"
socket-timeout="1500"
/>
</mongo:mongo-client>
<mongo:db-factory id="mongoDbFactory"
dbname="myMongoDB"
mongo-ref="mongoClient"/>
<mongo:template id="mongoTemplate" db-factory-ref="mongoDbFactory" write-concern="NORMAL"/>
<mongo:repositories base-package="com.xxx.core.modules.*.repository"/>
</beans>
创建存储的User实体
public class User {
@Id
private Long id;
private String username;
private Integer age;
public User(Long id, String username, Integer age) {
this.id = id;
this.username = username;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", age=" + age +
'}';
}
}
- 实现User的数据访问对象
public interface UserRepository extends MongoRepository<User, Long> {
User findByUsername(String username);
}
- 测试 ```
6.相关实体类注解的解释
@Id - 文档的唯一标识,在mongodb中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器(确保同一秒内产生的Id不会冲突)构成。
@Document - 把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。@Document(collection="mongodb") mongodb对应表
@DBRef - 声明类似于关系数据库的关联关系。ps:暂不支持级联的保存功能,当你在本实例中修改了DERef对象里面的值时,单独保存本实例并不能保存DERef引用的对象,它要另外保存,如下面例子的Person和Account。
@Indexed - 声明该字段需要索引,建索引可以大大的提高查询效率。
@CompoundIndex - 复合索引的声明,建复合索引可以有效地提高多字段的查询效率。
@GeoSpatialIndexed - 声明该字段为地理信息的索引。
@Transient - 映射忽略的字段,该字段不会保存到mongodb。
@PersistenceConstructor - 声明构造函数,作用是把从数据库取出的数据实例化为对象。该构造函数传入的值为从DBObject中取出的数据