Java基礎,JavaWeb開發基礎,Spring基礎(沒有Spring的基礎也能夠,接觸過Spring最好),ajax,Jquery,Mybatis。 html
下面開始實現一個簡單的學生的添加 前端
在crud-sys子項目中建立entity文件夾並建立和數據庫相對應的Student類及其get,set函數。 java
public class Student { /** 學生id */ private String Name; /** 學生英語成績 */ private Integer English; /** 學生數學成績 */ private Integer Math; /** 學生計算機成績 */ private Integer Computer; public String getName () { return Name; } public void setId(String Name) { this.Name = Name; } public Integer getEnglish() { return English; } public void setEnglish(Integer english) { English = english; } public Integer getMath() { return Math; } public void setMath(Integer math) { Math = math; } public Integer getComputer() { return Computer; } public void setComputer(Integer computer) { Computer = computer; } }
這個項目中繼承了Mybatis,因此在進行數據庫操做以前咱們須要進行Mybatis的相關配置以及數據庫的鏈接操做。 mysql
進入https://mvnrepository.com/網站,輸入mybatis查詢mybatis依賴包: jquery
這裏選擇org.mybatis.spring.boot裏的mybatis-spring-boot-starter: web
點擊以後選擇版本,這裏我不習慣選擇太新的也不喜歡太舊的版本,因此通常會在稍微新的版本中選擇用戶數最多的那一個,好比mybatis我選擇2.0.1 ajax
點擊進去以後複製依賴: spring
第一步以後,將文本複製到crud-web子項目的pom.xml文件中,在<dependencies>標籤中加入剛纔複製的文本。sql
此時右下角出現Import changes和Enable auto import,這裏能夠選擇後者,之後修改pom.xml文件後,項目會自動導入jar包。 數據庫
首先仍是要經過上面的方法添加mysql的依賴到pom.xml文件中
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency>
在crud-web的resource文件夾下的application.properties文件中配置鏈接信息:
這些和普通的web開發中的DBUtil的寫法大同小異。
一樣在application.properties文件配置mybatis的映射文件路徑
mybatis.mapper-locations=classpath:/mapping/*.xml
這句話的意思是mybatis的映射文件存在於classpath(classpath就是生成target目錄後classes文件所在目錄)的mapping目錄下以.xml結尾的文件。
在crud-sys子項目下新建mapper文件夾,其下新建StudentMapper接口:
Mapper類中主要寫對實體的操做函數的定義,這裏咱們先定義一個添加函數。
添加代碼:public void add(Student student);
在resource文件夾下建立mapping文件夾,在其下建立StudentMapping.xml文件。
在xml文件中寫入mybatis映射文件須要的頭,能夠在網上搜索mybatis映射文件頭文件,也可進入官網去找
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
設置這個xml文件對應的是哪一個接口類中的函數。
添加<mapper>標籤,在標籤中配置namespace爲接口類所在的路徑
Mybatis提供了insert、update、delete和select分別對應添加、更改、刪除和查詢操做,這裏咱們用到的是insert標籤。
<insert id="add" parameterType="com.dingcheng365.crudsys.entity.Student ">
</insert>
id:id的值爲所對應的Mapper接口中的函數的名稱,必須徹底一致。
parameterType:參數類型,若是沒有參數或兩個以上參數,可不寫改屬性,若是是一個參數,須要寫上參數的類型,最好將包名加上,如String類型寫java.lang.String,Map類型寫java.util.Map
resultType:這個在這個例子中沒有體現。表示的是函數的返回值類型,若是爲void可不寫該屬性。這裏須要注意的是:resultType表示每個元素的值,例如咱們要進行查詢,返回值是List<Student>,由於查詢結果不必定是一個學生知足條件,可是這時候resultType須要填寫的是Student類而非List。
若是字段多的話添加語句會很長很難寫,這裏介紹一個快速且簡單的辦法:
在Navicat中隨便選中一行,右鍵複製爲insert語句:
粘貼後效果:
INSERT INTO `test`.`student` (`Name`, `English`, `Math`, `Computer`) VALUES ('zhangsan', '69', '86', '77');
這時候只須要修改後面的參數便可。
將語句粘貼到insert標籤中,同時修改參數,使用#{}中間加上參數的名稱:
在crud-sys下建立service文件夾,在其下建立StudentService接口類,裏面寫入函數,通常會和Mapper類中的函數類似,可能會返回值不一樣。
在service文件夾下建立impl文件夾,在其下建立StudentServiceImpl類實現StudentSerivce接口。
這裏須要注意的是:Service實現類上面須要加入@Service註解。在這個類中須要使用@Autowired註解注入studentMapper對象。
@Autowired:自動導入依賴的bean
@Service:通常用於修飾service層的組件
而後編寫代碼,調用studentMapper的添加函數,添加成功後返回1,若是失敗則返回0;
@Autowired private StudentMapper studentMapper; @Override public int add(Student student) { try { studentMapper.add(student); return 1; } catch (Exception e) { return 0; } }
至此,crud-sys子項目中所須要實現的功能已經編寫完畢,接下來就是和網頁的交互了。
SpringBoot能夠識別出resources文件夾下的static及其子文件夾下的文件,若是須要自定義文件夾,則須要在配置文件中配置。
在curd-web子目錄的templates文件夾下建立addstudent.html並寫入表單元素。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>學生添加</title> </head> <body> <form id="studentinfo"> <table> <tr> <td>姓名:</td> <td><input type="text" name="name" id="name"></td> </tr> <tr> <td>英語成績:</td> <td><input type="text" name="English" id="English"></td> </tr> <tr> <td>數學成績:</td> <td><input type="text" name="Math" id="Math"></td> </tr> <tr> <td>計算機成績:</td> <td><input type="text" name="Computer" id="Computer"></td> </tr> <tr> <td colspan="2"> <button id="add-student-btn" type="button">提交</button> </td> </tr> </table> </form> </body> </html>
使用jquery-validate對錶單輸入的值進行驗證,導入jquery.min.js和jquery-validate.min.js後進行編寫。
// 表單驗證 userInfoValidate = $('#userInfo').validate({ rules: { name: { required: true }, English: { required: true }, Math: { required: true }, Computer: { required: true } }, messages: { name: { required: '姓名不能爲空' }, English: { required: '英語成績不能爲空' }, Math: { required: '數學成績不能爲空' }, Computer: { required: '計算機成績不能爲空' } }, errorElement: 'small', errorPlacement: function(error, element) { // 在error 上添加 `invalid-feedback` class error.addClass('invalid-feedback'); element.parent().append(error); }, highlight: function(element) { $(element) .addClass('is-invalid') .removeClass('is-valid'); }, unhighlight: function(element, errorClass, validClass) { var $valid = $(element); if (!validClass) { $valid.removeClass('is-invalid is-valid'); } else { $valid.addClass('is-valid').removeClass('is-invalid'); } }, submitHandler: function (form) { // 確認登陸時刪除存儲標籤頁對象 // TODO: KEY值請參考`site-configs.js`文件中配置的`tabSittings`的值 window.sessionStorage.removeItem('admui.contentTabs'); } });
經過id調用validate函數,示例中的$('#userinfo').validate({..})
rules:表示表單驗證的規則,rules中的第一層的子元素對應的是input標籤的name而非id值。
子元素驗證,在子元素中寫入須要進行的驗證,經常使用的有required:true表示不可爲空,false表示可爲空;minlength:設置輸入的最短長度;maxlength:輸入的最長長度;email:true表示必須輸入正確的電子郵件;digtis:true表示必須輸入整數等。
message:自定義提示信息,與rules中一一對應,表示不知足規則時提示的信息。
errorElement:用什麼標籤標記錯誤,默認是label
errorPlacement:自定義錯誤放置的位置
highlight:能夠給未經過驗證的元素加效果、閃爍等。
submitHandler:全部驗證經過後執行的函數
效果圖:
3)Ajax實現和Controller的交互
$("#add-student-btn").on('click', function () { $.ajax({ url: '/student/addstudent',//請求的地址 type: 'post',//請求類型:GET、POST、DELETE、PUT data: { //向請求傳遞的數據 "name": $("#name").val(), "English": $("#English").val(), "Math": $("#Math").val(), "Computer": $("#Computer").val() }, async: true, //是否異步,默認爲true success: function (e) { //請求成功的回調函數,e爲後臺傳遞過來的信息 console.log(e) }, error: function (e) { //請求失敗的回調函數 console.log("ajax請求失敗"); } }); });
經過提交按鈕的點擊事件,向student/addstudent發送POST請求,傳遞的數據爲用戶輸入的信息,請求後將後臺返回的信息打印到控制檯。
Controller是與前臺進行直接交互的模塊,因此在crud-web子項目中建立包controller,在其下建立StudentController類。
Controller類都須要加入註解@Controller,表示這是一個控制類
Controller類上面的@RequestMapping中的參數表示這個Controller中的全部映射路徑都是以這個參數開頭
若是Controller中一個函數須要返回json數據類型,則須要加入@ResponseBody註解,一般用來返回JSON數據或者是XML,通常咱們返回字符串類型時也須要使用這個註解
慎用@RestController,@RestController是@ResponseBody和@Controller的結合,當你返回的類型不是json等的時候,使用這個會將你返回的數據自動轉換成json類型返回。好比你須要返回一個頁面的時候就不能使用這個。
Controller返回頁面也是一個很重要的點,能夠參考個人博客:http://www.javashuo.com/article/p-fepgwgfh-cb.html
這裏會發現一個錯誤:service沒法進行注入。緣由是service所在的路徑必須是啓動類所在的路徑的子目錄。修改目錄結構後問題獲得解決。
@Controller @RequestMapping("/student") public class StudentController { @Autowired private StudentService studentService; @RequestMapping("/addstudent") public String addstudent(Student student) { return String.valueOf(studentService.add(student)); } }
因爲前臺傳遞數據的時候所傳遞的json對象與Student對象的屬性一一對應,因此在Controller接收的時候能夠直接在參數中書寫Student對象,系統會進行自動轉換。
咱們須要編寫IndexController來實現默認頁面的顯示,在controller文件夾下建立IndexController文件,寫入根路徑的映射:
@RequestMapping("/") public ModelAndView index() { return new ModelAndView("addstudent.html"); }
若是發現設置完畢後啓動項目顯示404的問題,能夠參考博客:http://www.javashuo.com/article/p-fepgwgfh-cb.html裏面詳細闡述了SpringBoot如何返回頁面的問題
在CrudWebApplication.java下右鍵Run CrudWebApplication,發現啓動錯誤:
這個問題產生的緣由是雖然咱們在Mapper類上面都加入了@Compent註解,可是項目並不知道有Mapper,不知道須要去加載Mapper,因此咱們須要在啓動類上方加入@MapperScan註解,參數爲basePackages = {"com.dingcheng365.crud.sys.mapper"},加入以後在項目啓動的時候就會自動掃描這個包中的全部Mapper類。
@MapperScan(basePackages = {"com.dingcheng365.crud.sys.mapper"})
從新啓動項目:
出現這個提示表示項目啓動成功,端口號爲8080,若是想修改項目的端口號,能夠修改application.properties文件加入 server.port=端口號 配置項。
啓動後輸入localhost:8080,因爲咱們以前配置了根路徑映射的函數,是返回addstudent.html頁面,因此會出現這個頁面。
輸入信息後點擊提交,發現添加失敗,查看控制檯報錯:
這個問題的解決辦法可參考博客:http://www.javashuo.com/article/p-uvfubnzt-bm.html
最簡單的解決辦法就是在鏈接語句中加入serverTimezone=GMT
加入以後從新啓動並輸入信息後點擊提交,發現數據庫中存在新添加的信息,至此學生信息添加的功能實現完畢。
實現了這個功能以後,刪除、修改、查詢之類的功能基本大同小異,這裏我只說幾點須要注意的地方。
十二、其餘問題
1)刪除時刪除單個信息
若是刪除單個信息咱們通常會使用/delete/id這樣的路徑,也就是直接將id值傳遞到路徑中,而且不使用?id=1這種格式,這樣在Controller類中接收的時候有所不一樣,下面是實例:
@RequestMapping("/deletestudent/{id}") @ResponseBody public String deleteUser(@PathVariable("id") String id) { return studentService.delete(id); }
能夠看到,須要加入@PathVariable註解,參數爲須要讀取的值的名稱,並且在RequestMapping中寫的路徑id值不肯定須要加上大括號。
2)刪除時刪除多個信息(批量刪除)
批量刪除的時候,咱們在前臺傳遞的確定是一個數組,裏面包含要刪除的多個id值,這個在Controller接受的時候也有所不一樣,因爲是數組的問題。下面是實例:
前臺:
$.ajax({ url: "/user/deleteUsers", type: "post", data: { ids": ids }, success: function (e) { if (e == "success") { toastr.success("刪除成功"); } else { toastr.error("刪除失敗,請稍後重試"); } }, error: function (e) { console.log(e); } });
後臺接收:
@RequestMapping(value = "/deleteUsers") @ResponseBody public String deleteUsers(@RequestParam("ids[]") List<String> ids,) { …… }
在進行數組接受的時候,須要在@RequestParam註解中加入名稱加上[]的參數才能正確接收。
3)前臺傳遞過來的對象並無和後臺相對應
這個實例中,咱們從前臺接收的對象的參數正好和後臺存在的Student類相對應,因此咱們在後臺直接用Student對象接受,那若是不一致的時候該怎麼辦?有兩種狀況:
當參數個數比較少,2-4個左右時,咱們能夠直接在接收的函數中一個一個羅列出來,對應關係使用@RequestParam來進行區分。
當參數個數比較多時,我我的推薦一個類型——Map類,這個類真的是百用不爽,因爲他和json結構上的類似性,致使這個類的用途很是之大。在進行數據查詢的時候若是咱們要查詢的結果並非某一個類的集合,這個時候用Map對象也能夠很完美的解決問題。