栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot整合MongoDB CRUD

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot整合MongoDB CRUD

springboot整合MongoDB 导入依赖
        
        
            org.springframework.boot
            spring-boot-starter-data-mongodb
        
配置
#默认无安全设置 如果有安全设置还得配置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 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 = 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 = 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 = 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 = 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 = mongoTemplate.find(query, User.class);
        user.forEach(System.out::println);
    }
排序查询
@Test
public void QueryFind(){
    //通过salary顺序排序 asc为逆序
    List 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 = 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 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 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);
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/975408.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号