Spring5.x集成MongoDB

本文分享Spring5.x集成MongoDB的经验。首先在pom.xml中引入spring-data-mongodb依赖,要注意版本适配。接着在module.properties添加属性并编写spring-mongo.xml配置文件。然后定义doc实体、repository仓储类,介绍了整合MongoDB的两种方法。最后编写service接口和实现类并进行调用测试。

  1. 引入依赖

    在pom.xml中添加依赖,只需在spring中引入spring-data-mongodb依赖就好,里面会有MongoDB驱动和其他支持依赖

            <!-- spring整合MongoDB -->
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-mongodb</artifactId>
                <version>2.0.6.RELEASE</version>
            </dependency>

    注意版本问题,每个版本对应的spring版本都不一样,本项目的spring版本是5.0.5.RELEASE,所以引入的spring-data-mongodb的版本是2.0.6.RELEASE,和spring版本适配

  2. 编写配置

    在module.properties中添加属性

    #MongoDB配置
    #主机
    mongo.host=localhost
    #端口号
    mongo.port=27017
    #库名称
    mongo.dbname=demo
    #账号
    mongo.username=demo
    #密码
    mongo.password=demo
    #每个主机允许的连接数,一个线程变为可用的最大阻塞数
    mongo.connectionsPerHost=8
    #线程队列数,它以上面connectionsPerHost值相乘的结果就是线程队列最大值
    mongo.threadsAllowedToBlockForConnectionMultiplier=4
    #连接超时时间(毫秒)
    mongo.connectTimeout=1000
    #最大等待时间
    mongo.maxWaitTime=1500
    #scoket保持活动
    mongo.socketKeepAlive=true
    #scoket超时时间
    mongo.socketTimeout=1500

    此时需要编写spring-mongo.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:mongo="http://www.springframework.org/schema/data/mongo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/data/mongo
        http://www.springframework.org/schema/data/mongo/spring-mongo-2.0.xsd
        ">s
        <!-- 方式一:  直接IP和端口号连接数据库-->
        <mongo:mongo-client id="mongo" host="${mongo.host}" port="${mongo.port}">
        <!-- 方式二:IP和端口号连接数据库,并使用用户和密码连接,需要在后面一定添加?authMechanism=SCRAM-SHA-1,血泪史      -->
    <!--    <mongo:mongo-client id="mongo" host="${mongo.host}" port="${mongo.port}"-->
    <!--                        credentials="${mongo.username}:${mongo.password}@${mongo.dbname}?authMechanism=SCRAM-SHA-1">-->
            <mongo:client-options
                    connections-per-host="${mongo.connectionsPerHost}"
                    threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
                    connect-timeout="${mongo.connectTimeout}"
                    max-wait-time="${mongo.maxWaitTime}"
                    socket-keep-alive="${mongo.socketKeepAlive}"
                    socket-timeout="${mongo.socketTimeout}"
    ​
            />
        </mongo:mongo-client>
    ​
        <!-- 设置使用的数据库名 MongoRepositoryFactory-->
        <mongo:db-factory id="mongoDbFactory"
                          dbname="${mongo.dbname}"
                          mongo-ref="mongo"
        />
        <!-- mongodb的模板 -->
        <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
            <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
        </bean>
        <!--    mongo-template-ref="mongoTemplate"  要加,不然MongoRepository用不了,血泪史-->
        <mongo:repositories base-package="com.xxx.app.ttt.service.mongo.repository"
                            mongo-template-ref="mongoTemplate" repository-impl-postfix="repository"/>
    ​
    </beans>

  3. 编写代码

    我们定义一个doc实体KnowledgeDoc,用于插入的数据

    @Document(collection = "demo_data")
    public class DemoDoc<T> extends BaseDoc {
        @Field("code")
        private String code;
        @Field("name")
        private String name;
        @Field("source")
        private String source;
        @Field("tag")
        private List<String> tag;
        @Field("document")
        private String document;
        @Field("status")
        private Boolean status;
        @Field("customize")
        private T customize;
        @Field("description")
        private String description;
        //此处省略setter getter方法
    }

    编写repository仓储类

    /**
    *此处使用 MongoRepository 方式对数据进行简单的增删改查,MongoRepository<Doc实体, 主键类型> 
    */
    public interface DemoRepository extends MongoRepository<DemoDoc,String> {
    ​
    }

    此处整合MongoDB的两种方法:MongoRepository和MongoTemplate,灵活使用,默认需要MongoTemplate就可以了,本人在整合MongoRepository时出现大坑,网上的配置写法都一样,但都是错误的,都是相互copy的吧。

    编写service接口和实现类

    public interface KnowledgeService {
        /**
         * 测试方法,新增数据
         * @return
         */
        Object addData();
    }
    
    /**
     * @Author: zhupeng
     * @Datetime: 2021/11/2 15:26
     * @Description:
     * @Version: 0.0.0.1
     */
    @Service
    public class KnowledgeServiceImpl implements KnowledgeService {
    ​
        //注入方式一:构造注入MongoRepository
        private KnowledgeRepository repository;
        public KnowledgeServiceImpl(KnowledgeRepository repository) {
            this.repository = repository;
        }
    ​
        //注入方式二:Autowired注入MongoTemplate
        @Autowired
        private MongoTemplate mongoTemplate;
    ​
        /**
         * 测试方法,新增数据
         *
         * @return
         */
        @Override
        public Object addData() {
            DemoDoc<CustomizeDoc> DemoDoc = new DemoDoc<CustomizeDoc>();
            SubprojectDoc subprojectDoc = new SubprojectDoc();
            subprojectDoc.setDeliveryConfirmationNo("201810260071");
            subprojectDoc.setProductName("专案管理—专案规格书—WF");
            subprojectDoc.setStage("1");
            subprojectDoc.setStatus(false);
            subprojectDoc.setSubprojectCode("20181026007");
            subprojectDoc.setSubprojectName("20181026007");
            CustomizeDoc customizeDoc = new CustomizeDoc();
            List<SubprojectDoc> subprojectDocs = new ArrayList<>();
            subprojectDocs.add(subprojectDoc);
            customizeDoc.setSubproject(subprojectDocs);
            customizeDoc.setProjectCode("00000001");
            customizeDoc.setProjectName("认购订单");
            customizeDoc.setCustomerCode("0000130503");
            customizeDoc.setCustomerName("太平洋自行车");
            customizeDoc.setOrderNumber("180090912");
            customizeDoc.setServiceCode("02276000");
            DemoDoc.setCustomize(customizeDoc);
            DemoDoc.setCode("00000001");
            DemoDoc.setName("认购订单");
            DemoDoc.setDescription("专案管理—专案规格书—WF");
            DemoDoc.setSource("CRM");
            DemoDoc.setStatus(false);
            DemoDoc.setTenantsid(Long.parseLong(ApplicationToken.tenantSid));
            DemoDoc.setCreateName("张三");
            DemoDoc.setCreateTime(new Date());
            System.out.println(ChangeUtil.beanToString(knowledgeDoc));
            //方式一:使用MongoRepository实现新增数据
            repository.insert(knowledgeDoc);
            //方式二:使用MongoTemplate实现新增数据
            //mongoTemplate.insert(knowledgeDoc);
            return "新增成功";
        }
    }

    调用,此处木有用postman工具调用接口。在项目启动后,自动执行,去调用新增方法,起到postman调用接口的效果

    /**
     *项目启动后,自动执行
     */
    public class LoadServiceImpl implements ILoadService {
        Logger logger = LoggerFactory.getLogger(LoadServiceImpl.class);
    ​
        private DemoService DemoService;
    ​
        @Override
        public Object onLoad(Map<String, Object> map) throws Exception {
            Object data = DemoService.addData();
            logger.info((String) data);
            return "OK";
        }
    }
    
    
  4. 测试

    image-20211103154657819

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值