MongoRepository深度解析

  • Post author:
  • Post category:其他

MongoRepository接口解析

在Mongo数据库中,Repository类有点像mysql的mapper文件的意思,但是比mapper文件更加的简单。

/**
 * 继承的MongoRepository接口中,
 * 泛型1是对应的domain包中的实体类
 * 泛型2是该类的对应的文档主键 
 * 记得贴上Repository注解,该类的对象交由spring容器管理
 */
@Repository
public interface UserRepository extends MongoRepository<User,ObjectId> {
    User findByName(String name);
}

其中继承的MongoRepository的第二个参数要注意,因为后来使用的CRUD方法中要使用对应的主键查询,如果是ObjectId类型的话,就要转换一下,或者也可以用String类型

定义好这个类之后就可以直接用这个类里面的方法来调用CRUD方法了

@Service
public class UserServiceImpl  implements IUserService {
    @Autowired
    private UserRepository repository;

    public void save(User user) {
        repository.save(user);
    }
}

这就有几个问题出现了:

问题1:为什么UserRepository接口不写任何方法,UserRepository可以直接调用CRUD方法?

因为UserRepository接口的继承体系,在CrudRepository里面封装了很多方法

在这里插入图片描述

问题2:为什么UserRepository接口没看到创建实现类也可以调用方法呢?

UserRepository并不是没有创建实现类,而是不需要明确创建实现类,因为spring容器自动帮你创建了,通过JDK的动态代理方式帮我们创建了。

springboot会自动将继承这个MongoRepository接口的接口进行动态代理,创建接口代理实现对象,交给spring容器管理

问题3:为什么查询用户姓名信息操作,只需要在UserRepository接口定义findByName即可呢?

public User findByName(String name) {
        return repository.findByName(name);
    }
}

JPA:sun公司制定dao操作规范,此处重点讲JPA查询规范

JPA查询规范:

​ 就是定义符合JPA约束的查询方法

​ 方法格式要求:前缀 + 属性名 + 操作符

​ 前缀:findBy开头或者queryBy开头

​ 属性名:表的某个列(实体对象属性),首字母大写

​ 操作符:and or in

操作原理:在spring动态代理时,会根据jpa查询规范解析自定义的方法,拼接处MQL查询语句,即可实现查询操作


版权声明:本文为qq_42969716原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。