springboot整合MongoDB CRUD

springboot整合MongoDB

导入依赖

        <!--MongoDB数据库-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

配置

#默认无安全设置 如果有安全设置还得配置host、port、username、password
spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/baicha

操作集合

集合创建

@SpringBootTest
class SpringBootMongodbDemoApplicationTests{
    //注入MongoTemplate
    @Autowired
    private MongoTemplate mongoTemplate;

    //添加CreateCollection方法 在baicha库中新建commodity商品集合
    @Test
    public void CreateCollection(){
        mongoTemplate.createCollection("commodity");
    }
}
@Test
    public void CreateCollection(){
//        判断commodity集合是否存在
        boolean Exists = mongoTemplate.collectionExists("commodity");
        if (Exists!=true){  //集合不存在就创建,反之不创建  因为如果直接创建就会报错
            mongoTemplate.createCollection("commodity");
        }
    }

集合删除

//        删除commodity文档
        mongoTemplate.dropCollection("commodity");

文档添加

文档查询

在这里插入图片描述

如果我们需要吧pojo转为document,就在pojo类上添加@Document注解

如果我们要对pojo中的id字段映射成文档中的id 就在id字段上添加@Id

如果我们pojo中的字段想映射为文档中的字段,就在pojo字段上添加@Field

如果我们pojo中的字段为user但是想映射为username,所使用@Field

如果不打算吧字段映射到集合中就添加@Transient


编写User实体类并做文档适配操作

import java.util.Date;

@Document("user")   //代表这个类为文档 并且数据在user集合中,不设置默认映射为实体类名
public class User {
    @Id //吧这个类的id映射为文档的id
    private Integer id;
    @Field("username")  //设置字段映射为username
    private String name;
    @Field
    private Double salary;
    @Field
    private Date birthday;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public User(Integer id, String name, Double salary, Date birthday) {
        this.id = id;
        this.name = name;
        this.salary = salary;
        this.birthday = birthday;
    }

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                ", birthday=" + birthday +
                '}';
    }
}

添加一条文档

    //    添加一条文档
    @Test
    public void Add_OneDocument() {
//        mongoTemplate.save(new User(1, "张三", 3200.0, new Date()));  //save方法在有id的时候是更新数据
        mongoTemplate.insert(new User(1, "张三", 3200.0, new Date()));   //insert如果id已经存在会报错主键重复DuplicateKeyException
    }

批量插入文档

//        insert可以批量插入,但是save不行,只能for循环一条一条放
//        参数一:批量数据  参数二:放入哪个集合(直接字符串指定或者使用反射User.class)
        mongoTemplate.insert(Arrays.asList(new User(2, "李四", 3200.0, new Date()),new User(3, "王五", 3200.0, new Date())),"user");

文档查询

查询全部文档

    @Test
    public void Find(){
//        查询所有
        List<User> all = mongoTemplate.findAll(User.class);
        all.forEach(System.out::println);
    }

查询ById

    @Test
    public void FindById(){
//        查询一个通过id
        User byId = mongoTemplate.findById(1, User.class);
        System.out.println(byId);
    }

条件查询

    @Test
    public void QueryFind(){
//        条件查询  为空就是全部查询出来
        List<User> user = mongoTemplate.find(new Query(), User.class);
        user.forEach(System.out::println);
    }

查询包含张三的信息

    @Test
    public void QueryFind(){
//        条件查询 插叙name字段包张三的数据
        Query query = new Query(Criteria.where("name").is("张三"));       //name和username都可以,会自动转换
        List<User> user = mongoTemplate.find(query, User.class);
        user.forEach(System.out::println);
    }

条件的种类

在这里插入图片描述

AND查询

@Test
public void QueryFind(){
    //and查询
    Query query = Query.query(Criteria.where("name").is("张三").and("salary").is(3200.0));
    List<User> user = mongoTemplate.find(query, User.class);
    user.forEach(System.out::println);
}

OR查询

or查询比较奇特,需要先把or的条件放到Criteria对象中再设置查询条件

    @Test
    public void QueryFind(){
        Criteria criteria = new Criteria();
        criteria.orOperator(
                criteria.where("name").is("张三"),
                criteria.where("name").is("李四")
        );
        //OR查询
        Query query = Query.query(criteria);
        List<User> user = mongoTemplate.find(query, User.class);
//        User{id=1, name='张三', salary=3200.0, birthday=Wed Jun 15 20:45:12 CST 2022}
//        User{id=2, name='李四', salary=3200.0, birthday=Wed Jun 15 20:52:12 CST 2022}
        user.forEach(System.out::println);
    }

AND+OR查询

    @Test
    public void QueryFind(){
        Criteria criteria = new Criteria();
        criteria.and("name").is("李四")
                .orOperator(
                criteria.where("name").is("张三"),
                criteria.where("name").is("李四")
        );
        //AND+OR查询
        Query query = Query.query(criteria);
        List<User> user = mongoTemplate.find(query, User.class);
        user.forEach(System.out::println);
    }

排序查询

@Test
public void QueryFind(){
    //通过salary顺序排序 asc为逆序
    List<User> user = mongoTemplate.find(new Query().with(Sort.by(Sort.Order.desc("salary"))), User.class);
    user.forEach(System.out::println);
}

分页查询

@Test
public void QueryFind(){
    //分页查询 第0页 查询两条
    List<User> user = mongoTemplate.find(new Query().with(Sort.by(Sort.Order.desc("salary"))).skip(0).limit(2), User.class);
    user.forEach(System.out::println);
}

总条数查询

@Test
public void QueryFind() {
    //总条数
    long count = mongoTemplate.count(new Query(), User.class);
    //查询name中为张三的总条数
    long count1 = mongoTemplate.count(Query.query(Criteria.where("name").is("张三")), User.class);
    System.out.println(count);
    System.out.println(count1);
}

去重查询

@Test
public void QueryFind() {
    //去重查询  参数1为条件  2为被去重字段  3为去重字段的类class  4为被去重字段的数据类型
    List<Double> salary = mongoTemplate.findDistinct(new Query(), "salary", User.class, Double.class);
    salary.forEach(System.out::println);
}

json查询

@Test
public void QueryFind() {
    //使用json字符串查询  "{name:1}"为查询的只返回name,1为返回 0为不返回
    List<User> users = mongoTemplate.find(new BasicQuery("{$or:[{name:'张三'},{name:'李四'}]}", "{name:1}"), User.class);
    users.forEach(System.out::println);
}

文档更新

单条更新

@Test
public void update() {
    //更新匹配的第一条数据
    Update update = new Update();
    update.set("name","baicha");

    Query query  = new Query(Criteria.where("id").is(1));
    mongoTemplate.updateFirst(query, update, User.class);
}

批量更新

    @Test
    public void update() {
        //更新匹配的第一条数据
        Update update = new Update();
        update.set("name", "baicha");

        Query query = new Query(Criteria.where("id").is(1));
//        批量更新匹配的数据
        mongoTemplate.updateMulti(query, update, User.class);
    }

更新插入

    @Test
    public void update() {
        //更新匹配的第一条数据
        Update update = new Update();
        update.set("name", "baicha");
        //       使用自定义的id插入 不使用默认生成的
        update.set("name", "baicha").setOnInsert("id",10);

        Query query = new Query(Criteria.where("id").is(1));
//        更新匹配的数据,如果没有就插入
        mongoTemplate.upsert(query, update, User.class);
    }

文档删除

    @Test
    public void Reomve() {
//        删除所有
    mongoTemplate.remove(new Query(),User.class);
//    删除name为王五对应的文档
    mongoTemplate.remove(new Query(Criteria.where("name").is("王五")),User.class);
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值