关于mongo的相关知识可看我这篇文章:
通过如下找到你想要的依赖包,在这搜索对应的版本号:mvn仓库
导入相对应的依赖包:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-mongodbartifactId>
<version>2.7.2version>
dependency>
<dependency>
<groupId>org.mongodbgroupId>
<artifactId>mongodb-driver-syncartifactId>
<version>4.7.1version>
dependency>
可以通过配置文件或者是代码进行重构
该配置文件主要用来连接mongo,需要服务器ip地址、用户名、密码等(类似mysql的连接)
可以通过配置文件,定义其配置参数
具体参数有如下(将其对应参数写在application.properties即可):
参数 | 描述 |
---|---|
spring.data.mongodb.uri | mongodb://localhost:27017/testMongoDB |
spring.data.mongodb.host | mongo连接地址 |
spring.data.mongodb.port | 端口号 |
spring.data.mongodb.authentication-database | 验证的数据库 |
spring.data.mongodb.username | 数据库用户名 |
spring.data.mongodb.password | 数据库密码 |
spring.data.mongodb.database | 连接的数据库名 |
和上面的配置差不多,只不过此处用代码加工了下而已
配置文件定义如下(将其具体隐私使用了xxxx或者yyyy进行表示):mongo.audio.uri=mongodb://xxxxx:yyyyy@127.0.0.1:端口/xxxxx?connectTimeoutMS=10000&socketTimeoutMS=10000
配置类代码引入:
@Configuration
public class MultiMongoTemplate {
@Primary
@Bean
public MongoTemplate audioMongoTemplate(@Value("${mongo.audio.uri}") String uri) {
MongoTemplate mongoTemplate = new MongoTemplate(new SimpleMongoClientDatabaseFactory(uri));
setDefaultTypeMapper(mongoTemplate);
return mongoTemplate;
}
// 省略多个数据库的连接地址
private void setDefaultTypeMapper(MongoTemplate mongoTemplate) {
if (null == mongoTemplate) {
return;
}
MappingMongoConverter converter = (MappingMongoConverter) mongoTemplate.getConverter();
converter.setTypeMapper(new DefaultMongoTypeMapper(null));
}
}
此实体类用在数据库以及代码中
具体定义如下:
其Field注解对应数据库的显示,遵从驼峰规则
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
// 没有创建的时候会给数据库自动创建一个collection
@Document(collection = Collections.SDK_FILE_CONFIG)
@Data
@ToString
@NoArgsConstructor
public class SdkInfo {
@Id
private String id;
@Field("file_name")
private String fileName;
@Field("file_size")
private String fileSize;
@Field("create_time")
private String createTime;
@Field("page")
private String page;
@Field("size")
private String size;
@Field("Operator_name")
private String OperatorName;
@Field("upload_url")
private String uploadUrl;
@Field("download_url")
private String downloadUrl;
}
查看其数据库显示:
之后通过代码模块进行连接测试:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainApplication.class)
@Slf4j
public class MongoConnectTest {
private static final Logger logger = LoggerFactory.getLogger(MongoConnectTest.class);
@Autowired
@Qualifier("audioMongoTemplate")
private MongoTemplate mongoTemplate;
// 以下为测试文件的章节
}
关于MongoTemplate的实体类中还有多个函数,以下函数已经够用了
查询显示所有的值
关于find的具体函数定义如下:
@Test
public void test1(){
Query query=new Query();
List<SdkInfo> configs = mongoTemplate.find(query, SdkInfo.class);
// 输出整张表对应的某个字段 通过get获取
configs.forEach(config -> log.info(config.getId()));
// 输出整张表对应的全部值 通过totoString
configs.forEach(config -> log.info(config.toString()));
}
关于findAll的具体函数定义如下:
等同于:
// 查询mongo全部集合
@Test
public void test1(){
Query query=new Query();
List<SdkInfo> configs = mongoTemplate.findAll(SdkInfo.class);
// 输出整张表对应的某个字段值 通过get获取
configs.forEach(config -> log.info(config.getId()));
// 输出整张表对应的全部值 通过totoString
configs.forEach(config -> log.info(config.toString()));
}
还有一种查询的格式类似这种:
Query query=new Query();
query.with(Sort.by(new Sort.Order(Sort.Direction.ASC, "fileSize")));
try (MongoCursor<Document> cursor =
//指定查询集合
mongoTemplate.getCollection("sdk_file_config")
//组装查询条件
.find(query.getQueryObject())
//组装排序方式(非必须,可不设置)
.sort(query.getSortObject())
//设置游标查询不超时
.noCursorTimeout(true)
//设置批量从数据库中获取的数据量
.batchSize(1000)
.cursor()) {
Document doc;
while (cursor.hasNext()) {
doc = cursor.next();
System.out.println(doc.get("download_url"));
}
} catch (Exception e) {
e.printStackTrace();
}
类似这种是获取整一列的值
如果获取这一列的某个值而已,具体如下:
@Test
public void test1(){
Query query=new Query(Criteria.where("name").is("码农研究僧"));
List<SdkInfo> configs = mongoTemplate.find(query, SdkInfo.class);
// 输出整张表对应的全部值 通过totoString
configs.forEach(config -> log.info(config.toString()));
}
如果获取满足条件的一行数据
@Test
public void test4(){
Query query=new Query();
SdkInfo configs = mongoTemplate.findOne(query, SdkInfo.class);
String id = configs.getId();
log.info(id);
}
将其写好的数据,结合java web,放到前端form表单中
@Override
public List<Object> showList(String OperatorName) {
Query query = new Query(Criteria.where("Operator_name").is(OperatorName));
List<SdkInfo> configs = mongoTemplate.find(query, SdkInfo.class);
configs.forEach(config -> config.toString());
List<Object> list = new ArrayList<Object>();
configs.forEach(config -> {
Map<String, String> map = new HashMap<>();
map.put("_id",config.getId());
map.put("fileName",config.getFileName());
map.put("fileSize", config.getFileSize());
map.put("createTime", config.getCreateTime());
map.put("OperatorName",config.getOperatorName());
map.put("downloadUrl",config.getDownloadUrl());
list.add(map);
});
return list;
}
数据库的插入一版都是通过insert
将其写好的数据一一insert进入
结合java web开发,传入对应的数据,相对应的插入某些字段值
@Override
public void uploadmongo(String fileName, Long fileSize, String getUploadUrl, String getDownloadUrl){
SdkInfo sdkInfo = new SdkInfo();
sdkInfo.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
sdkInfo.setFileName(fileName);
sdkInfo.setOperatorName("码农研究僧");
sdkInfo.setUploadUrl(getUploadUrl);
sdkInfo.setDownloadUrl(getDownloadUrl);
SdkInfo insert = mongoTemplate.insert(sdkInfo);
if(String.valueOf(insert) != null){
logger.info(String.valueOf(insert));
}else{
logger.info("Failed to insert data");
}
}
关于删除,类似mongo的drop删除整个表或者remove删除某一列的数据
结合javaweb 的form表单,根据获取某个字段值,对应删除正一行数据
@Override
public void deletemongo(String id) {
Query query = new Query(Criteria.where("_id").is(id));
mongoTemplate.remove(query, SdkInfo.class);
}