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 版权协议,转载请附上原文出处链接和本声明。