您好,我怎样才能通过一笔交易来操作其他 dao?
Posted
技术标签:
【中文标题】您好,我怎样才能通过一笔交易来操作其他 dao?【英文标题】:Hi, How can i do operation of others dao with one transaction? 【发布时间】:2021-08-08 22:52:53 【问题描述】:我知道在一个事务中应该使用哪些方法 正确执行此操作的最佳方法是什么? 车刀有以下方法
public Car findCar(int numOfPas,String carCategory)
String query = "SELECT*FROM car_info WHERE numOfPas = ? AND carCategory=? AND carState='ready' ORDER BY RAND() LIMIT 1;";
Car foundCar = null;
ResultSet resultSet = null;
try (Connection connection = mysqlDAOFactory.getConnection();
PreparedStatement statement = connection.prepareStatement(query))
statement.setInt(1,numOfPas);
statement.setString(2,carCategory);
resultSet =statement.executeQuery();
if(resultSet.next())
foundCar = new Car();
foundCar.setCarId(resultSet.getInt("carId"));
foundCar.setCarCategory(resultSet.getString("carCategory"));
foundCar.setNumOfPas(resultSet.getInt("numOfPas"));
foundCar.setCarState(resultSet.getString("carState"));
foundCar.setCarName(resultSet.getString("carName"));
foundCar.setCarImage(manager.byteToImage(resultSet.getBytes("carImage")));
catch (SQLException throwables)
throwables.printStackTrace();
finally
if(resultSet!=null)
try
resultSet.close();
catch (SQLException throwables)
throwables.printStackTrace();
return foundCar;
Order Dao 有追随者
@Override
public boolean insertOrder(Order order)
int rowNum = 0;
String query = "INSERT INTO user_order(userId,carId,userAddress,userDestination,orderCost,orderDate) values(?,?,?,?,?,?)";
ResultSet keys = null;
try (Connection connection = MySQLDAOFactory.getConnection();
PreparedStatement statement = connection.prepareStatement(query,Statement.RETURN_GENERATED_KEYS))
statement.setInt(1,order.getUserId());
statement.setInt(2,order.getCarId());
statement.setString(3, order.getUserAddress());
statement.setString(4, order.getUserDestination());
statement.setDouble(5,order.getOrderCost());
statement.setTimestamp(6, Timestamp.valueOf(order.getOrderDate()));
rowNum = statement.executeUpdate();
keys = statement.getGeneratedKeys();
if(keys.next())
order.setOrderId(keys.getInt(1));
catch (SQLException throwables)
throwables.printStackTrace();
return rowNum>0;
如何将这些操作放在一个事务中?我通过 Apache dhcp 连接池接收连接。
编辑
这是课 我在哪里得到连接 公共类 MySQLDAOFactory 扩展 DAOFactory
public static Connection getConnection()
Connection conn = null;
try
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:comp/env");
DataSource ds = (DataSource) envContext.lookup("jdbc/UsersDB");
conn = ds.getConnection();
catch (NamingException | SQLException e)
e.printStackTrace();
return conn;
@Override
public CarDao getCarDao()
return new MySQLCarDao();
@Override
public UserDao getUserDao()
return new MySQLUserDao();
@Override
public OrderDao getOrderDao()
return new MySQLOrderDao();
@Override
public CarCategoryDao getCarCategoryDao()
return new MySQLCarCategoryDao();
【问题讨论】:
【参考方案1】:有很多不同的方式来管理交易。鉴于您的代码,最简单的方法是:
在try
块中:
-
在封装两个调用的调用者中创建您的
connection
执行connection.setAutoCommit(false)
调用findCar()
和insertOrder()
的每个方法
致电connection.commit();
在catch
块中:
致电connection.rollback()
connection
不是在这些函数之外创建的,所以不要忘记从每个函数中删除连接设置。
【讨论】:
以上是关于您好,我怎样才能通过一笔交易来操作其他 dao?的主要内容,如果未能解决你的问题,请参考以下文章