Mongo介绍
一种NoSQL数据库,使用C++编写的开源、跨平台、面向文档的数据库。
基础操作
maven pom.xml配置
<!-- mongo -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- JSON -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
配置类与抽象类
@SpringBootConfiguration 配置
package com.ltian.spider.mongo.config;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
/**
* monngo配置类
* @author ltian
*/
@Configuration
public class MongoConfig extends AbstractMongoConfiguration {
/**
* IP地址
*/
@Value("${spring.data.mongodb.host}")
private String mongoHost;
/**
* 端口
*/
@Value("${spring.data.mongodb.port}")
private String mongoPort;
/**
* mongo库名
*/
@Value("${spring.data.mongodb.database}")
private String mongoDatabase;
@Override
protected String getDatabaseName() {
return mongoDatabase;
}
@Override
@Bean
public Mongo mongo() throws Exception {
return new MongoClient(mongoHost + ":" + mongoPort);
}
/**
* mongo 文件存取
*/
@Bean
public GridFsTemplate gridFsTemplate() throws Exception {
return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter());
}
}
抽象Dao
package com.ltian.spider.mongo.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import java.util.Date;
import java.util.List;
/**
* 抽象 Mongo 常规操作,提供基本方法
* <T> : 对象bean
*/
public abstract class AbstractMongodbBaseDao<T> {
protected static final Integer PAGE_SIZE = 10;
@Autowired
protected MongoTemplate mongoTemplate;
/**
* 获取需要操作的实体类class
*
* @return 对象bean
*/
protected abstract Class<T> getEntityClass();
/**
* 通过条件查询,查询分页结果
*
* @param pageNo 页码
* @param pageSize 每页数量
* @param query 查询条件
* @return 分页结果
*/
public Pagination<T> getPage(int pageNo, int pageSize, Query query) {
long totalCount = this.mongoTemplate.count(query, this.getEntityClass());
Pagination<T> page = new Pagination<T>(pageNo, pageSize, totalCount);
// skip相当于从那条记录开始
query.skip(page.getFirstResult());
// 从skip开始,取多少条记录
query.limit(pageSize);
// 降序
// query.with(new Sort(Sort.Direction.DESC, "lastModifyDate"));
List<T> datas = this.find(query);
page.setDatas(datas);
page.setTotalCount(totalCount);
return page;
}
/**
* 通过条件查询实体(集合)
*
* @param query 查询条件
* @return 查询结果
*/
public List<T> find(Query query) {
return mongoTemplate.find(query, this.getEntityClass());
}
/**
* 通过一定的条件查询一个实体
*
* @param query 查询条件
* @return 查询结果
*/
public T findOne(Query query) {
return mongoTemplate.findOne(query, this.getEntityClass());
}
/**
* 查询出所有数据
*
* @return 查询结果
*/
public List<T> findAll() {
return this.mongoTemplate.findAll(getEntityClass());
}
/**
* 查询并且修改记录
*
* @param query 查询条件
* @param update 修改部分
* @return 修改后结果
*/
public T findAndModify(Query query, Update update) {
update.set("lastModifyDate", new Date());
return this.mongoTemplate.findAndModify(query, update, this.getEntityClass());
}
/**
* 按条件查询,并且删除记录
*
* @param query 查询条件
* @return 移除的记录
*/
public T findAndRemove(Query query) {
return this.mongoTemplate.findAndRemove(query, this.getEntityClass());
}
/**
* 通过条件查询更新数据
*
* @param query 查询条件
* @param update 修改内容
*/
public void updateFirst(Query query, Update update) {
// update.set("lastModifyDate", new Date());
mongoTemplate.updateFirst(query, update, this.getEntityClass());
}
/**
* 保存一个对象到mongodb
*
* @param bean 需要保存的对象
* @return 原对象
*/
public T save(T bean) {
mongoTemplate.save(bean);
return bean;
}
/**
* 通过ID获取记录
*
* @param id mongoId,即_id
* @return 查询结果
*/
public T findById(String id) {
return mongoTemplate.findById(id, this.getEntityClass());
}
/**
* 通过ID获取记录,并且指定了集合名
*
* @param id mongoId, 即_id
* @param collectionName 集合名
* @return 查询结果
*/
public T findById(String id, String collectionName) {
return mongoTemplate.findById(id, this.getEntityClass(), collectionName);
}
}
分页
package com.ltian.spider.mongo.dao;
import java.util.List;
/**
* 分页处理类
* @author ltian
*/
public class Pagination<T> {
/**
* 一页数据默认20条
*/
private int pageSize = 20;
/**
* 当前页码
*/
private int pageNo;
/**
* 上一页
*/
private int upPage;
/**
* 下一页
*/
private int nextPage;
/**
* 一共有多少条数据
*/
private long totalCount;
/**
* 一共有多少页
*/
private int totalPage;
/**
* 数据集合
*/
private List<T> datas;
/**
* 分页的url
*/
private String pageUrl;
/**
* 获取第一条记录位置
*
* @return
*/
public int getFirstResult() {
return (this.getPageNo() - 1) * this.getPageSize();
}
/**
* 获取最后记录位置
*
* @return
*/
public int getLastResult() {
return this.getPageNo() * this.getPageSize();
}
/**
* 计算一共多少页
*/
public void setTotalPage() {
this.totalPage = (int) ((this.totalCount % this.pageSize > 0) ? (this.totalCount / this.pageSize + 1)
: this.totalCount / this.pageSize);
}
/**
* 设置 上一页
*/
public void setUpPage() {
this.upPage = (this.pageNo > 1) ? this.pageNo - 1 : this.pageNo;
}
/**
* 设置下一页
*/
public void setNextPage() {
this.nextPage = (this.pageNo == this.totalPage) ? this.pageNo : this.pageNo + 1;
}
public int getNextPage() {
return nextPage;
}
public int getTotalPage() {
return totalPage;
}
public int getUpPage() {
return upPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public long getTotalCount() {
return totalCount;
}
public void setTotalCount(long totalCount2) {
this.totalCount = totalCount2;
}
public List<T> getDatas() {
return datas;
}
public void setDatas(List<T> datas) {
this.datas = datas;
}
public String getPageUrl() {
return pageUrl;
}
public void setPageUrl(String pageUrl) {
this.pageUrl = pageUrl;
}
public Pagination(int pageNo, int pageSize, long totalCount2) {
this.setPageNo(pageNo);
this.setPageSize(pageSize);
this.setTotalCount(totalCount2);
this.init();
}
/**
* 初始化计算分页
*/
private void init() {
// 设置一共页数
this.setTotalPage();
// 设置上一页
this.setUpPage();
// 设置下一页
this.setNextPage();
}
}
使用示例
UserEntry
package com.ltian.spider.entry;
import lombok.Builder;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
/**
* 用户
*/
@Data
@Builder(toBuilder = true)
@Document(collection = "user")
public class UserEntry {
@Id
private String id;
private Date createDate;
private String createById;
private Date lastModifyDate;
private String lastModifyById;
private String name;
private String password;
}
对应的dao
package com.ltian.spider.service.dao;
import com.ltian.spider.entry.UserEntry;
import com.ltian.spider.mongo.dao.AbstractMongodbBaseDao;
import com.ltian.spider.util.StringUtil;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
/**
* user dao
*/
@Component
public class UserDao extends AbstractMongodbBaseDao<UserEntry> {
@Override
protected Class<UserEntry> getEntityClass() {
return UserEntry.class;
}
}
至此,完成。
网友评论