diff options
Diffstat (limited to 'spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring')
8 files changed, 264 insertions, 0 deletions
diff --git a/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/Application.java b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/Application.java new file mode 100644 index 0000000..4393f3f --- /dev/null +++ b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/Application.java @@ -0,0 +1,12 @@ +package com.example.spring; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) throws Exception { + SpringApplication.run(Application.class, args); + } +}
\ No newline at end of file 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 diff --git a/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/hello/HelloController.java b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/hello/HelloController.java new file mode 100644 index 0000000..bb287ba --- /dev/null +++ b/spring-boot/03-bank-jdbc-rest/src/main/java/com/example/spring/hello/HelloController.java @@ -0,0 +1,14 @@ +package com.example.spring.hello; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class HelloController { + @RequestMapping("/") + @ResponseBody + String home() { + return "App is running! Access http://host:port/account/{accountNumber}"; + } +}
\ No newline at end of file |
