從0開始完成SpringBoot+Mybatis實現增刪改查

一、準備知識:

1)須要掌握的知識:

Java基礎,JavaWeb開發基礎,Spring基礎(沒有Spring的基礎也能夠,接觸過Spring最好),ajax,Jquery,Mybatis。 html

2)項目結構介紹:

  • crud-core:這裏面存放的是項目的一些公共的東西,如工具類util包、自定義異常類、枚舉類型等。
  • crud-sys:這裏面主要是和數據庫操做有關係的文件。實體類entity、在沒有使用Mybatis狀況下有repository或dao實體操做類、使用Mybatis狀況下有Mapper類、Service類和Service的實現類都在sys子模塊下。
  • 實體類entity:是對應於數據庫的一些實體類,是全部數據操做的基礎。
  • repository或dao:是對實體類進行增刪改查操做的類,是直接和數據庫進行交互的類,這兩個使用哪一個均可以,徹底看我的愛好。
  • Mapper:是Mybatis下與數據庫進行交互實現實體類的操做,和repository和dao類似。
  • Service:是在前端Controller和後端Dao層之間進行協調的類,用於接收Controller傳遞過來的信息,並調用Dao層對數據庫進行操做後返回信息給Controller。
  • crud-web:是整個項目中惟一一個和外部網頁交互的模塊。包含Controller,啓動類等。
  • Controller:接收用戶從前端發送的request請求,指定請求的路徑以及返回信息給前臺頁面。
  • pom.xml文件:每一個項目都有本身的pom.xml文件,裏面包含項目和父項目的信息,以及項目所依賴的全部依賴文件,在pom.xml文件中寫入依賴後,項目會自動從本地倉庫中查找須要的jar包,若是沒有則從遠程倉庫中下載後存入本地倉庫,這樣就省去了下載jar包的步驟。
  • application.properties文件:這裏面寫着項目中的全部配置,包括數據庫的鏈接、mybatis的配置,自定義配置項、項目端口等等各類配置。

 

下面開始實現一個簡單的學生的添加 前端

二、建立實體類

在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,因此在進行數據庫操做以前咱們須要進行Mybatis的相關配置以及數據庫的鏈接操做。 mysql

1)查找依賴包

進入https://mvnrepository.com/網站,輸入mybatis查詢mybatis依賴包: jquery

這裏選擇org.mybatis.spring.boot裏的mybatis-spring-boot-starter: web

點擊以後選擇版本,這裏我不習慣選擇太新的也不喜歡太舊的版本,因此通常會在稍微新的版本中選擇用戶數最多的那一個,好比mybatis我選擇2.0.1 ajax

點擊進去以後複製依賴: spring

2)注入依賴並下載jar包

第一步以後,將文本複製到crud-web子項目的pom.xml文件中,在<dependencies>標籤中加入剛纔複製的文本。sql

 此時右下角出現Import changes和Enable auto import,這裏能夠選擇後者,之後修改pom.xml文件後,項目會自動導入jar包。 數據庫

3)鏈接數據庫

首先仍是要經過上面的方法添加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的寫法大同小異。

4)配置mybatis

一樣在application.properties文件配置mybatis的映射文件路徑

mybatis.mapper-locations=classpath:/mapping/*.xml

這句話的意思是mybatis的映射文件存在於classpath(classpath就是生成target目錄後classes文件所在目錄)的mapping目錄下以.xml結尾的文件。

四、編寫Mapper類

1)建立文件

在crud-sys子項目下新建mapper文件夾,其下新建StudentMapper接口:

  • 這裏要注意,在Mapper接口上須要加入@Compent註解,表示這是一個和Bean相似的實體。
  • @Component:泛指組件,當組件很差歸類的時候,咱們可使用這個註解進行標註。

2)編寫函數

Mapper類中主要寫對實體的操做函數的定義,這裏咱們先定義一個添加函數。

添加代碼:public void add(Student student);

五、編寫映射文件Mapping文件

1)建立文件

在resource文件夾下建立mapping文件夾,在其下建立StudentMapping.xml文件。

2)添加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">

3)設置所映射的接口

設置這個xml文件對應的是哪一個接口類中的函數。

添加<mapper>標籤,在標籤中配置namespace爲接口類所在的路徑

4)編寫相應的函數所對應的SQL

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標籤中,同時修改參數,使用#{}中間加上參數的名稱:

六、編寫Service層

1)編寫service接口類

在crud-sys下建立service文件夾,在其下建立StudentService接口類,裏面寫入函數,通常會和Mapper類中的函數類似,可能會返回值不一樣。

2)編寫service實現類

在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及其子文件夾下的文件,若是須要自定義文件夾,則須要在配置文件中配置。

1)建立文件並寫入元素

在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>

 

2)表單驗證

使用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層

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對象也能夠很完美的解決問題。

相關文章
相關標籤/搜索