summaryrefslogtreecommitdiff
path: root/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account
diff options
context:
space:
mode:
authorKamal Wickramanayake <kamal@inbox.lk>2026-05-16 21:18:32 +0530
committerKamal Wickramanayake <kamal@inbox.lk>2026-05-16 21:18:32 +0530
commite51834c899ff20781295410961934eb06239385c (patch)
tree78f0058914063e37cbd6812d204e4f84efd0ab90 /spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account
parentb1d598a2f02819bc127d0d3522dc7ac91b4dee65 (diff)
Added spring-boot sample applications
Diffstat (limited to 'spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account')
-rw-r--r--spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/Account.java21
-rw-r--r--spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountController.java23
-rw-r--r--spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountManager.java21
-rw-r--r--spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountManagerImpl.java78
-rw-r--r--spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountRepository.java13
-rw-r--r--spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/JDBCAccountRepository.java82
6 files changed, 238 insertions, 0 deletions
diff --git a/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/Account.java b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/Account.java
new file mode 100644
index 0000000..4a84f09
--- /dev/null
+++ b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/Account.java
@@ -0,0 +1,21 @@
+package com.example.spring.bank.account;
+
+import java.math.BigDecimal;
+
+public class Account {
+ private int accountNumber;
+ private BigDecimal balance;
+
+ public int getAccountNumber() {
+ return accountNumber;
+ }
+ public void setAccountNumber(int accountNumber) {
+ this.accountNumber = accountNumber;
+ }
+ public BigDecimal getBalance() {
+ return balance;
+ }
+ public void setBalance(BigDecimal balance) {
+ this.balance = balance;
+ }
+}
diff --git a/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountController.java b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountController.java
new file mode 100644
index 0000000..9d229fe
--- /dev/null
+++ b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountController.java
@@ -0,0 +1,23 @@
+package com.example.spring.bank.account;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/account")
+public class AccountController {
+
+ @Autowired
+ private AccountManager accountManager;
+
+ @GetMapping("/{accno}")
+ public Account getAccount(@PathVariable Integer accno) {
+ Account account = accountManager.find(accno);
+
+ return account;
+ }
+
+} \ No newline at end of file
diff --git a/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountManager.java b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountManager.java
new file mode 100644
index 0000000..492ecf9
--- /dev/null
+++ b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountManager.java
@@ -0,0 +1,21 @@
+package com.example.spring.bank.account;
+
+import java.math.BigDecimal;
+
+public interface AccountManager {
+
+ public Account create();
+
+ public Account find(int accountNumber);
+
+ public Account deposit(int accountNumber, BigDecimal amount);
+ public Account withdraw(int accountNumber, BigDecimal amount);
+
+ public void delete(int accountNumber);
+
+ /** Returns the first account */
+ public Account transfer(int accountNumber1, int accountNumber2, BigDecimal amount);
+
+ public void chargeForLowBalance(BigDecimal minimumBalance, BigDecimal amount);
+
+}
diff --git a/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountManagerImpl.java b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountManagerImpl.java
new file mode 100644
index 0000000..d205e02
--- /dev/null
+++ b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountManagerImpl.java
@@ -0,0 +1,78 @@
+package com.example.spring.bank.account;
+
+import java.math.BigDecimal;
+import java.util.Iterator;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class AccountManagerImpl implements AccountManager {
+
+ @Autowired
+ private AccountRepository accountDAO;
+
+ @Override
+ @Transactional
+ public void chargeForLowBalance(BigDecimal minimumBalance, BigDecimal amount) {
+ List<Account> accounts = accountDAO.findAccountsWithLowBalance(minimumBalance);
+ for (Iterator<Account> iterator = accounts.iterator(); iterator.hasNext();) {
+ Account account = (Account) iterator.next();
+ // Check if the balance will go beyond 0. If yes, set the balance to 0
+ account.setBalance(account.getBalance().subtract(amount));
+ accountDAO.update(account);
+ }
+ }
+
+ @Override
+ @Transactional
+ public Account create() {
+ return accountDAO.createAccount();
+ }
+
+ @Override
+ public Account find(int accountNumber) {
+ return accountDAO.getAccount(accountNumber);
+ }
+
+ @Override
+ @Transactional
+ public void delete(int accountNumber) {
+ accountDAO.delete(accountNumber);
+ }
+
+ @Override
+ @Transactional
+ public Account deposit(int accountNumber, BigDecimal amount) {
+ Account account = accountDAO.getAccount(accountNumber);
+ account.setBalance(account.getBalance().add(amount));
+ accountDAO.update(account);
+
+ return account;
+ }
+
+ @Override
+ public Account withdraw(int accountNumber, BigDecimal amount) {
+ Account account = accountDAO.getAccount(accountNumber);
+ account.setBalance(account.getBalance().subtract(amount));
+ accountDAO.update(account);
+
+ return account;
+ }
+
+ @Override
+ @Transactional
+ public Account transfer(int accountNumber1, int accountNumber2, BigDecimal amount) {
+ Account account1 = accountDAO.getAccount(accountNumber1);
+ account1.setBalance(account1.getBalance().subtract(amount));
+ accountDAO.update(account1);
+
+ Account account2 = accountDAO.getAccount(accountNumber2);
+ account2.setBalance(account2.getBalance().add(amount));
+ accountDAO.update(account2);
+
+ return account1;
+ }
+} \ No newline at end of file
diff --git a/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountRepository.java b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountRepository.java
new file mode 100644
index 0000000..2b5c3d0
--- /dev/null
+++ b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/AccountRepository.java
@@ -0,0 +1,13 @@
+package com.example.spring.bank.account;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public interface AccountRepository {
+ public Account createAccount();
+ public Account getAccount(int accountNumber);
+ public void update(Account account);
+ public void delete(int accountNumber);
+ public List<Account> findAllAccounts();
+ public List<Account> findAccountsWithLowBalance(BigDecimal lessThanAmount);
+}
diff --git a/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/JDBCAccountRepository.java b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/JDBCAccountRepository.java
new file mode 100644
index 0000000..9ad846e
--- /dev/null
+++ b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/bank/account/JDBCAccountRepository.java
@@ -0,0 +1,82 @@
+package com.example.spring.bank.account;
+
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.PreparedStatementCreator;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.jdbc.support.GeneratedKeyHolder;
+import org.springframework.jdbc.support.KeyHolder;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class JDBCAccountRepository implements AccountRepository {
+
+ @Autowired
+ private JdbcTemplate jdbcTemplate;
+
+ @Override
+ public Account createAccount() {
+ final String INSERT_SQL = "insert into account (balance) values(0)";
+
+ KeyHolder keyHolder = new GeneratedKeyHolder();
+ jdbcTemplate.update(
+ new PreparedStatementCreator() {
+ public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
+ PreparedStatement ps =
+ connection.prepareStatement(INSERT_SQL, new String[] {"account_number"});
+ // ps.setString(1, name);
+ return ps;
+ }
+ }, keyHolder);
+
+ Account account = new Account();
+ // keyHolder.getKey() now contains the generated key
+ account.setAccountNumber(keyHolder.getKey().intValue());
+ account.setBalance(new BigDecimal("0.0"));
+
+ return account;
+ }
+
+ @Override
+ public void delete(int accountNumber) {
+ jdbcTemplate.update("delete from account where account_number = ?", Integer.valueOf(accountNumber));
+ }
+
+ @Override
+ public List<Account> findAccountsWithLowBalance(BigDecimal lessThanAmount) {
+ return this.jdbcTemplate.query( "select * from account where balance < ?", new Object[] {lessThanAmount.doubleValue()}, new AccountMapper());
+ }
+
+ @Override
+ public List<Account> findAllAccounts() {
+ return this.jdbcTemplate.query( "select * from account", new AccountMapper());
+ }
+
+ @Override
+ public Account getAccount(int accountNumber) {
+ return this.jdbcTemplate.queryForObject( "select * from account where account_number = ?", new Object[] {accountNumber}, new AccountMapper());
+ }
+
+ @Override
+ public void update(Account account) {
+ this.jdbcTemplate.update("update account set balance = ? where account_number = ?", account.getBalance(), account.getAccountNumber());
+ }
+
+
+ private static final class AccountMapper implements RowMapper<Account> {
+
+ public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
+ Account account = new Account();
+ account.setAccountNumber(rs.getInt("account_number"));
+ account.setBalance(rs.getBigDecimal("balance"));
+ return account;
+ }
+ }
+} \ No newline at end of file