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 {@Idprivate 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;}@Overridepublic 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 {@Autowiredprivate UserRepository userRepository;@Autowiredprotected MongoTemplate mongoOperations;@Testpublic 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());}@Testpublic 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.xsdhttp://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-optionsconnections-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 {@Idprivate 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;}@Overridepublic 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中取出的数据
