gpt4 book ai didi

java - 如何使用 JDBC 创建事务性 DAO

转载 作者:行者123 更新时间:2023-11-30 05:34:20 24 4
gpt4 key购买 nike

我现在正在使用 JDBC,并希望为数据访问和业务逻辑创建单独的层。我为每个实体创建了多个 DAO,并为我的业务逻辑创建了多个服务。但我遇到了交易问题。在每个 DAO 中,我都有 CRUD,在每个操作中打开连接并在关闭连接后。但是,如果我需要在事务中使用多个操作,那么它将无法工作。

因此,我为整个 DAO 创建一个连接,但我需要为 DAO 外部的每个操作打开和关闭连接。

我的 DAO 示例

public class UserDAOImpl implements UserDAO {

private Connection connection;

public UserDAO(Connection connection) {
this.connection = connection;
}

// CRUD operations
}

抽象 DAO 工厂

public abstract class DAOFactory {

public abstract UserDAO getUserDAO();
public abstract ItemDAO getItemDAO();
public abstract OrderDAO getOrderDAO();
public abstract RoleDAO getRoleDAO();

public static DAOFactory getDAOFactory(Class<? extends DAOFactory> factoryClass) throws IllegalAccessException, InstantiationException {
return factoryClass.newInstance();
}
}

MySQL DAO工厂实现示例

public class MySqlDAOFactory extends DAOFactory {

private UserDAO userDAO;
private ItemDAO itemDAO;
private OrderDAO orderDAO;
private RoleDAO roleDAO;

@Override
public UserDAO getUserDAO() {
if (userDAO == null) {
userDAO = new UserDAOImpl(getConnection());
}
return userDAO;
}

@Override
public ItemDAO getItemDAO() {
if (itemDAO == null) {
itemDAO = new ItemDAOImpl(getConnection());
}
return itemDAO;
}

@Override
public OrderDAO getOrderDAO() {
if (orderDAO == null) {
orderDAO = new OrderDAOImpl(getConnection());
}
return orderDAO;
}

@Override
public RoleDAO getRoleDAO() {
if (roleDAO == null) {
roleDAO = new RoleDAOImpl(getConnection());
}
return roleDAO;
}

static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

public static Connection getConnection() {
Connection connection = null;
Context initCtx = null;
try {
initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/mysql");
connection = ds.getConnection();
} catch (NamingException | SQLException e) {
e.printStackTrace();
}
return connection;
}
}

DAO方法示例

public Optional<User> findById(Long id) {
User user = null;
try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM shop.user WHERE id = ?", Statement.RETURN_GENERATED_KEYS)) {
statement.setLong(1, id);
ResultSet resultSet = statement.executeQuery();
resultSet.next();
user = userMapper.map(resultSet);
} catch (SQLException e) {
e.printStackTrace();
}
return Optional.ofNullable(user);
}

最佳答案

通常,您不必在 DAO 级别处理事务。最好在服务层应用事务管理,因为这样您可以控制何时需要/不需要事务的逻辑,还可以控制回滚策略等其他方面。

根据您的情况,您可以查看 JTA 文档。此 API 提供注释和其他工具来轻松管理您的交易:)

关于java - 如何使用 JDBC 创建事务性 DAO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56909569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com