Spring Data的MongoTemplate和MongoRepository有什么区别?
我需要编写一个应用程序,我可以使用spring-data和mongodb进行复杂的查询。 我已经开始使用MongoRepository,但是为了查找示例或者真正理解语法而苦恼于复杂的查询。
我正在谈论这样的疑问:
@Repository public interface UserRepositoryInterface extends MongoRepository<User, String> { List<User> findByEmailOrLastName(String email, String lastName); }
或使用基于JSON的查询,我尝试了试错法,因为我没有得到正确的语法。 即使在阅读了mongodb文档(由于语法错误而导致的非工作示例)之后。
@Repository public interface UserRepositoryInterface extends MongoRepository<User, String> { @Query("'$or':[{'firstName':{'$regex':?0,'$options':'i'}},{'lastName':{'$regex':?0,'$options':'i'}}]") List<User> findByEmailOrFirstnameOrLastnameLike(String searchText); }
在阅读所有的文档之后,似乎mongoTemplate
更好。 我指的是以下文件:
http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/reference.html
你能告诉我什么更方便和强大的使用? mongoTemplate
或MongoRepository
? 都是同样成熟还是其中一个比另一个缺乏更多的function?
“方便”和“强大使用”在一定程度上是矛盾的。 版本库比模板要方便得多,但是后者当然会给你更细致的控制权。
由于存储库编程模型可用于多个Spring Data模块,因此您可以在Spring Data MongoDB 参考文档的常规部分find更深入的文档 。
TL; DR
我们通常推荐以下方法:
- 从存储库摘要开始,只使用查询派生机制或手动定义的查询来声明简单的查询。
- 对于更复杂的查询,请将手动实现的方法添加到存储库(如此处所述)。 对于实现使用
MongoTemplate
。
细节
对于你的例子,这看起来像这样:
-
为您的自定义代码定义一个接口:
interface CustomUserRepository { List<User> yourCustomMethod(); }
-
为这个类添加一个实现,并按照命名约定来确保我们可以find这个类。
class UserRepositoryImpl implements CustomUserRepository { private final MongoOperations operations; @Autowired public UserRepositoryImpl(MongoOperations operations) { Assert.notNull(operations, "MongoOperations must not be null!"); this.operations = operations; } public List<User> yourCustomMethod() { // custom implementation here } }
-
现在让您的基础知识库接口扩展自定义的一个,基础架构将自动使用您的自定义实现:
interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository { }
这样你就可以做出select了:只需要简单的声明就可以进入UserRepository
,手动执行的所有内容都将进入CustomUserRepository
。 这里定制了自定义选项。
这个答案可能有点延迟,但我会build议避免整个存储库路线。 你得到很less的实施方法具有很大的实用价值。 为了使它工作,你会遇到Javaconfiguration废话,你可以花几天和几周的时间在文档中没有太多的帮助。
而是使用MongoTemplate
路线,创build自己的数据访问层,从而免除Spring程序员面临的configuration恶梦。 MongoTemplate
是真正的工程师的救世主,因为它有很大的灵活性,所以舒适地构build他们自己的类和交互。 结构可以是这样的:
- 创build一个将在应用程序级别运行的
MongoClientFactory
类,并为您提供一个MongoClient
对象。 你可以实现这个作为一个单身人士或使用枚举单身人士(这是线程安全的) - 创build一个数据访问基类,您可以从中inheritance每个域对象的数据访问对象)。 基类可以实现一个创buildMongoTemplate对象的方法,您可以使用特定类的方法来访问所有数据库
- 每个域对象的每个数据访问类都可以实现基本方法,或者可以在基类中实现它们
- Controller方法可以根据需要调用Data访问类中的方法。