Create a mongodb project

First create a new springboot project, the new project is slightly, novices can refer to here . After creating a new project, the directory structure is as shown in the figure below.
insert image description here
Next, paste each code.
Control layer

package com.yulisao.controller;

import com.yulisao.dto.PageParam;
import com.yulisao.entity.TUser;
import com.yulisao.service.TUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.Date;
import java.util.List;

/**
 * author yulisao
 * createDate 2023/5/31
 */
@RestController
@RequestMapping("/user")
public class UserController {
    
    

    @Autowired
    private TUserService userService;

    @PostMapping("/save")
    public TUser saveUser(@RequestBody TUser user) {
    
    
        return userService.saveUser(user);
    }

    @GetMapping("/findAll")
    public List<TUser> findAll() {
    
    
        return userService.findAll();
    }

    @PostMapping("/find")
    public List<TUser> findAllByCondition(@RequestBody TUser user, Date startDate, Date endDate) {
    
    
        return userService.findAllByCondition(user, startDate, endDate);
    }

    @PostMapping("/page")
    public Page<TUser> page(@RequestBody @Valid PageParam<TUser> param) {
    
    
        return userService.page(param);
    }

    @PostMapping("/count")
    public Long count(@RequestBody TUser user) {
    
    
        return userService.count(user);
    }

    @GetMapping("/{id}")
    public TUser findOne(@PathVariable("id") String id) {
    
    
        return userService.getUserById(id);
    }

    @GetMapping("/{name}")
    public TUser findOneByName(@PathVariable("name") String name) {
    
    
        return userService.getUserByName(name);
    }

    @PostMapping("/update")
    public Long update(@RequestBody TUser user) {
    
    
        return userService.updateUser(user);
    }

    @PostMapping("/updateBatch")
    public Long updateBatch(@RequestBody TUser user, String name) {
    
    
        return userService.batchUpdateUserByName(user, name);
    }

    @DeleteMapping("/delOne")
    public String delOne(@RequestBody TUser user) {
    
    
        return userService.deleteUser(user);
    }

    @DeleteMapping("/{id}")
    public String delById(@PathVariable("id") String id) {
    
    
        return userService.deleteUserById(id);
    }

}

Repository interface layer (I did not use the repository layer here, because it is enough to choose one of the following service layers. The difference between them is similar to mybatis and jpa.)

package com.yulisao.repository;

import com.yulisao.entity.TUser;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;

import java.util.Date;
import java.util.List;

public interface TUserRepository extends MongoRepository<TUser, ObjectId> {
    
    
    // MongoRepository 里面有findAll、insert等常用方法,继承之后可以直接使用,
    // 和mybatis-plus一样,只需要新建一个这样接口继承一下就好





    // 同时,如果你需要自定义查询, 就用可以用注解的形式,自己传参。 跟 Hibernate jpa 类似
    @Query("{ 'name':?0}") // 根据姓名查询
    TUser getUserByCondition(String name);

    @Query("{'Criteria.objectId' :{ $in: ?0},{'Criteria.createTime' : { $lt: ?1, $gt: ?2 }},{
    
    $limit :?3}")
    List<TUser> findListByCondition(List<String> ids, Date begin, Date end, int limit);

}

service interface layer

package com.yulisao.service;

import com.yulisao.dto.PageParam;
import com.yulisao.entity.TUser;
import org.springframework.data.domain.Page;

import java.util.Date;
import java.util.List;

/**
 * author yulisao
 * createDate 2023/5/31
 */
public interface TUserService {
    
    

    /**
     * 新增
     * @param user
     * @return
     */
    TUser saveUser(TUser user);

    /**
     * 查询所有
     */
    List<TUser> findAll();

    /**
     * 根据条件 查询所有
     * @param user
     * @return
     */
    List<TUser> findAllByCondition(TUser user, Date startDate, Date endDate);

    /**
     * 根据条件 分页查询
     *
     * @param pageParam
     * @return
     */
    Page<TUser> page(PageParam<TUser> pageParam);

    /**
     * 根据条件 查询数量
     * @param user
     * @return
     */
    Long count(TUser user);


    /***
     * 根据id查询
     */
    TUser getUserById(String id);

    /**
     * 根据名称查询
     */
    TUser getUserByName(String name);

    /**
     * 更新对象
     */
    Long updateUser(TUser user);

    /**
     * 根据姓名批量更新对象
     */
    Long batchUpdateUserByName(TUser user, String name);

    /***
     * 删除对象
     */
    String deleteUser(TUser user);

    /**
     * 根据id删除
     */
    String deleteUserById(String id);

}

service implementation layer

package com.yulisao.service.impl;

import com.yulisao.dto.PageParam;
import com.yulisao.entity.TUser;
import com.yulisao.service.TUserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
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 com.mongodb.client.result.UpdateResult;

import java.util.Date;
import java.util.List;

/**
 * author yulisao
 * createDate 2023/5/31
 */
public class TUserServiceImpl implements TUserService {
    
    

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public TUser saveUser(TUser user) {
    
    
        return mongoTemplate.save(user); // or insert
    }

    @Override
    public List<TUser> findAll() {
    
    
        return mongoTemplate.findAll(TUser.class);
    }

    @Override
    public List<TUser> findAllByCondition(TUser user, Date startDate, Date endDate) {
    
    
        Criteria cri = new Criteria();
        cri.andOperator(Criteria.where("createTime").gte(startDate), Criteria.where("createTime").lt(endDate));
        if (StringUtils.isNotBlank(user.getName())) {
    
    
            cri.and("name").is(user.getName());
        }
        if (user.getAge() != null) {
    
    
            cri.and("age").is(user.getAge());
        }
        // cri.and("userType").in("P", "U");
        //more...

        return mongoTemplate.find(new Query(cri).with(Sort.by(Sort.Direction.DESC,"age")), TUser.class);
    }

    @Override
    public Page<TUser> page(PageParam<TUser> pageParam) {
    
    
        int currentPage = pageParam.getCurrentPage();
        int pageSize = pageParam.getPageSize();
        TUser param = pageParam.getParam(); // 搜索条件

        Query query = new Query();
        /*
        // 这里的搜索条件根据自己需要写,和下面的count方法保持一致!
        // Criteria 和 Query 里面的方法有很多,可以自己点击进去看看,以下是几个示例
        query.addCriteria(Criteria.where("name").regex("^w")); // 姓名以w结尾
        Pattern pattern = Pattern.compile(String.format("%s%s%s", "^.*", "张", ".*$"), Pattern.CASE_INSENSITIVE);
        query.addCriteria(Criteria.where("username").regex(pattern)); // 模糊查询 含有“张”的记录
        query.addCriteria(Criteria.where("age").lt("35").gt("20")); // 年纪在20-30之间*
        query.with(Sort.by(Sort.Direction.DESC,"age")); // 根据年纪倒叙 新版本已不支持 new Sort() 的写法了
        */

        // 分页 && 排序
        //PageRequest pageable = new PageRequest(currentPage, pageSize, Sort.Direction.DESC, "username"); // 新版本已不支持 new PageRequest() 的写法了
        Pageable pageable = PageRequest.of(currentPage, pageSize, Sort.Direction.DESC, "age");
        query.with(pageable);

        long count = count(param); // 查询符合条件的总条数
        if (count > 0) {
    
    
            List<TUser> list = mongoTemplate.find(query, TUser.class); // 分页查询
            return new PageImpl<>(list, pageable, count);
        }

        return null;
    }

    @Override
    public Long count(TUser user) {
    
    
        Criteria cri = new Criteria();
        if (StringUtils.isNotBlank(user.getName())) {
    
    
            cri.and("name").is(user.getName());
        }
        if (user.getAge() != null) {
    
    
            cri.and("age").is(user.getAge());
        }
        //more...

        return mongoTemplate.count(new Query(cri), TUser.class);
    }

    @Override
    public TUser getUserById(String id) {
    
    
        Query query = new Query(Criteria.where("objectId").is(id));
        return mongoTemplate.findOne(query, TUser.class);
    }

    @Override
    public TUser getUserByName(String name) {
    
    
        Query query = new Query(Criteria.where("name").is(name));
        return mongoTemplate.findOne(query, TUser.class);
    }

    @Override
    public Long updateUser(TUser user) {
    
    
        Query query = new Query(Criteria.where("objectId").is(user.getObjectId()));

        Update update = new Update();
        update.set("name", user.getName());
        update.set("age", user.getAge());
        update.set("updateTime", new Date());

        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, TUser.class);
        return updateResult.getModifiedCount();
    }

    @Override
    public Long batchUpdateUserByName(TUser user, String name) {
    
    
        Query query = new Query(Criteria.where("name").is(name));

        Update update = new Update();
        update.set("name", user.getName());
        update.set("age", user.getAge());
        update.set("updateTime", new Date());

        UpdateResult updateResult = mongoTemplate.updateMulti(query, update, TUser.class);
        return updateResult.getModifiedCount();
    }

    @Override
    public String deleteUser(TUser user) {
    
    
        mongoTemplate.remove(user);
        return "success";
    }

    @Override
    public String deleteUserById(String id) {
    
    
        TUser user = getUserById(id);
        deleteUser(user);
        return "success";
    }

}

entity object

package com.yulisao.entity;

import lombok.Data;
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;

import java.util.Date;

/**
 * author yulisao
 * createDate 2023/5/31
 */
@Data
@ToString
@Document(collection = "t_user") // 声明是mongdb文档,相当于@tableName注解
public class TUser {
    
    

    @Id
    private String objectId; // 文档的唯一标识,自带索引,在mongodb中为ObjectId,类似mysql表的主键id。通过时间戳+机器标识+进程ID+自增计数器构成

    @Field("name")
    private String name;

    @Field("age")
    private Integer age;

    @Field("create_time") // 映射 mongodb中的字段名,可以不加,不加的话默认以key为列名, 也就是createTime为列名 。
    private Date createTime;

    @Field("update_time")
    private Date updateTime;

    /**
     * 其他可能用到注解
     * @Transient 表示这个是文档表里面不存在的字段,虚拟字段
     * @Indexed 表示给这个字段添加索引。 有索引查询会快很多
     * @CompoundIndex 表示给这个字段添加复合索引。
     */
}

paging request object

package com.yulisao.dto;

import java.io.Serializable;

public class PageParam<T> implements Serializable {
    
    

	private static final long serialVersionUID = 1L;
	private Integer currentPage;
	private Integer pageSize;
	private T param;

	public int getCurrentPage() {
    
    
		return (currentPage == null || currentPage <= 0) ? 1 : currentPage;
	}

	public PageParam<T> setCurrentPage(int currentPage) {
    
    
		this.currentPage = currentPage;
		return this;
	}

	public int getPageSize() {
    
    
		return (pageSize == null || pageSize <= 0) ? 10 : pageSize;
	}

	public PageParam<T> setPageSize(int pageSize) {
    
    
		this.pageSize = pageSize;
		return this;
	}

	public T getParam() {
    
    
		return param;
	}

	public PageParam<T> setParam(T param) {
    
    
		this.param = param;
		return this;
	}

}

startup class

package com.yulisao;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 项目启动类
 * author yulisao
 * createDate 2023/05/31
 */
@SpringBootApplication  
public class Application {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(Application.class, args);
    }
}


pom file support

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yulisao</groupId>
    <artifactId>mydemo</artifactId>
    <packaging>war</packaging>
    <version>1.0.0-SNAPSHOT</version>

    <!-- springboot依赖支持 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
 
</project>

The official spring document address of mongdb : https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/, those who are interested can go to know.

When the springboot project was just created, there was a startup class. At this time, if the startup error is reported, Cannot determine embedded database driver class for database type NONE it is because the database connection pool is created but the database cannot be connected to the database, and the data source can be excluded by adding the @EnableAutoConfiguration annotation to the startup class.

@EnableAutoConfiguration(exclude = {
    
    DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class}) // 排除默认的数据源

Guess you like

Origin blog.csdn.net/qq_29539827/article/details/130992934