diff options
| author | Kamal Wickramanayake <kamal@inbox.lk> | 2026-05-16 21:18:32 +0530 |
|---|---|---|
| committer | Kamal Wickramanayake <kamal@inbox.lk> | 2026-05-16 21:18:32 +0530 |
| commit | e51834c899ff20781295410961934eb06239385c (patch) | |
| tree | 78f0058914063e37cbd6812d204e4f84efd0ab90 /spring-boot/04-bank-jpa-rest/src/main/java/com/example | |
| parent | b1d598a2f02819bc127d0d3522dc7ac91b4dee65 (diff) | |
Added spring-boot sample applications
Diffstat (limited to 'spring-boot/04-bank-jpa-rest/src/main/java/com/example')
12 files changed, 339 insertions, 0 deletions
diff --git a/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/Application.java b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/Application.java new file mode 100644 index 0000000..4393f3f --- /dev/null +++ b/spring-boot/04-bank-jpa-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/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/Account.java b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/Account.java new file mode 100644 index 0000000..b5fe811 --- /dev/null +++ b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/Account.java @@ -0,0 +1,53 @@ +package com.example.spring.bank.account; + +import java.math.BigDecimal; + +import com.example.spring.bank.customer.Customer; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; + +@Entity +public class Account { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long accountNumber; + + private BigDecimal balance; + + public Account() { + super(); + } + + public Account(BigDecimal balance) { + super(); + this.balance = balance; + } + + @ManyToOne + private Customer customer; + + public Customer getCustomer() { + return customer; + } + + public void setCustomer(Customer customer) { + this.customer = customer; + } + + public Long getAccountNumber() { + return accountNumber; + } + public void setAccountNumber(Long accountNumber) { + this.accountNumber = accountNumber; + } + public BigDecimal getBalance() { + return balance; + } + public void setBalance(BigDecimal balance) { + this.balance = balance; + } +}
\ No newline at end of file diff --git a/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/AccountController.java b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/AccountController.java new file mode 100644 index 0000000..dc017dd --- /dev/null +++ b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/AccountController.java @@ -0,0 +1,28 @@ +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.PostMapping; +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("/{accountNumber}") + public Account getAccount(@PathVariable Long accountNumber) { + // TODO: Check null returns. + Account account = accountManager.findByAccountNumber(accountNumber).get(); + return account; + } + + @PostMapping("/") + public Account createAccount(Account account) { + return accountManager.create(account); + } +}
\ No newline at end of file diff --git a/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/AccountManager.java b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/AccountManager.java new file mode 100644 index 0000000..14dfa0c --- /dev/null +++ b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/AccountManager.java @@ -0,0 +1,13 @@ +package com.example.spring.bank.account; + +import java.util.Optional; + +public interface AccountManager { + + public Account create(Account account); + + public Optional<Account> findByAccountNumber(Long accountNumber); + public Iterable<Account> findAll(); + + // Other methods +} diff --git a/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/AccountManagerImpl.java b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/AccountManagerImpl.java new file mode 100644 index 0000000..2227469 --- /dev/null +++ b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/AccountManagerImpl.java @@ -0,0 +1,33 @@ +package com.example.spring.bank.account; + +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import jakarta.transaction.Transactional; + +@Service +public class AccountManagerImpl implements AccountManager { + + @Autowired + private AccountRepository accountRepository; + + @Override + @Transactional + public Account create(Account account) { + return accountRepository.save(account); + } + + @Override + public Optional<Account> findByAccountNumber(Long accountNumber) { + return accountRepository.findById(accountNumber); + } + + @Override + public Iterable<Account> findAll() { + return accountRepository.findAll(); + } + + // Other methods +}
\ No newline at end of file diff --git a/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/AccountRepository.java b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/AccountRepository.java new file mode 100644 index 0000000..086f828 --- /dev/null +++ b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/account/AccountRepository.java @@ -0,0 +1,7 @@ +package com.example.spring.bank.account; + +import org.springframework.data.repository.ListCrudRepository; + +public interface AccountRepository extends ListCrudRepository<Account, Long> { + +}
\ No newline at end of file diff --git a/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/customer/Customer.java b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/customer/Customer.java new file mode 100644 index 0000000..43bf0a6 --- /dev/null +++ b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/customer/Customer.java @@ -0,0 +1,66 @@ +package com.example.spring.bank.customer; + +import java.util.List; + +import com.example.spring.bank.account.Account; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; + + + +@Entity +public class Customer { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + + public Customer() { + super(); + } + + public Customer(String name) { + super(); + this.name = name; + } + + @OneToMany(mappedBy = "customer") +// @OneToMany + private List<Account> accounts; + + public List<Account> getAccounts() { + return accounts; + } + + public void setAccounts(List<Account> accounts) { + this.accounts = accounts; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "Customer [id=" + id + ", name=" + name + "]"; + } + +} diff --git a/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/customer/CustomerManager.java b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/customer/CustomerManager.java new file mode 100644 index 0000000..1560672 --- /dev/null +++ b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/customer/CustomerManager.java @@ -0,0 +1,17 @@ +package com.example.spring.bank.customer; + +import java.util.Optional; + +import com.example.spring.bank.account.Account; + +public interface CustomerManager { + + public Customer create(Customer customer); + + public Optional<Customer> findById(Long customerId); + public Iterable<Customer> findAll(); + + public void addAccount(Customer customer, Account account); + + // Other methods +} diff --git a/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/customer/CustomerManagerImpl.java b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/customer/CustomerManagerImpl.java new file mode 100644 index 0000000..05b3fdc --- /dev/null +++ b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/customer/CustomerManagerImpl.java @@ -0,0 +1,45 @@ +package com.example.spring.bank.customer; + +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.example.spring.bank.account.Account; + +import jakarta.transaction.Transactional; + +@Service +public class CustomerManagerImpl implements CustomerManager { + + @Autowired + private CustomerRepository customerRepository; + + @Override + @Transactional + public Customer create(Customer customer) { + return customerRepository.save(customer); + } + + @Override + public Optional<Customer> findById(Long customerId) { + return customerRepository.findById(customerId); + } + + @Override + public Iterable<Customer> findAll() { + return customerRepository.findAll(); + } + + @Transactional + @Override + public void addAccount(Customer customer, Account account) { + // May not work is the customer is detached. + // customer.getAccounts().add(account); + + // Access the Customer again - so that it would not be a detached entity. + customerRepository.findById(customer.getId()).get().getAccounts().add(account); + } + + // Other methods +}
\ No newline at end of file diff --git a/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/customer/CustomerRepository.java b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/customer/CustomerRepository.java new file mode 100644 index 0000000..8695d66 --- /dev/null +++ b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/customer/CustomerRepository.java @@ -0,0 +1,7 @@ +package com.example.spring.bank.customer; + +import org.springframework.data.repository.ListCrudRepository; + +public interface CustomerRepository extends ListCrudRepository<Customer, Long> { + +}
\ No newline at end of file diff --git a/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/dev/AppInit.java b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/dev/AppInit.java new file mode 100644 index 0000000..03a60f9 --- /dev/null +++ b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/bank/dev/AppInit.java @@ -0,0 +1,44 @@ +package com.example.spring.bank.dev; + +import java.math.BigDecimal; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +import com.example.spring.bank.account.Account; +import com.example.spring.bank.account.AccountManager; +import com.example.spring.bank.customer.Customer; +import com.example.spring.bank.customer.CustomerManager; + +@Component +public class AppInit implements CommandLineRunner { + + @Autowired + private AccountManager accountManager; + + @Autowired + private CustomerManager customerManager; + + @Value("${bankapp.init-testdata}") + private boolean initTestData; + + @Override + public void run(String... args) throws Exception { + // Create test accounts. + if (initTestData) { + Account acc1 = accountManager.create(new Account(new BigDecimal("0.00"))); + Account acc2 = accountManager.create(new Account(new BigDecimal("0.00"))); + + Customer c1 = customerManager.create(new Customer("Madushi")); + Customer c2 = customerManager.create(new Customer("Anuradha")); + + Customer customerSamitha = customerManager.create(new Customer("Samitha")); + Account accountSamitha = accountManager.create(new Account(new BigDecimal("0.00"))); + + customerManager.addAccount(customerSamitha, accountSamitha); + } + } + +} diff --git a/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/hello/HelloController.java b/spring-boot/04-bank-jpa-rest/src/main/java/com/example/spring/hello/HelloController.java new file mode 100644 index 0000000..bb287ba --- /dev/null +++ b/spring-boot/04-bank-jpa-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 |
