MyBatis を使用して MySQL ストアド プロシージャを呼び出す Spring Boot の例 - 同時銀行振込のケースがない
この記事では、MyBatis フレームワークを使用して Spring Boot アプリケーションで MySQL ストアド プロシージャを呼び出し、銀行振込機能を実装し、同時実行の問題がないことを確認する方法を紹介します。
1.Spring Boot プロジェクトと MySQL ストアド プロシージャを作成する
まず、Spring Boot プロジェクトを作成し、MySQL データ ソースを構成します。次の構成を application.properties ファイルに追加します。
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
次に、銀行振込を処理する transfer という MySQL ストアド プロシージャを作成し、同時実行の問題を回避するためにトランザクション内で転送を処理するようにします。
DELIMITER //
CREATE PROCEDURE transfer(IN sender_id INT, IN receiver_id INT, IN amount DECIMAL(10, 2))
BEGIN
DECLARE sender_balance DECIMAL(10, 2);
DECLARE receiver_balance DECIMAL(10, 2);
SELECT balance INTO sender_balance FROM accounts WHERE id = sender_id;
SELECT balance INTO receiver_balance FROM accounts WHERE id = receiver_id;
IF sender_balance >= amount THEN
UPDATE accounts SET balance = balance - amount WHERE id = sender_id;
UPDATE accounts SET balance = balance + amount WHERE id = receiver_id;
ELSE
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Insufficient balance';
END IF;
COMMIT;
END //
DELIMITER ;
2.MyBatisの設定
MyBatis 依存関係を pom.xml ファイルに追加します。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
application.properties ファイルで MyBatis を構成します。
mybatis.mapper-locations=classpath:mappers/*.xml
BankMapper というインターフェースを作成します。
@Mapper
public interface BankMapper {
void transfer(@Param("sender_id") Integer sender_id, @Param("receiver_id") Integer receiver_id, @Param("amount") BigDecimal amount);
}
resources/mappers ディレクトリに BankMapper.xml という名前のマッピング ファイルを作成します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.BankMapper">
<select id="transfer" statementType="CALLABLE">
{call transfer(#{sender_id}, #{receiver_id}, #{amount})}
</select>
</mapper>
3. ストアド プロシージャを呼び出す
これで、Spring Boot プロジェクトでストアド プロシージャを呼び出すことができます。BankService というサービス クラスを作成し、BankMapper インターフェイスを挿入します。
@Service
public class BankService {
@Autowired
private BankMapper bankMapper;
public void transfer(Integer sender_id, Integer receiver_id, BigDecimal amount) {
bankMapper.transfer(sender_id, receiver_id, amount);
}
}
BankController
HTTP リクエストを処理するために呼び出されるコントローラー クラスを作成します。
@RestController
@RequestMapping("/bank")
public class BankController {
@Autowired
private BankService bankService;
@PostMapping("/transfer")
public ResponseEntity<String> transfer(@RequestParam Integer sender_id, @RequestParam Integer receiver_id, @RequestParam BigDecimal amount) {
try {
bankService.transfer(sender_id, receiver_id, amount);
return ResponseEntity.ok("Transfer successful");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Transfer failed: " + e.getMessage());
}
}
}
4. ストアド プロシージャの呼び出しをテストする
ストアド プロシージャの呼び出しは、HTTP 要求を送信することでテストできるようになりました。Spring Boot アプリケーションを開始し、ブラウザーまたは Postman を使用して次の要求を送信します。
POST http://localhost:8080/bank/transfer?sender_id=1&receiver_id=2&amount=100
応答は、転送操作が正常に完了したことを示す「転送成功」である必要があります。
この記事では、MyBatis フレームワークを使用して Spring Boot アプリケーションで MySQL ストアド プロシージャを呼び出し、銀行振込機能を実装し、同時実行の問題を回避する方法を紹介しました。この例を通じて、MyBatis を使用してストアド プロシージャを呼び出し、実際のプロジェクトでより複雑なビジネス ロジックを実装する方法を学習できます。