先來寫一些用戶的基礎數據的管理的api。就是用戶的基本的增刪改查。用spring boot可以很容易的寫出這種api

首先新建maven的項目


依賴關系
引入依賴。用最新的spring boot
https://spring.io/projects



https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/

https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/using-spring-boot.html#using-boot-dependency-management
搜索關鍵字maven。找到這里

復制這段

復制到項目里pom.xml內。有了這個依賴。以后在引入各種依賴的時候就不用再去寫版本號了。因為dependencyManagement已經替我們把版本號規定好了。

<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
我們要寫一個web項目來提供http服務。輸入starter-web來搜索

為什么eclipse能顯示effective pom
https://zhidao.baidu.com/question/401757501.html
m4eclipse插件實現的。
獲取maven完整/實際/生效(effective)的pom.xml文件
https://blog.csdn.net/iteye_15147/article/details/82567934
繼續代碼
搜到這個復制下來

拷貝到,dependencies這個標簽里面

然后把版本號去掉

也可以去maven的倉庫去查找starter-web
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
mevn倉庫地址
https://mvnrepository.com/
開始web項目

新建一個包


創建啟動類


新建user包


新加user類

user類里面有兩個屬性id和name

再搜索lombok的包,這里搜索一下

復制到項目,然后去掉版本號

@Data注解等價於加上這些注解。自動為這個pojo(持久化類)類里面的屬性生成getter方法、setter方法、全參數的構造函數、覆蓋Object里面的ToString方法、覆蓋Equals和HashCode方法

使用IDEA的情況
IDEA的話必須按裝一個lombok的插件


點進來進行安裝

安裝插件后,重啟你的編輯器就可以了。這樣就可以使用lombok里面的注解@Data了。

userController


先不寫業務邏輯,先把所有的方法聲明
增刪改查的方法

查一組用戶的方法

了解攻擊
2017年top10的攻擊

第一名是注入攻擊。最常見的是sql注入。
例子演示sql注入攻擊
引入jdbc
sql注入就肯定就需要做jdbc的操作。搜一下 jdbc的庫。

已進入到我們的項目中,

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

配置數據庫相關的參數


現在用的驅動默認是MySql8的。所以下面用的這里的驅動名稱要注意一下。叫做cj.jdbc.Driver 這個是MySql8的新的驅動類的名字

視頻中的鏈接字符串:我用這個鏈接字符串連不上數據庫
jdbc:mysql://localhost:3306/imooc-security?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true
后來網上搜索換成這個:可以成功鏈接到數據庫
jdbc:mysql://localhost:3306/imooc-security?serverTimezone=UTC&characterEncoding=utf8&useSSL=true
spring: application: name: user-api datasource: url: jdbc:mysql://localhost:3306/imooc-security?serverTimezone=UTC&characterEncoding=utf8&useSSL=true username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver
搜索mysql的驅動也加上

最終保留

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
連接數據的時候遇到個問題:
The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone
通過百度解決了,連接字符串加一個serverTimezone=UTC,這是時區的問題。
建數據庫表
就表字段


加幾條測試數據

controller內數據庫查詢
查詢user表,先注入jdbcTemplate


運行程序測試

在http的工具請求,http://localhost:8080/users?name=jojo 傳入一個數據庫內存在的用戶

name不寫是查不到東西


這樣就把系統的所有用戶都查詢到了。這個是sql的注入工具

程序加斷點跟蹤。or 1=1是永遠都滿足的條件。

拼接的sql語句就是:
select id,name from user where name='' or 1=1 or name= ''
首先輸入的參數要做輸入的校驗,寫一個正則表達式去判斷參數 。另外一種是控制數據庫的用戶的權限。
root用戶什么都能干。應該用一個其他的用戶 不能擁有所有數據庫的權限。

用一些比較先進的數據庫操作的庫 例如JPA、 Mybatis。為什么不用Mybaits呢因為也有被sql注入的風險。使用的時候依然要有一些注意的事項。
JPA基本上沒有這個風險。

使用Spring JPA
引入依賴

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
配置文件內加上jpa相關的配置
如果在這個User對象里面加屬性的話,會自動的往數據庫內加字段。如果新建別的對象,那么數據庫就會自動多出來一張表來。就會保持對象和數據庫的同步。開發的時候挺方便的。但是一般生產的時候不要這么用。

在日志里可以看到JPA最終執行的sql

User類加上Entity注解,這樣這個pojo類就和數據庫的表做了綁定。
@Entity是這個包javax.persistence.Entity;下的

加一個@Id的注解直接告訴jpa。id這個屬性書主鍵。

寫一個接口。UserRepository。就是數據操作的對象。用來操作我們的User對象。操作User對象就是操作我們的User表。

繼承這個接口,用來做一些動態的查詢

創建一個基本的增刪改查的接口。Long表示主鍵的類型

繼續Controller代碼
注入Repository


這個方法,我們直接把他聲明在接口內


運行測試

執行結果為空


功能實現了 同時防止了sql注入攻擊來盜取我們數據庫內的數據
日志里面輸出的sql語句

結束
