一、Mybatis是啥?
就是一個用java來操控數據庫的框架語言
之前學的datagrip或者navicat這些軟件里我們操作數據庫,原理是我們編寫完的操作語句發送到服務器傳送到數據庫系統,然后數據庫執行完之后再發送給服務器返回給datagrip或者navicat顯示
那么Mybatis的邏輯也是一樣,只不過是變成從java發送給服務器再到數據庫,然后數據庫返回給服務器返回給java
二、配置Mabatis項目
提示:新建Spring Initializr模塊可以把【服務器 URL】換成阿里云的:http://start.aliyun.com
因為原URL是訪問spring.io官網去下載安裝項目,而阿里云的服務器下載安裝會更快
這里下面是重復我之前在配置sprintboot項目時的步驟,可以參考我這篇文章:
后端之路第二站(正片)——SprintBoot-CSDN博客
點擊【創建】(或者finish就配置完了)
(小插曲:遇到下面這種情況的同志請注意)
這特么是我腦殘...創建sprint boot的模塊時沒有選基于【Maven】,選了特么的【Gradle】,不小心的我自己都沒發現,塔瑪得耗費老子一整上午找問題,記住了老鐵,選【Maven】!!!
配置完之后,我看的黑馬里的idea是老版本,所以如果是老版本配置完會有以下文件,刪掉即可
那新的idea應該是像我這樣,我啥也不敢刪,但是這兩個應該是沒用的可以刪
最后確認一下:你這個模塊必須是在整個大項目的主目錄下
然后點開模塊的【src】目錄下的pom.xml文件就能看到這些依賴的配置是否齊全了
三、開始嘗試連接數據庫
1、創建一個裝Java的數據庫表的目錄
首先在【模塊】的—>【src】—>【main】—>【java】—>【com.xxx】目錄下創建目錄,用來裝所有的數據庫表
然后在這個目錄里創建一個表
但是!!!這里我這個屌雞掰軟件他麻的又給老子發塔瑪得神經,右鍵居然不能新建class類,我真特么的服了(如下圖)
還好身邊有后端大神,看了一眼之后就跟我說這個項目的樣子不對勁!顏sai不對!
不愧是老中醫,他給我看正確的顏色應該是這樣
老中醫說雖然不知道為何這位“病人”病狀這么奇怪,但是不要緊,一套老中醫失傳老手法來拯救!!
點擊【文件】—>【項目結構】
然后點擊【src】的【main】的【java】,點擊上面的【源代碼】,然后應用、確定
同理,resources也是點擊【src】的【main】的【resources】,點擊上面的【資源】,然后應用、確定
同理,test是點擊【test】的【java】,點擊上面的【測試】,然后應用、確定
大功告成,美極了,看得我都受不了了,太棒了,能右鍵直接新建java類簡直太舒服了,好爽,快爽死了,爽啊好爽啊,不愧是后端老中醫,傳統的老手法直接讓病人起死回生,直接讓我爽噴
那么現在就直接新建一個java類,起名的時候【包名.類名】能自動創建一個包,在包目錄下創建這個java類
2、創建數據庫表、實體類
java里創建數據庫表其實就是寫一個標準【JavaBean類】,你對比數據庫的的性質都知道是差不多的了,都是定義多個字段、并定義它們的數據類型,只不過java還可以寫方法函數,廢話不多說,先直接建一個User類
(沒有java基礎的自己上網查,這里不闡述)
這里只提一下:數據庫中這幾個數據類型
int? ?在java對應? ?Integer
varchar( )? ?在java對應? ?String
tinyint?? 在java對應? ?Short
3、在數據庫工具創建一個數據庫和表先
這里不過多講解,會的可以直接跳過,就是創建一個庫、一個表,而且為了節約時間我只做可視化操作,想用代碼建庫建表的自己一邊呆著去(另外,我這里用的是datagrip)
先創建一個數據庫,就叫Mybatis吧
然后建表,就叫User表吧
有如下字段,以及數據類型
然后!!記住你這個數據庫的四要素!!!為了連接數據庫用的
右鍵數據庫,看屬性
第一要素:驅動類名在這,點【轉到驅動程序】,然后就能看到
第二要素,url在這,原本的應該是【jdbc:mmysql://localhost:3306】,但是后面連接的時候記得在后面加上【/你的數據庫名字】,這樣一來就會直接連接到你的這個數據庫,而不是連接一整個數據源
至于用戶名還能看到,密碼就沒人知道了,你要是創建數據庫的時候忘了......那就卸載了數據庫重裝吧,不然誰都不知道你的密碼
4、連接數據庫
現在就到連接數據庫了,點到【src】的【main】的【resources】的【application.properties】
然后這又塔瑪得什么鬼啊?????槽泥馬的沒完了
冷靜片刻,點擊【設置】
然后點【編輯器】的【文件編碼】,英文對應【Editor】的【File Encodings】
然后把這三都換成【UTF-8】!!!
正常了!!好爽!!好舒服啊!!!爽!!!!
好,現在刪掉這些狗屎,寫上我們的【連接數據庫4要素】:
#連接數據庫的【四要素】
#這是我的,你們別找抄
#1、數據庫的驅動類名
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver#2、數據庫的Url
spring.datasource.url = jdbc:mysql://localhost:3306/mybatis#3、數據庫的賬戶名
spring.datasource.username = r**t#4、數據庫的密碼
spring.datasource.password = 1***6
這就是上面第3點要你們記住的數據庫四要素
5、編寫SQL語句(利用注解/XML)
首先創建一個包裝操作sql語句的接口,還是直接在寫接口的時候用【包名.接口名】方便
然后先寫一個注解【@Mapper】,它標識了:在運行時會自動生成實現這個接口的實現對象,并將這個對象交給IOC容器管理
然后再在接口里定義一個抽象方法list(),返回值就是一個集合,作用就是用一個集合封裝所有User
還得在這個方法上加一個注解:【@Select("SQL語句")】,這個注解就可以指定要執行什么sql語句
這里注意:我么們之前學java時,接口里的這種沒有方法體的方法是抽象方法,要實現接口類里再次重寫這個方法才可以用,但這里不是!!這里有了【@Select("SQL語句")】注解,他就是一個可以“干事”的完整方法了,它的返回值就是執行完sql語句的結果!!!可以直接調用,不用重寫!!!
(各位先不用深究到底為什么,老實說我學起來也是一知半解迷迷糊糊的)
(另外,注解爆紅的,再檢查這幾個問題:1、鼠標懸停,看看能不能導入包,比如List的包沒導入? ? ?2、檢查你當前是不是在spring boot的項目中? ?3、檢查你是不是Maven項目管理下,如果2、3都不是,直接刪了項目重新搭建一次試試)
import com.czm.mybatis01.table.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper //在運行時會自動生成實現這個接口的實現對象,并將這個對象交給IOC容器管理
public interface UsrMapper {//這就是你要執行的sql語句@Select("select * from user")//查詢數據庫User表所有信息public List<User> list();//直接在接口里定義一個抽象方法list(),返回值就是一個集合,也就是用一個集合封裝所有User
}
然后再直接在【test】包里的【java】的【com.xxx...】目錄下的【模塊名ApplicationnTests.java】文件,運行測試爽一下!!
那么看初始代碼里有一個@SpringBootTes注解,這個就是說明這里可以整合springboot的單元測試
你就理解為之前學java時你寫了那么多個JavaBean實體類,就可以在這測試類public static void main(String[] args)這里運行它們的方法(只是方便各位理解)
然后在里面再用一個@Test注解就可以寫方法,去運行外面那些接口、類的方法爽一下了
但是我們學java時學過,接口的方法是不能直接調用重寫的,只有接口的實現類(public class 實現類?implements 接口)才能重寫調用接口的抽象方法
但是我們之前寫那個接口時有一個@Mapper注解,一旦有它,就會自動生成一個接口實現對象,并放到IOC容器
那就只用加一個注入依賴的注解就可以用了
這講得什么亂七八糟的屌東西
不知道的先死去看前面spring boot的《分層解耦》里的“控制反轉”和“依賴注入”的內容去,我也有寫:后端之路第二站(正片)——SprintBoot之:分層解耦_后端分層-CSDN博客? ? ? ? ? ? ??
簡單說就是:我這個文章的意思 “控制反轉” 就是只要給一個接口實現類加上【@Component】這個注解,他就會流向IOC容器被管理
然后 “依賴注入” 就是:誰要用它就用【@Autowired】這個注解,然后就可直接創建這個接口實現類的實例對象,然后調用對象的方法......
那么【@Component】是用與接口實現類的,而我們這里【@Mapper】這個注解直接是用在接口的,都不用再寫接口實現類了,直接自動生成了一個它的接口實現類
那么直接再加一個【@Autowired】注解,就可以創建這個接口實現類的實例對象,然后調用對象的方法就行了!
import com.czm.mybatis01.mapper.UsrMapper;
import com.czm.mybatis01.table.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest //springboot整合單元測試的注解
class Mybatis01ApplicationTests {//使用@Autowired注解可以【依賴注入】,直接創建UserMapper接口的實例化對象//可以理解為跳過了【創建實現接口類】這一步,spring boot幫我們創建好了一個@Autowiredprivate UsrMapper userMapper;@Testpublic void testUserMapper(){//在這里調用UserMapper接口的抽象方法:list()List<User> userList = userMapper.list();//然后把list()執行完sql語句的結果返回值循環輸出,這里用的是stream流的方法userList.stream().forEach(user -> {System.out.println(user);});}
}
這里解釋一下stream流,我也是今天看黑馬視頻第一次看到,了解了一下這還是一個蠻吊的方法
舉個例子:現在有下圖這么一個集合,要獲得一個既姓張又是長度為3的名字集合,要先把姓張的過濾存到新集合,再過濾長度為3的到一個新集合,再輸出
那么用stream流可以直接根據條件、疊加、一次性執行完三次操作
語法就是【集合.stream().方法1().方法2().方法3().方法4()......】
然后.filter(變量 -> 變量.條件()):根據條件過濾留下
.forEach(變量 -> 干啥):循環
最后!!!我們運行試一下
這里又發現了大量瘋狂恐怖要人命要死人的刺眼的紅色報錯,幾萬行的報錯,我都他嗎的無奈了
檢查這幾點:
1、連接的四要素配置錯了沒,錯一點都不行
2、表名字一樣不,java里User類的成員跟數據庫的user表的字段能對應上不?
3、最后啥都沒問題的話!!!重要!!!我不說你到死都不會知道是為什么,不信你就耗著
去數據庫的控制臺執行這一個語句:
SET GLOBAL time_zone = '+00:00';
然后就正常了
你就學這個b后端吧,一學一個不吱聲