美文网首页
SpringBoot-Mongo操作

SpringBoot-Mongo操作

作者: 墨雷笔记 | 来源:发表于2018-10-23 20:04 被阅读0次

    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;
        }
    }
    

    至此,完成。

    相关文章

      网友评论

          本文标题:SpringBoot-Mongo操作

          本文链接:https://www.haomeiwen.com/subject/kquyuftx.html