首先,我们需要定义一个AOP切面,在该切面中声明一个@Transactional注解,该注解表示需要开启事务。实现该切面的Java类如下:
@Aspect
@Component
public class TransactionAspect {
@Autowired
private DataSourceTransactionManager transactionManager;
@Around("@annotation(org.springframework.transaction.annotation.Transactional)")
public Object doTransaction(ProceedingJoinPoint joinPoint) throws Throwable {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
Object obj = joinPoint.proceed();
transactionManager.commit(status);
return obj;
} catch (Exception e) {
transactionManager.rollback(status);
throw e;
}
}
}
然后,我们需要定义一个UserService接口和其实现类UserServiceImpl,该服务类中包含了一些数据库操作方法,并在这些方法上添加@Transactional注解,表示这些方法需要开启事务。
UserService接口:
public interface UserService {
User getById(Long id);
List<User> getAll();
void add(User user);
void update(User user);
void deleteById(Long id);
}
UserServiceImpl实现:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Transactional(rollbackFor = Exception.class)
@Override
public User getById(Long id) {
return userMapper.selectByPrimaryKey(id);
}
@Transactional(rollbackFor = Exception.class)
@Override
public List<User> getAll() {
return userMapper.selectAll();
}
@Transactional(rollbackFor = Exception.class)
@Override
public void add(User user) {
userMapper.insert(user);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void update(User user) {
userMapper.updateByPrimaryKey(user);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void deleteById(Long id) {
userMapper.deleteByPrimaryKey(id);
}
}
最后,我们需要定义一个UserController,该Controller类中注入了UserService,通过调用UserService中的方法来实现对数据库的相关操作。这里我们只提供了一个查询用户方法的实现示例:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("")
public List<User> getAllUsers() {
return userService.getAll();
}
}