java练习生 - 使用mongoDB

一、添加依赖

<!--添加mongodb功能-->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>2.1.8.RELEASE</version>
</dependency>
<!--使用ConfigurationProperties注解为自定义的配置类赋值时需要添加该依赖,否则提示:spring boot configuration annotation processor not found in classpath-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

二、创建配置类

2.1 添加连接配置信息(application.yml)

mongodb: 
  database: mongodb://ttt:hzq@xxx1:27017,xxx2:27017,xxx3:27017/vts?authSource=admin
  uri: test

2.2 创建配置参数类

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "mongodb")
@Data
public class MongoDbProperties {
    private String database;
    private String uri;
}

2.3 创建配置类

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import hzq.maven.demo.config.properties.MongoDbProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;

import javax.annotation.Resource;

@Configuration
@EnableConfigurationProperties(MongoDbProperties.class)
public class MongoDbConfig extends AbstractMongoConfiguration {

    @Resource
    private MongoDbProperties mongoProperties;

    @Override
    @Bean
    public MongoTemplate mongoTemplate() throws Exception {

        return new MongoTemplate(mongoDbFactory());
    }

    @Override
    @Bean
    public MongoDbFactory mongoDbFactory() {
        MongoDbFactory dbFactory = new SimpleMongoDbFactory(mongoClient(), getDatabaseName());
        return dbFactory;
    }

    @Override
    public MongoClient mongoClient() {
        MongoClientURI uri = new MongoClientURI(this.mongoProperties.getUri());
        return new MongoClient(uri);
    }

    @Override
    protected String getDatabaseName() {
        return this.mongoProperties.getDatabase();
    }
}
View Code

三、创建操作类

3.1 接口

import java.util.List;
import java.util.Map;

/**
 * mongo操作接口
 */
public interface MongoService{

    /**
     * 保存到mongo
     * @param objectToSave 数据对象类型
     * @param aggregateName 集合名称
     */
    void save(Object objectToSave,String aggregateName);

    /**
     * 根据条件查询记录
     * @param condition 条件名称
     * @param value    条件值
     * @param     entityClass 对应实体类
     * @param aggregateName 集合名称
     * @return mongo记录
     */
    Object find(String condition, Object value ,Class<?> entityClass , String aggregateName);

    /**
     * 根据条件查询记录
     * @param conditionMap 条件集合
     * @param     entityClass 对应实体类
     * @param aggregateName 集合名称
     * @return mongo记录
     */
    Object findByMap(Map<String ,Object> conditionMap, Class<?> entityClass , String aggregateName);

    /**
     * 根据条件查询批量记录
     * @param condition 条件名称
     * @param value    条件值
     * @param     entityClass 对应实体类
     * @param aggregateName 集合名称
     * @return mongo记录
     */
    List<Object> findBatch(String condition, Object value ,Class<?> entityClass , String aggregateName);

    /**
     * 根据条件查询记录
     * @param conditionMap 条件集合
     * @param     entityClass 对应实体类
     * @param aggregateName 集合名称
     * @return mongo记录
     */
    List<Object> findBatchByMap(Map<String ,Object> conditionMap, Class<?> entityClass , String aggregateName);


    /**
     * 根据条件修改单条记录
     * @param condition 修改记录的查询条件
     *  @param    queryValue 查询条件过滤值
     * @param key        要修改的列名称
     * @param updateValue      修改的值
     * @param     entityClass 对应实体类
     * @param aggregateName 集合名称
     */
    void update(String condition,Object queryValue ,String key, Object updateValue,Class<?> entityClass, String aggregateName);

    /**
     *根据条件集合批量修改记录
     * @param conditionMap 条件集合
     * @param key  要修改的列
     * @param updateValue 修改的值
     * @param entityClass 对应实体类
     * @param aggregateName 集合名称
     */
    void updateByMap(Map<String ,Object> conditionMap,String key, Object updateValue,Class<?> entityClass, String aggregateName);
}
View Code

3.2 实现

import hzq.maven.demo.service.mongo.MongoService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
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.core.query.Update;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/**
 * mongo操作实现
 */
@ConditionalOnExpression("${mongodb.button:true}")
@Service
public class MongoServiceImpl implements MongoService {
    @Resource
    private MongoTemplate mongoTemplate;

    @Override
    public void save(Object objectToSave, String aggregateName) {
        mongoTemplate.save(objectToSave, aggregateName);
    }

    @Override
    public Object find(String condition, Object value, Class entityClass, String aggregateName) {
        Query query = new Query(Criteria.where(condition).is(value));
        return mongoTemplate.findOne(query, entityClass, aggregateName);
    }

    @Override
    public Object findByMap(Map conditionMap, Class entityClass, String aggregateName) {
        Query query = new Query();
        conditionMap.forEach(( k, v) -> query.addCriteria(Criteria.where(k.toString()).is(v)));
        return mongoTemplate.findOne(query, entityClass, aggregateName);
    }

    @Override
    public List findBatch(String condition, Object value, Class entityClass, String aggregateName) {
        Query query = new Query(Criteria.where(condition).is(value));
        return mongoTemplate.find(query, entityClass, aggregateName);
    }

    @Override
    public List findBatchByMap(Map conditionMap, Class entityClass, String aggregateName) {
        Query query = new Query();
        conditionMap.forEach(( k, v) -> query.addCriteria(Criteria.where(k.toString()).is(v)));
        return mongoTemplate.find(query, entityClass, aggregateName);
    }

    @Override
    public void update(String condition, Object queryValue, String key, Object updateValue, Class entityClass, String aggregateName) {
        Query query = new Query(Criteria.where(condition).is(queryValue));
        Update update = Update.update(key, updateValue);
        mongoTemplate.updateFirst(query, update, entityClass,aggregateName);
    }

    @Override
    public void updateByMap(Map conditionMap, String key, Object updateValue, Class entityClass, String aggregateName) {
        Query query = new Query();
        conditionMap.forEach(( k, v) -> query.addCriteria(Criteria.where(k.toString()).is(v)));
        Update update = Update.update(key, updateValue);
        mongoTemplate.updateMulti(query, update, entityClass,aggregateName);
    }
}
View Code

四、使用

@Resource
private MongoTemplate mongoTemplate;

public void mongoSet(SyncRequestEntity testDataDTO){
    mongoTemplate.save(testDataDTO,"Fts.SyncRequestInfo");
}

 五、建表(通过注解)

@Document: 保存对象时如果没有Collection,会自动创建。

@Indexed: 第一次保存对象时会创建索引。

 

import lombok.Data;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import java.time.LocalDateTime;

/**
 * 同步表
 */
@Data
@Document(collection = "Fts.SyncRequestInfo")
public class SyncRequestEntity {
    /**
     * 请求编号
     */
    @Indexed(unique = true)
    private Long requestId;
    /**
     * 同步编号
     */
    @Indexed
    private Long syncId;
    /**
     * 请求流水号
     */
    private String transactionId;
    /**
     * 批次号
     */
    private String batchNo;
    /**
     * 步骤
     */
    private Integer step;
    /**
     * 状态:0 失败,1 成功,-1 异常
     */
    private Integer status;
    /**
     * 请求url
     */
    private String url;
    /**
     * 请求入参
     */
    private String inputJson;
    /**
     * 请求回参
     */
    private String outJson;
    /**
     * 创建时间
     */
    private LocalDateTime createdTime;
    /**
     * 修改时间
     */
    private LocalDateTime updatedTime;
}

 

posted @ 2020-12-31 17:01  Ariter  阅读(155)  评论(0编辑  收藏  举报