Java 中的表模块模式:通过组织数据处理模块来增强可维护性
大约 4 分钟
也称为
- 记录集
表模块设计模式的意图
表模块模式巧妙地将数据库表数据访问逻辑封装在一个高效的模块中,非常适合 Java 应用程序。
表模块模式的详细解释,包含现实世界中的例子
现实世界的例子
想象一个图书馆,所有书籍都存储在一个大型数据库中。表模块设计模式可以比作管理图书馆特定区域的图书管理员,例如小说区。这位图书管理员负责与该区域相关的所有任务:添加新书、更新书籍信息、移除旧书,以及在请求时提供有关书籍的信息。就像表模块模式封装了特定表的数据库访问逻辑一样,图书管理员处理与小说区相关的所有操作,而不会向图书馆用户暴露书籍如何编目、存储和管理的复杂性。这使得图书馆用户更容易与小说区进行交互,因为他们可以依靠图书管理员来高效地管理和检索书籍,而无需了解底层的细节。
简单来说
表模块模式将特定表的数据库访问逻辑集中和封装起来,简化了数据检索和操作,同时隐藏了数据库的复杂性。
Java 中表模块模式的编程示例
在用户系统示例中,需要管理用户登录和注册的领域逻辑。通过使用表模块模式,我们可以创建一个 UserTableModule
类的实例来封装和处理与用户表中行相关的所有业务逻辑。
以下是基本的 User
实体。
@Setter
@Getter
@ToString
@EqualsAndHashCode
@AllArgsConstructor
public class User {
private int id;
private String username;
private String password;
}
以下是 UserTableModule
类。
public class UserTableModule {
private final DataSource dataSource;
private Connection connection = null;
private ResultSet resultSet = null;
private PreparedStatement preparedStatement = null;
public UserTableModule(final DataSource userDataSource) {
this.dataSource = userDataSource;
}
public int login(final String username, final String password) throws SQLException {
// Method implementation
}
public int registerUser(final User user) throws SQLException {
// Method implementation
}
}
在 App
类中,我们使用 UserTableModule
的实例来处理用户登录和注册。
@Slf4j
public final class App {
private static final String DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1";
private App() {}
public static void main(final String[] args) throws SQLException {
// Create data source and create the user table.
final var dataSource = createDataSource();
createSchema(dataSource);
var userTableModule = new UserTableModule(dataSource);
// Initialize two users.
var user1 = new User(1, "123456", "123456");
var user2 = new User(2, "test", "password");
// Login and register using the instance of userTableModule.
userTableModule.registerUser(user1);
userTableModule.login(user1.getUsername(), user1.getPassword());
userTableModule.login(user2.getUsername(), user2.getPassword());
userTableModule.registerUser(user2);
userTableModule.login(user2.getUsername(), user2.getPassword());
deleteSchema(dataSource);
}
private static void deleteSchema(final DataSource dataSource)
throws SQLException {
try (var connection = dataSource.getConnection();
var statement = connection.createStatement()) {
statement.execute(UserTableModule.DELETE_SCHEMA_SQL);
}
}
private static void createSchema(final DataSource dataSource)
throws SQLException {
try (var connection = dataSource.getConnection();
var statement = connection.createStatement()) {
statement.execute(UserTableModule.CREATE_SCHEMA_SQL);
}
}
private static DataSource createDataSource() {
var dataSource = new JdbcDataSource();
dataSource.setURL(DB_URL);
return dataSource;
}
}
在此示例中,UserTableModule
类负责封装与数据库中用户表的所有交互。这包括登录和注册用户的逻辑。User 类表示用户实体,具有 id
、username
和 password
等属性。
- **初始化**:
UserTableModule
使用DataSource
对象进行初始化,该对象用于建立与数据库的连接。 - **用户注册**:
UserTableModule
中的registerUser
方法处理将新用户注册到数据库中的逻辑。 - **用户登录**:
login
方法管理根据用户用户名和密码进行用户身份验证的逻辑。 - **应用程序流程**:
App
类演示了如何使用UserTableModule
来注册和登录用户。创建数据源,设置模式,并使用相应的反馈注册和登录用户。
程序输出
13:59:36.417 [main] INFO com.iluwatar.tablemodule.UserTableModule -- Register successfully!
13:59:36.426 [main] INFO com.iluwatar.tablemodule.UserTableModule -- Login successfully!
13:59:36.426 [main] INFO com.iluwatar.tablemodule.UserTableModule -- Fail to login!
13:59:36.426 [main] INFO com.iluwatar.tablemodule.UserTableModule -- Register successfully!
13:59:36.427 [main] INFO com.iluwatar.tablemodule.UserTableModule -- Login successfully!
此示例展示了表模块模式如何将 users
表的数据库操作集中起来,使应用程序更加模块化,更易于维护。
何时在 Java 中使用表模块模式
- 当您需要在集中式模块中管理数据库表的 数据访问逻辑时使用。
- 非常适合与数据库表大量交互并且需要封装数据库查询的应用程序。
- 表模块模式特别适合动态系统,因为它可以确保随着 Java 应用程序模式的演变,数据库管理具有可扩展性。
表模块模式 Java 教程
表模块模式在 Java 中的现实世界应用
- 在多个模块需要与同一数据库表交互的企业应用程序中。
- 需要对数据库表执行 CRUD 操作的 Web 应用程序。
- Java 基于的 ORM 框架(如 Hibernate 或 JPA)使用类似的概念来管理数据访问。
表模块模式的优点和权衡
优点
- 将数据访问逻辑集中并封装,从而简化了维护。
- 通过提供与数据库表的单一交互点,减少了代码重复。
- 通过封装查询逻辑,增强了代码可读性,并降低了 SQL 注入攻击的风险。
权衡
- 如果表的操作很多,可能会导致模块过大,从而降低可读性。
- 如果没有妥善优化,尤其是高负载场景下,可能会成为瓶颈。
相关的 Java 设计模式
- Active Record:与表模块不同,Active Record 在同一个类中结合了数据访问和领域逻辑。
- 数据访问对象 (DAO):为某种类型的数据库或其他持久性机制提供抽象接口,通常与表模块一起使用,将低级数据访问操作与高级业务逻辑分离。
- 数据映射器:将内存对象与数据库分离,与直接映射数据库表的表模块不同。
- 领域模型:表示领域逻辑和行为,通常与表模块一起使用,处理复杂的业务规则和数据交互。
- 仓储:抽象数据层,允许执行更复杂的查询,而表模块通常更简单,以表为中心。
- 事务脚本:通过过程组织业务逻辑,每个过程处理来自表示层的单个请求,这与表模块以数据为中心的方法形成对比。