使用spring-data-mongodb操作mongo记录

目录

[一、 使用mongoTemplate操作3步骤](#一、 使用mongoTemplate操作3步骤)

新增

批量新增

修改

删除

更新

查询

分页查询

[二、使用 MongoRepository操作4步骤](#二、使用 MongoRepository操作4步骤)

新增

删除

修改

查询

分页查询


  • spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb
  • MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足。

1、使用MongoTemplate

2、使用MongoRepository

一、 使用mongoTemplate操作3步骤

1.引入starter依赖

java 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

2.配置文件yaml增加mongodb连接信息

spring.mongodb.uri=mongodb://8.160.170.126:27018/test

3.在使用的地方直接注入MongoTemplate对象

复制代码
@Autowired
private MongoTemplate mongoTemplate;

创建一个对象

java 复制代码
// 添加lombok依赖
        /*<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency> */

@Data
@NoArgsConstructor
@AllArgsConstructor //pojo类对应的集合(首字母小写):
//@Document(value = "Actor")
public class Actor {

//    @Id //当前属性和mongodb集合中的主键是对应的
//    private String aaaid; //id 对应mongodb中集合的_id字段有一个对应关系:mongotemplate

    private String id;
    private String actorName;

    private Boolean gender;
    private Date birth;
}
新增

新建测试类,引入mongoTemplate

新增可以使用save或 insert

java 复制代码
@SpringBootTest // 和启动类同包,可以不加classes属性,(classes = MongoDemoApplication.class)
public class TemplateTest{

    @Autowired
    private MongoTemplate mongoTemplate;

    
    @Test
    public void testInsert() {

        // mongoTemplate.insert(new Actor("3","刘德华insert",true,new Date()));
        Actor actor = new Actor();
        actor.setId("1");
        actor.setActorName("刘德华");


        mongoTemplate.save(actor);
    }
}
批量新增
java 复制代码
    @Test
    public void testBatchInsert() {
        List<Actor> actors = new ArrayList<Actor>();
        actors.add(new Actor("11", "Jerry", false, new Date()));
        actors.add(new Actor("13", "Andy", false, new Date()));
        actors.add(new Actor("14", "jack", false, new Date()));
        actors.add(new Actor("15", "Tom", false, new Date()));

        mongoTemplate.insert(actors, Actor.class);
    }
修改

#新增:可以使用insert、save方法

1、insert只能做添加,不能做修改,可以批量添加数据

2、save既可以做添加,也可以做修改,如果我们要使用save修改集合中某个字段的值,其它字段保持原来的值,必须是先查询出来,然后修改,最后写回去。

java 复制代码
    @Test
    public void testModify(){
        Actor actor = mongoTemplate.findById("3", Actor.class);
        actor.setActorName("刘德华insert_modiyf");
        mongoTemplate.save(actor);
    }
删除

删除:

and 关系: Criteria.where("gender").is(false).and("actorName").is("张敏")

or关系: Criteria criteria=new Criteria(); criteria.orOperator(Criteria2,Criteria2,...)

java 复制代码
    @Test
    public void testDelete(){
        Criteria criteria=new Criteria();
        criteria.orOperator(Criteria.where("_id").is("1"),Criteria.where("actorName").is("关之琳"));

        Query query=new Query(criteria);

        DeleteResult remove = mongoTemplate.remove(query, Actor.class);
        System.out.println(remove.getDeletedCount()); // 打印删除个数
    }
更新
java 复制代码
    @Test
    public void testUpdate() {
        Query query = new Query(Criteria.where("gender").is(true));

        Update update = new Update();
        // 增加年龄字段 为 19
        update.set("age", 19);

        // mongoTemplate.upsert(query, update, Actor.class);
        // mongoTemplate.updateFirst(query, update, Actor.class);
        mongoTemplate.updateMulti(query, update, Actor.class);
    }
查询
java 复制代码
    @Test
    public void testQuery(){
       // Actor actor = mongoTemplate.findById("15", Actor.class);
       // System.out.println(actor);
       //
       // List<Actor> all = mongoTemplate.findAll(Actor.class);
       // for (Actor actor1 : all) {
       //     System.out.println(actor1);
       // }

        // Query query=new Query(Criteria.where("age").is(19));
        // List<Actor> actors = mongoTemplate.find(query, Actor.class);
        // for (Actor actor : actors) {
        //     System.out.println(actor);
        // }

        String result = String.format("%s%s%s", ".*", "j", ".*");
        Pattern pattern=Pattern.compile(result,Pattern.CASE_INSENSITIVE);
        Query query=new Query(Criteria.where("actorName").regex(pattern));
        List<Actor> actors = mongoTemplate.find(query, Actor.class);
        for (Actor actor : actors) {
            System.out.println(actor);
        }
    }
分页查询
java 复制代码
    //分页查询
    @Test
    public void testQueryPage() {
        int pageNum = 1;
        int size = 3;

        Query query = new Query(Criteria.where("gender").is(false));
        long total = mongoTemplate.count(query, Actor.class);

        List<Actor> actors = mongoTemplate.find(query.skip((pageNum - 1) * size).limit(size), Actor.class);
        for (Actor actor : actors) {
            System.out.println(actor);
        }

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("total", total);
        map.put("rows", actors);

        System.out.println(total);
    }
二、使用 MongoRepository操作4步骤

1、导入starter依赖

2、配置文件增加mong连接配置

3、使用xxxRepository继承 MongoRepository<实体对象,主键类型>

public interface ActorRepository extends MongoRepository<Actor,String>

4、在使用的地方注入代理对象ActorRepository

新增
java 复制代码
    @Test
    public void testInsert(){
        // actorRepository.insert(new Actor("16","repos 1",true,new Date()));
        // actorRepository.save(new Actor("17","repos 2",true,new Date()));
        List<Actor> actorList=new ArrayList<Actor>();
        actorList.add(new Actor("40","周润发2",true,new Date()));
        actorList.add(new Actor("41","周星驰2",true,new Date()));
        actorList.add(new Actor("42","李连杰2",true,new Date()));

        // actorRepository.insert(actorList);
        actorRepository.saveAll(actorList);
    }
删除
java 复制代码
    @Test
    public void testDelete(){
        // actorRepository.deleteById("6ad88ab9dee946d789218d2b");
        Actor actor = new Actor();
        actor.setId("32");
        actorRepository.delete(actor);
    }
修改
java 复制代码
    @Test
    public void testUpdate(){
        Actor actor=new Actor();
        actor.setId("31");
        actor.setActorName("刘德华modify");
        actorRepository.save(actor);
    }
查询
java 复制代码
    @Test
    public void testQuery(){
       // Actor actor = actorRepository.findById("30").get();
       // System.out.println(actor);

        Actor actor=new Actor();
        //actor.setGender(true);
        actor.setActorName("j");

        ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
                //.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
                .withMatcher("actorName", ExampleMatcher.GenericPropertyMatchers.startsWith())
                .withIgnoreCase(false); //改变默认大小写忽略方式:忽略大小写

        Example<Actor> example=Example.of(actor,matcher);

        List<Actor> all = actorRepository.findAll(example);
        for (Actor actor1 : all) {
            System.out.println(actor1);
        }
    }
分页查询
java 复制代码
    @Test
    public void testPage() {
        int pageNum = 0; // 起始页从0开始
        int pagesize = 3;
        Actor actor = new Actor();
        actor.setGender(true);
        Example<Actor> example = Example.of(actor);
        // Pageable pageable= PageRequest.of(pageNum,pagesize, Sort.by("id").descending());
        Pageable pageable = PageRequest.of(pageNum, pagesize);
        Page<Actor> page = actorRepository.findAll(example, pageable);
        System.out.println("总记录数:" + page.getTotalElements());
        System.out.println("总页数:" + page.getTotalPages());
        System.out.println("当前页列表数据:");
        for (Actor actor1 : page.getContent()) {
            System.out.println(actor1);
        }
    }

注意:构建的分页对象,起始页从0开始

相关推荐
凤山老林44 分钟前
授权模型只会RBAC?深入 ABAC 授权模型,实现权限判断做成策略引擎
大数据·数据库·算法
geovindu1 小时前
sql:SQL Views and Materialized Views using mysql 9.0
大数据·数据库·数据仓库·sql·mysql·数据库开发·数据库架构
梦影_1 小时前
MySQL进阶教程(二)—— 储存过程与触发器(下)
开发语言·数据库·后端·sql·mysql·oracle·数据库开发
工业涂料百问1 小时前
陶瓷涂料的光泽度怎么检测?20°、60°、85° 三个角度怎么选
数据库
科创致远1 小时前
ESOP 电子作业指导书车间无纸化实战评测
大数据·数据库·人工智能·制造
xiaomuzuirenzhen1 小时前
2027车企数字化岗位项目准备:从SQL数据建模到库存分析看板
大数据·数据库·sql
鸽芷咕1 小时前
从环境搭建到敬礼动作:启元 Q1 SDK 全流程实战与 8 个实测坑排查手册
数据库·ai·机器人·sdk·启元q1
科技研学社2 小时前
服装厂激光开袋机与智能模板机怎么选?核心工序设备深度对比与落地实战
数据库·python
其实防守也摸鱼3 小时前
Cylab在线靶场——挑战图书馆初学者指南
服务器·前端·数据库·chrome·安全·网络安全·靶场