上一篇博客寫了如何初始化一個簡單的Spring Boot項目,這次詳細記錄一下如何連接數據庫並實現增刪改查基本操作。
我使用的是MySQL 5.5+Navicat,MySQL量級比較輕,當然微軟的SQL Server也挺好的。
1、配置數據源與連接信息
默認生成的項目會帶有一個application.properties供用戶來配置相關信息,這里可以將其修改為application.yml,你問為什么?
yml文件天然樹狀結構,便於閱讀;需要寫的東西比properties少得多。
不足之處就是冒號后面要加空格,否則會報錯,而且縮進很嚴格!!!
詳細信息請閱讀下面的參考資料。
//application.yml spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/mydbsys username: root password: 123456 jpa: hibernate: ddl-auto: update show-sql: true
3306是MySQL的端口,mydbsys是數據庫名稱,數據庫肯定是要存在的,不存在還怎么連接。
2、在entity中定義Student與Grade對象
和Java語言很相似,屬性、set、get內容寫進去就行,有幾點JPA的注解要注意一下。
@ManyToOne指的是多個學生對應一個班級,其他常用注解看參考資料。
//Grade.java package com.studentsys.stusys.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Grade { @Id @GeneratedValue private Integer GID; private String GrandName; public Grade() { } public Integer getGID() { return GID; } public void setGID(Integer GID) { this.GID = GID; } public String getGrandName() { return GrandName; } public void setGrandName(String grandName) { GrandName = grandName; } }
//Student.java package com.studentsys.stusys.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; @Entity public class Student { @Id @GeneratedValue private Integer stuID; private String name; private String phone; private String password; //private Integer GID; @ManyToOne private Grade grade; public Grade getGrade() { return grade; } public void setGrade(Grade grade) { this.grade = grade; } public Student() { } public Integer getStuID() { return stuID; } public void setStuID(Integer stuID) { this.stuID = stuID; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Student(Integer stuID, String name, String phone, String password) { this.stuID = stuID; this.name = name; this.phone = phone; this.password = password; } }
3、在repository中定義數據訪問層,GradeRepository.java和StudentRepository.java。
繼承一下JPA的庫就可以,很多東西都已經定義好了,有特殊需要再利用@Override重寫父類函數就可以了。
//GradeRepository.java package com.studentsys.stusys.repository; import com.studentsys.stusys.entity.Grade; import org.springframework.data.jpa.repository.JpaRepository; public interface GradeRepository extends JpaRepository<Grade,Integer> { }
//StudentRepository.java package com.studentsys.stusys.repository; import com.studentsys.stusys.entity.Student; import org.springframework.data.jpa.repository.JpaRepository; public interface StudentRepository extends JpaRepository<Student,Integer> { }
4、在service中定義數據服務層及其實現接口
(別跟我學,一定要把數據服務層接口service和實現接口serviceImpl分開,將項目模塊化)
@Autowired
//GradeService.java package com.studentsys.stusys.service; import com.studentsys.stusys.entity.Grade; import java.util.List; import java.util.Optional; public interface GradeService { List<Grade> getAllGrade(); Optional<Grade> getGradeByID(Integer gid); }
//GradeServiceImpl.java package com.studentsys.stusys.service; import com.studentsys.stusys.entity.Grade; import com.studentsys.stusys.repository.GradeRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; @Service public class GradeServiceImpl implements GradeService { @Autowired private GradeRepository gradeRepository; @Override public List<Grade> getAllGrade() { return gradeRepository.findAll(); } @Override public Optional<Grade> getGradeByID(Integer gid) { return gradeRepository.findById(gid); } }
//StudentService.java package com.studentsys.stusys.service; import com.studentsys.stusys.entity.Student; import java.util.List; import java.util.Optional; public interface StudentService { List<Student> getAllStudent(); Student addStudent(Student student); Optional<Student> findByID(Integer id); Student updateStudent(Student student); }
//StudentServiceImpl.java package com.studentsys.stusys.service; import com.studentsys.stusys.entity.Student; import com.studentsys.stusys.repository.StudentRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; @Service public class StudentServiceImpl implements StudentService { @Autowired private StudentRepository studentRepository; @Override public List<Student> getAllStudent() { return studentRepository.findAll(); } @Override public Student addStudent(Student student) { return studentRepository.save(student); } @Override public Optional<Student> findByID(Integer id) { return studentRepository.findById(id); } @Override public Student updateStudent(Student student) { return studentRepository.save(student); } }
5、在controller中定義前端控制器StudentController.java
//StudentController.java package com.studentsys.stusys.cotroller; import com.studentsys.stusys.entity.Grade; import com.studentsys.stusys.entity.Student; import com.studentsys.stusys.service.GradeService; import com.studentsys.stusys.service.StudentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Optional; @RestController @RequestMapping("/") public class StudentController { @Autowired private StudentService studentService; @Autowired private GradeService gradeService; /** * 查看所有學生信息 * @param model * @return */ @GetMapping public String index(Model model){ List<Student> list = studentService.getAllStudent(); model.addAttribute("stus",list); return "index"; } /** * 添加學生信息功能 * @param name * @param password * @param phone * @return */ @PostMapping("/add") public String input(Student student){ Optional<Grade> grade = gradeService.getGradeByID(student.getGrade().getGID()); ; student.setGrade(grade.get()); studentService.addStudent(student); return "redirect:/"; } @GetMapping("/ks") public String ks(){ return "KSbaoM"; } /** * 顯示添加頁面 * @return */ @GetMapping("/add") public String addPage(Model model){ model.addAttribute("allGrade",gradeService.getAllGrade()); return "addstu"; } @GetMapping("/update/{id}") public String updatePage(@PathVariable("id") Integer id,Model model){ Optional<Student> student = studentService.findByID(id); model.addAttribute("stu",student.get()); model.addAttribute("allGrade",gradeService.getAllGrade()); return "updatestu"; } /** * 修改學生信息 * @param stuID * @param name * @param password * @param phone * @return String */ @PostMapping("/update") public String updateData(Student student){ Optional<Grade> grade = gradeService.getGradeByID(student.getGrade().getGID()); ; student.setGrade(grade.get()); studentService.addStudent(student); return "redirect:/"; } }
6、在resources中定義相關html頁面和資源文件
懶得寫了,這種靜態頁面找個模版隨便改改就ok了,主要是要注意themeleaf的使用。
Thymeleaf是面向Web和獨立環境的現代服務器端Java模板引擎,能夠處理HTML,XML,JavaScript,CSS甚至純文本。
首先在最開始的<html>標簽里要這樣寫<html xmlns:th="http://www.thymeleaf.org">,之后就是有一些標簽需要再修改,具體的可以看參考資料。
參考資料:
application.properties與application.yml之間的區別