java - 为什么每个实体都应该有单独的 MyBatis 映射器?

标签 java structure mybatis

我正在开发一个使用 MyBatis 注释和映射器接口(interface)的小型应用程序。我在MyBatis上看到的所有例子,包括官网,都为每个实体创建了一个单独的mapper类。我有两个实体,FooBar,以及两个分别包含这些实体的数据库。所以目前我的项目结构的一部分看起来像这样:

model
├── bar
│   ├── Bar.java
│   ├── DB1BarMapper.java
│   └── DB2BarMapper.java
└── foo
    ├── Foo.java
    ├── DB1FooMapper.java
    └── DB2FooMapper.java

在我的项目中,FooBar 对象的处理大致相同,但数据库在逻辑上具有不同的功能。我正在考虑更改我的项目设计,我将按数据库对映射器进行分组,然后可以像这样简化结构:

model_new
├── Bar.java
├── Foo.java
├── DB1Mapper.java
└── DB2Mapper.java

在这里,DB 映射器将包含访问 FooBar 实体(并返回相应的 POJO)的方法。

据我所知,这在编程方面是有效的,因为映射器被添加到数据库配置中,并且因为映射器本身不引用特定对象,除了从方法中返回它们。

我试图研究这是否是一种可接受的做法,但我没有找到任何关于为什么这是习俗的问题或文章,MyBatis 站点也没有解决这个问题。我最好的猜测是它与 DAO 模式有关,但我认为在我的案例中以这种方式使用它没有任何优势。

所以我的问题是,为什么每个实体都有一个单独的 MyBatis 映射器是自定义的,如果对我来说数据库比实体更重要,那么每个数据库连接都有一个映射器在设计上是否可以接受?

最佳答案

为多个实体使用一个映射器并没有错。映射器是一种具有 DAO 层逻辑的模块。用于将其他代码拆分为模块的相同标准也适用于映射器,即:一个映射器中的事物应具有高内聚性,而不同映射器中的事物应具有低耦合性。

基本上,映射器的结构反射(reflect)了应用程序的结构。与大多数情况一样,每个 module 都有一个映射器,其中包含 module 的广泛定义。它不一定意味着每个类的映射器。如果按数据库类型分隔应用程序中的代码有意义,它可能是每个数据库类型的映射器。

每个实体类的映射器之所以流行,是因为每个类的映射器是拆分映射器的一种自然方式,因为实体类是应用程序的一个自然模块。但情况并非总是如此,也不总是最方便的拆分方式。在许多情况下,根据 aggregate 使用映射器是有意义的这是一个域对象集群的映射器,可以被视为一个单元/模块。

关于java - 为什么每个实体都应该有单独的 MyBatis 映射器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51787598/

相关文章:

c - 用内存表示查询?

java - 从 Student 对象列表中删除空对象

java - 在 Logback 中使用 getAppender()

java - 关于模块和返回语句的问题

c - 在函数之间传递结构数组

python - 是否可以在 Python 类定义中使用导入的类方法而不运行导入文件中的所有代码?

java - Mybatis If 语句使用 include 属性

java - 使用MyBatis Generator,当提供NULL值时如何为列指定默认值?

java - Mybatis迁移工具在一个事务中运行多条mysql语句

javascript - JavaScript 中的日期和时间验证