SpringMVC+JdbcTemplate实现事务管理(插入操作需要返回自增字段)

将Service层交给事务去管理,beans.xml配置如下:

<!-- 配置Jdbc模板 -->
 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource" ref="dataSource"></property>
 </bean>

 <bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"></property>
 </bean>

 <tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
   <tx:method name="*" />
  </tx:attributes>
 </tx:advice>

 <aop:config>
  <aop:pointcut id="serviceMethod" expression="execution(* dmmap.service.*.*(..))" />
  <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
 </aop:config>


如果需要返回自增字段,插入过程如下:

public int createHousedoor(Housedoor housedoor) {
  int newId = 0;
  final Housedoor TmpDoor = housedoor;
  String issueDateStr = housedoor.getF_IssueDateStr();
  Date issueDate = null;
  if (issueDateStr != null) {
   try {
    issueDate = sdf.parse(issueDateStr);
   } catch (ParseException e) {
    e.printStackTrace();
   }
  }
  final Date _date = issueDate;
  KeyHolder keyholder = new GeneratedKeyHolder();
  final String insertsql = "insert into t_housedoor(F_TownId,F_Community,F_PropertyName,F_HouseEstate,F_BuildingNum,F_CellNum,F_RoomNum,F_DoorNum,F_MarkSizeId,F_SourceTypeId,F_Contact,F_Telephone,F_OldAddress,F_Remark,F_UserId,F_OptDate,F_bImport,F_CardId,F_IssueDate,F_Address) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
  int countt = 0;
  countt = jdbcTemplate.update(new PreparedStatementCreator() {
   @Override
   public PreparedStatement createPreparedStatement(Connection con)
     throws SQLException {
    // TODO Auto-generated method stub
    PreparedStatement preState = con.prepareStatement(insertsql,
      PreparedStatement.RETURN_GENERATED_KEYS);
    preState.setString(1, TmpDoor.getF_TownId());
    preState.setString(2, TmpDoor.getF_Community());
    preState.setString(3, TmpDoor.getF_PropertyName());
    preState.setString(4, TmpDoor.getF_HouseEstate());
    preState.setString(5, TmpDoor.getF_BuildingNum());
    preState.setString(6, TmpDoor.getF_CellNum());
    preState.setString(7, TmpDoor.getF_RoomNum());
    preState.setString(8, TmpDoor.getF_DoorNum());
    preState.setInt(9, TmpDoor.getF_MarkSizeId());
    preState.setInt(10, TmpDoor.getF_SourceTypeId());
    preState.setString(11, TmpDoor.getF_Contact());
    preState.setString(12, TmpDoor.getF_Telephone());
    preState.setString(13, TmpDoor.getF_OldAddress());
    preState.setString(14, TmpDoor.getF_Remark());
    preState.setString(15, TmpDoor.getF_UserId());
    preState.setDate(16, new java.sql.Date(new Date().getTime()));
    preState.setInt(17, TmpDoor.getF_bImport());
    preState.setString(18, TmpDoor.getF_CardId());
    if (_date == null)
     preState.setDate(19, null);
    else
     preState.setDate(19, new java.sql.Date(_date.getTime()));
    preState.setString(20, TmpDoor.getF_Address());
    return preState;
   }
  }, keyholder);
  if (countt == 1) {
   newId = (int) keyholder.getKey().longValue();
  }
  return newId;

}

上述代码中标红的地方一定不能让jdbcTemplate自己去获取,否则事务不起作用。

另外需要注意的是,在service的方法中调用dao层的方法,dao层方法中不能捕获异常,否则service端检测不到异常事务无法回滚


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!对于SpringMVCJdbcTemplate的整合,可以通过以下步骤进行查询和删除操作: 1. 配置数据源和JdbcTemplate 首先,在Spring的配置文件中配置数据源和JdbcTemplate。您可以使用Spring的内置数据源,如`BasicDataSource`或`HikariDataSource`,并为其提供数据库连接信息。然后,将数据源注入到JdbcTemplate中。 2. 创建DAO层接口和实现类 在DAO(数据访问对象)层中,创建一个接口来定义查询和删除操作的方法。您可以使用JdbcTemplate提供的方法来执行SQL查询和删除语句。然后,在实现类中实现这些方法。 例如,创建一个名为`UserDAO`的接口,定义查询和删除方法: ```java public interface UserDAO { List<User> getAllUsers(); void deleteUser(int userId); } ``` 然后,创建一个名为`UserDAOImpl`的实现类: ```java public class UserDAOImpl implements UserDAO { private JdbcTemplate jdbcTemplate; public UserDAOImpl(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public List<User> getAllUsers() { String sql = "SELECT * FROM users"; List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class)); return users; } public void deleteUser(int userId) { String sql = "DELETE FROM users WHERE id = ?"; jdbcTemplate.update(sql, userId); } } ``` 3. 创建Service层 接下来,在Service层中使用DAO层的实现类来提供业务逻辑。创建一个名为`UserService`的接口,并在实现类中注入`UserDAO`。 ```java public interface UserService { List<User> getAllUsers(); void deleteUser(int userId); } ``` ```java public class UserServiceImpl implements UserService { private UserDAO userDAO; public UserServiceImpl(UserDAO userDAO) { this.userDAO = userDAO; } public List<User> getAllUsers() { return userDAO.getAllUsers(); } public void deleteUser(int userId) { userDAO.deleteUser(userId); } } ``` 4. 创建Controller层 最后,在Controller层中使用Service层的实现类来处理HTTP请求。创建一个名为`UserController`的类,并在其中注入`UserService`。 ```java @Controller @RequestMapping("/users") public class UserController { private UserService userService; public UserController(UserService userService) { this.userService = userService; } @GetMapping public String getAllUsers(Model model) { List<User> users = userService.getAllUsers(); model.addAttribute("users", users); return "users"; } @PostMapping("/{id}/delete") public String deleteUser(@PathVariable("id") int userId) { userService.deleteUser(userId); return "redirect:/users"; } } ``` 在上述示例中,`getAllUsers`方法用于获取所有用户,并将其添加到Model中以供视图渲染。`deleteUser`方法用于删除指定ID的用户,并通过重定向返回到用户列表页面。 这样,您就可以使用SpringMVCJdbcTemplate进行查询和删除操作了。当然,您还可以根据具体需求进行扩展和优化。希望对您有所帮助!如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着骆驼写程序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值