# lab2 20230515 # CourseBean ``` package com.ctbcbank.demo.lab2.bean; import java.util.Date; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Entity @Data @NoArgsConstructor @AllArgsConstructor public class CourseBean { // cascade fetch mappedBy // 定義id // 設定生成策略 // 定義其他欄位與屬性 // ... // .... @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private int price; private Date createdAt= new Date(); private Date updatedAt= new Date(); // 使用callback 從7選1 // @PrePersist // public void callMeWhenCreated() { //// createdAt=目前時間 // createdAt = new Date(); // } // // @PrePersist // public void callMeWhenUpdated() { //// updatedAt=目前時間 // updatedAt = new Date(); // } // 指定類別 @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER) @JoinColumn(name = "courseCategory_id",referencedColumnName="id") private CourseCategoryBean category; // 記得從7選1 callback // @PreUpdate // public void callMeBeforeObjectDelete() { //// this.category = category; // } public CourseBean(String name, int price) { super(); this.name = name; this.price = price; } } ``` # CourseCategoryBean ``` package com.ctbcbank.demo.lab2.bean; import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import lombok.Data; import lombok.NoArgsConstructor; @Entity @Data @NoArgsConstructor public class CourseCategoryBean { // 定義id // 設定生成策略 // 定義其他欄位與屬性 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 設定必要的參數>生成的策略? private Long id; private String name; // private int price; @OneToMany(mappedBy="category",cascade = CascadeType.ALL,fetch=FetchType.EAGER) private List<CourseBean> courses = new ArrayList<>(); public CourseCategoryBean(List<CourseBean> courses) { super(); this.courses = courses; } } ``` # ourseBeanRestController ``` package com.ctbcbank.demo.lab2.controller.rest; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ctbcbank.demo.lab2.bean.CourseBean; import com.ctbcbank.demo.lab2.repository.CourseBeanRepository; import com.ctbcbank.demo.lab2.service.CourseBeanService; import lombok.extern.slf4j.Slf4j; @RestController @CrossOrigin @Slf4j @RequestMapping("/api/course") public class CourseBeanRestController { private static final String KEY1 = "data"; @Autowired private CourseBeanRepository repository; @Autowired CourseBeanService service; @GetMapping("/all") public List<CourseBean> getAllCourses() { return service.getAllCourseBean(); } // @Autowired // CourseBeanService service; // @RequestMapping(method=RequestMethod.GET) // List<CourseBean> getAllCourses() { // return service.getAllCourseBean(); // } // @RequestMapping(method=RequestMethod.POST) // @ResponseStatus(HttpStatus.CREATED) // // CourseBean postCourseBean(@RequestBody CourseBean bean) { // return service.saveOrUpdateCourseBean(bean); // } } ``` # CourseBeanRepository ``` package com.ctbcbank.demo.lab2.repository; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import com.ctbcbank.demo.lab2.bean.CourseBean; //如果是UUID,這裡就要換成UUID public interface CourseBeanRepository extends CrudRepository<CourseBean, Long>,JpaRepository<CourseBean, Long> { CourseBean getReferenceById(long id); List<CourseBean> findAll(); @Query("SELECT x FROM CourseBean x ORDER BY x.name, x.price,x.createdAt,x.updatedAt") List<CourseBean> findAllOrdeByName(); } ``` # CourseCategoryBeanRepository ``` package com.ctbcbank.demo.lab2.repository; import java.util.List; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Service; import com.ctbcbank.demo.lab2.bean.CourseCategoryBean; @Service public interface CourseCategoryBeanRepository extends CrudRepository<CourseCategoryBean, Long> { CourseCategoryBean getReferenceById(long id); List<CourseCategoryBean> findAll(); } ``` # CourseBeanRunner ``` package com.ctbcbank.demo.lab2.runner; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import com.ctbcbank.demo.lab2.bean.CourseBean; import com.ctbcbank.demo.lab2.repository.CourseBeanRepository; import lombok.extern.slf4j.Slf4j; @Component @Slf4j @Order(1) public class CourseBeanRunner implements CommandLineRunner { @Autowired CourseBeanRepository repository; @Override public void run(String... args) throws Exception { log.info("will access repository"); // 新增一筆資料 // 修改屬性 // 儲存 // h2 console看,應該會生效 insertData(); modifyData(); getData(); deleteData(); } private void deleteData() { repository.deleteById(2l); log.info("2rd course has been delete!"); } private void insertData() { CourseBean c1 = new CourseBean("Java0512", 20000); CourseBean c2 = new CourseBean("C#0512", 1000); CourseBean c3 = new CourseBean("Python12", 3000); CourseBean[] courseBean = { c1, c2, c3 }; for (CourseBean c : courseBean) { // c.setCreatedAt(c.getCreatedAt()); repository.save(c); } } private void modifyData() { CourseBean courseBean = repository.findById(1L).get(); courseBean.setName("C#0511"); courseBean.setPrice(1500); // courseBean.setUpdatedAt(courseBean.getUpdatedAt()); CourseBean saveCourseBean = repository.save(courseBean); log.info("Course Modify Result:{}",saveCourseBean); } private void getData() { log.info("Data num:{}", repository.count()); repository.findAll().forEach(c -> { log.info("store courseBean:{},{},{}", c.getId(), c.getName(), c.getPrice()); }); } } ``` # CourseCategoryBeanRunner ``` package com.ctbcbank.demo.lab2.runner; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import com.ctbcbank.demo.lab2.bean.CourseBean; import com.ctbcbank.demo.lab2.bean.CourseCategoryBean; import com.ctbcbank.demo.lab2.repository.CourseCategoryBeanRepository; import lombok.extern.slf4j.Slf4j; @Component @Slf4j @Order(2) public class CourseCategoryBeanRunner implements CommandLineRunner { // @Autowired // CourseBeanRepository repository; @Autowired CourseCategoryBeanRepository repository; private List<CourseBean> courses = new ArrayList<>(); @Override public void run(String... args) throws Exception { insertData(); modifyData(); getData(); deleteData(); } private void deleteData() { repository.deleteById(1l); log.info("1st category has been delete!"); } private void getData() { log.info("Category num:{}", repository.count()); repository.findAll().forEach(c -> { log.info("store courseCategoryBean:{},{}", c.getId(), c.getName()); }); } private void modifyData() { CourseCategoryBean courseCategoryBean = repository.findById(1L).get(); courseCategoryBean.setName("courseCategory3"); repository.save(courseCategoryBean); // CourseCategoryBean saveCourseCategoryBean = repository.save(courseCategoryBean); // log.info("CourseCategory Modify Result:{}",saveCourseCategoryBean); } private void insertData() { CourseBean c1 = new CourseBean("Java1", 1000); CourseBean c2 = new CourseBean("C#1", 2000); // CourseBean c3 = new CourseBean("C#2", 3000); CourseCategoryBean courseCategoryBean = new CourseCategoryBean(); courseCategoryBean.setName("courseCategory1"); CourseCategoryBean courseCategoryBean2 = new CourseCategoryBean(); courseCategoryBean2.setName("courseCategory2"); // 新增c1、c3至同一個category,用來檢查刪除後2個course是否會被刪除 c1.setCategory(courseCategoryBean); // c3.setCategory(courseCategoryBean); c2.setCategory(courseCategoryBean2); List<CourseBean> courses = new ArrayList<>(); courses.add(c1); courses.add(c2); // courses.add(c3); courseCategoryBean.setCourses(courses); // CourseCategoryBean CourseCategorySave = repository.save(courseCategoryBean); repository.save(courseCategoryBean); repository.save(courseCategoryBean2); // log.info("courseCategoryBean:{}", repository.save(courseCategoryBean)); } } ``` # CourseBeanServiceJPAImplement ``` package com.ctbcbank.demo.lab2.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.ctbcbank.demo.lab2.bean.CourseBean; import com.ctbcbank.demo.lab2.repository.CourseBeanRepository; @Component public class CourseBeanServiceJPAImplement implements CourseBeanService{ @Autowired private CourseBeanRepository repository; @Override public List<CourseBean> getAllCourseBean() { return repository.findAll(); } @Override public CourseBean getCourseBeanById(long Id) { return repository.getReferenceById(Id); } @Override public CourseBean saveOrUpdateCourseBean(CourseBean bean) { return repository.save(bean); } @Override public void removeCourseBean(long id) { repository.deleteById(id); } @Override public void clearAll() { repository.deleteAll(getAllCourseBean()); } } ``` # CourseCategoryBeanServiceJPAImplement ``` package com.ctbcbank.demo.lab2.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.ctbcbank.demo.lab2.bean.CourseCategoryBean; import com.ctbcbank.demo.lab2.repository.CourseCategoryBeanRepository; @Component public class CourseCategoryBeanServiceJPAImplement implements CourseCategoryBeanService { @Autowired private CourseCategoryBeanRepository repository; @Override public List<CourseCategoryBean> getAllCourseCategoryBean() { return repository.findAll(); } @Override public CourseCategoryBean getCourseCategoryBeanById(long id) { return repository.getReferenceById(id); } @Override public CourseCategoryBean saveOrUpdateCourseCategoryBean(CourseCategoryBean bean) { return repository.save(bean); } @Override public void removeCourseCategoryBean(long id) { repository.deleteById(id); } @Override public void clearAll() { repository.deleteAll(getAllCourseCategoryBean()); } } ``` # all.html ``` <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <html> <head> <meta charset="UTF8"> <title>課程</title> </head> <body> <h1>課程列表</h1> <h3> <a href="./add">新增課程</a> </h3> <table th:inline="text" border="1"> <tr> <td>id</td> <td>name</td> <td>price</td> <td>刪除</td> <td>修改</td> </tr> <tr th:each="obj:${data}"> <td>[[${obj.id}]]</td> <td>[[${obj.name}]]</td> <td>[[${obj.price}]]</td> <td><a th:href="'del?idString='+${obj.id}">刪除</a></td> <td><a th:href="'mod?idString='+${obj.id}">修改</a></td> </tr> </table> </body> </html> ```