Sprinboot2.3整合MongoDB4.4.4
安装MongoDB4.4.4:https://blog.csdn.net/weixin_44768189/article/details/114850433
一、基础概念
在mongodb中是通过数据库、集合、文档的方式来管理数据,下边是mongodb与关系数据库的一些概念对比:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接(MongoDB不支持) | |
primary key | primary key | 主键,MongoDB自动在每个集合中添加_id的主键 |
1、一个mongodb实例可以创建多个数据库
2、一个数据库可以创建多个集合
3、一个集合可以包括多个文档。
二、创建Springboot项目,引入pom依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
三、实体类
package com.hello.dao;
import com.hello.dto.User;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface UserDao extends MongoRepository<User, String> {
}
三、配置文件
server.port =8080
spring.data.mongodb.uri=mongodb://root:root@192.168.25.202:27017
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.database=test
spring.data.mongodb.grid-fs-database=gfdb
四、创建一个测试类
import com.hello.dao.UserDao;
import com.hello.dto.User;
import com.mongodb.client.gridfs.model.GridFSFile;
import org.bson.types.ObjectId;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Example;
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.data.mongodb.gridfs.GridFsResource;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Optional;
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestMongoTemplate {
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private GridFsTemplate gridFsTemplate;
@Autowired
private UserDao userDao;
/**
* insert和save。两者区别如下:
* <p>
* 插入重复数据时:insert报DuplicateKeyException提示主键重复;save对已存在的数据进行更新。
* 批处理操作时:insert可以一次性插入整个数据,效率较高;save需遍历整个数据,一次插入或更新,效率较低。
*/
@Test
public void insert() {
User user = new User();
user.setName("tom");
user.setAge(12);
user.setCreateTime(new Date());
userDao.insert(user);
//userDao.save(user);
}
/**
* MongoRepository查询
*/
@Test
public void query() {
User user = new User();
user.setName("tom");
Example<User> userExample = Example.of(user);
Optional<User> one = userDao.findOne(userExample);
if (one.isPresent()) {
Date time = one.get().getCreateTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:MM:SS");
System.out.println(sdf.format(time));
} else {
System.out.println("结果不存在");
}
}
/**
* mongoTemplate查询
*/
@Test
public void find() {
Query query = Query.query(Criteria.where("name").is("tom"));
List<User> users = mongoTemplate.find(query, User.class);
System.out.println(users);
}
/**
* 上传
*/
@Test
public void store() throws FileNotFoundException {
File file = new File("D:\\dirtree.txt");
ObjectId id = gridFsTemplate.store(new FileInputStream(file), file.getName(), "text/html");
System.out.println(id);
}
/**
* 下载
*/
@Test
public void download() throws IOException {
Query query = Query.query(Criteria.where("_id").is("6041e17f43c4a53b5429eac0"));
GridFSFile fsFile = gridFsTemplate.findOne(query);
GridFsResource gs = gridFsTemplate.getResource(fsFile);
OutputStream os = null;
byte[] bs = new byte[1024];
int len;
InputStream in = gs.getInputStream();
//保存的目录
File file = new File("D:\\data1");
//D:\data1 + \ + dirtree.txt
os = new FileOutputStream(file.getPath() + File.separator + gs.getFilename());
while ((len = in.read(bs)) != -1) {
os.write(bs, 0, len);
}
os.close();
in.close();
}
}