最新版SpringBoot整合Mybatis,實(shí)現(xiàn)增刪改查(CRUD)

前言

為什么要學(xué)SpringBoot和Mybatis呢,我覺(jué)得作為一個(gè)合格的后端程序員增刪改查(CRUD)肯定是要會(huì)的刺啦,而且是最基本的一項(xiàng)技能留特,不然怎么完成給你分配的需求呢纠脾;而為什么選擇SpringBoot和Mybatis呢,首先選擇SpringBoot是可以理解的蜕青,畢竟作為一款輕量型的框架苟蹈,集成了很多組件和Tomcat服務(wù)器,讓我們的開(kāi)發(fā)更簡(jiǎn)便右核,當(dāng)然最主要的還是因?yàn)椴┲髦粫?huì)SpringBoot ??慧脱。好了開(kāi)個(gè)玩笑,下面說(shuō)為啥用SpringBoot加Mybatis贺喝,因?yàn)槌薓ybatis還有Mybatis-Plus和Hibernate可以選擇菱鸥,而且這兩個(gè)封裝了CRUD方法,都不用自己寫(xiě)sql語(yǔ)句躏鱼,開(kāi)發(fā)起來(lái)更加快捷氮采;而Mybatis則是要自己編寫(xiě)sql語(yǔ)句的,對(duì)于當(dāng)時(shí)的我來(lái)說(shuō)我覺(jué)得還是學(xué)的基礎(chǔ)點(diǎn)染苛,畢竟后面這兩個(gè)可以用來(lái)進(jìn)階鹊漠,也學(xué)起來(lái)畢竟簡(jiǎn)單,所以讓我們開(kāi)始用SpringBoot整合Mybatis吧茶行!

第一:創(chuàng)建MySQL數(shù)據(jù)庫(kù)

首先我們應(yīng)該先創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)躯概,用于操作我們CRUD的數(shù)據(jù)(可以使用可視化工具進(jìn)行創(chuàng)建,也可以使用SQL命令進(jìn)行創(chuàng)建)畔师,數(shù)據(jù)庫(kù)的名字可以自己定義娶靡,創(chuàng)建完數(shù)據(jù)庫(kù)之后,我們就要?jiǎng)?chuàng)建表進(jìn)行數(shù)據(jù)的存儲(chǔ)了看锉,表的名字叫’ user ‘表固蛾,字段可以自己設(shè)置结执,只要和后邊自己創(chuàng)建的實(shí)體對(duì)應(yīng)就好了。


截屏2023-03-24 14.01.31.png
CREATE TABLE `user` (
  `userId` bigint NOT NULL AUTO_INCREMENT,
  `userName` varchar(255) COLLATE utf8mb4_bin NOT NULL,
  `userAddress` varchar(255) COLLATE utf8mb4_bin NOT NULL,
  PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

第二:創(chuàng)建SpringBoot項(xiàng)目艾凯,引入需要的依賴包

用IDEA創(chuàng)建SpringBoot項(xiàng)目:
1献幔、選擇Spring Initializr創(chuàng)建,然后JDK選擇1.8趾诗,Java8版本蜡感。
2、初始化組件選擇Spring Web恃泪、JDBC API郑兴、Mybatis Framework、MySQL Driver贝乎,Lombok也可以選擇一下情连,可能會(huì)用到。
3览效、選擇好了之后點(diǎn)擊Finish創(chuàng)建就好了却舀。
4、創(chuàng)建好了SpringBoot之后看看自己的Maven有沒(méi)用配置好锤灿,如果沒(méi)有配置好去查詢?nèi)绾闻渲肕aven挽拔,不然你的pom依賴是加載不了的,就下載一下Maven但校,如何換個(gè)阿里源鏡像地址和本地倉(cāng)庫(kù)螃诅,然后IDEA選擇一下Maven的xml文件和本地倉(cāng)庫(kù)地址就好了,不過(guò)我覺(jué)得能搜索這篇文章的朋友這些基礎(chǔ)的東西應(yīng)該是配置好了的状囱。


截屏2023-03-24 14.05.09.png
截屏2023-03-24 14.05.24.png
截屏2023-03-24 14.05.39.png
截屏2023-03-24 14.05.55.png

以上是所需要的依賴包术裸,如果忘記引入的,可以直接添加即可亭枷,不用再重新創(chuàng)建項(xiàng)目了

!--web相關(guān)-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--mybatis相關(guān)-->
    <dependency><!--boot整合mybatis所需要的包-->
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.0.0</version>
    </dependency>
    <!--mysql相關(guān)-->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.0.31</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>

    <dependency><!--lombok注解-->
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

第三:創(chuàng)建程序目錄和配置核心application.xml文件

首先需要?jiǎng)?chuàng)建四個(gè)文件夾袭艺,分別是:Entity(用戶實(shí)體)、Controller奶栖、Service匹表、Dao,然后還需要在 resource 目錄下新建 Mapper 目錄宣鄙,這個(gè) Mapper 目錄是用來(lái)存放 SQL 語(yǔ)句的地方袍镀。到這里我覺(jué)得需要理解一下MVC模式,由于我們的訪問(wèn)一層調(diào)用一層冻晤,然后查詢到數(shù)據(jù)之后再返回過(guò)去的苇羡,所以我們的層級(jí)應(yīng)該是:Controller(控制層,也是接收前端傳遞參數(shù)的層) -> Service(業(yè)務(wù)層鼻弧,我們所有的業(yè)務(wù)设江,如判斷和一些循環(huán)語(yǔ)句就需要寫(xiě)到這個(gè)層當(dāng)中) -> Dao(持久層锦茁,這個(gè)層主要是和數(shù)據(jù)庫(kù)打交道的,主要負(fù)責(zé)數(shù)據(jù)的操作叉存,也就是CRUD操作) -> 數(shù)據(jù)庫(kù)码俩,如下圖所示:


截屏2023-03-24 14.07.47.png

沒(méi)有啥好的畫(huà)圖工具,就隨便畫(huà)了一下歼捏,反正數(shù)據(jù)的流向就是這樣的稿存,大家可以湊合看一下。


截屏2023-03-24 14.08.52.png

在resources文件夾下創(chuàng)建yml文件瞳秽,并輸入如下內(nèi)容:
server:
  port: 8080    //本機(jī)的端口號(hào)

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/自己數(shù)據(jù)庫(kù)的名稱?useUnicode=true & characterEncoding=utf-8 &
      useSSL=true & serverTimezone=Asia/Shanghai
    username: root      //數(shù)據(jù)庫(kù)的用戶名  
    password: xxxxxx    //數(shù)據(jù)庫(kù)的密碼

mybatis:
  mapper-locations: classpath:/Mapper/*.xml   
  type-aliases-package: com.example.test.Entity    //這個(gè)是掃描到Entity實(shí)體包的路徑瓣履,可根據(jù)自己的配置
截屏2023-03-24 14.10.39.png

配置好yml文件之后,我們?nèi)タ从覀?cè)的Databases去看看能不能連接自己本地的MySQL數(shù)據(jù)庫(kù):


截屏2023-03-24 14.11.38.png

截屏2023-03-24 14.12.24.png

依次分別填练俐,數(shù)據(jù)表名字(這里我們的表是user表)袖迎,用戶名和密碼、還有數(shù)據(jù)庫(kù)名

第四:依次編寫(xiě)Entity腺晾、Dao燕锥、Service、Controller層丘喻,還有創(chuàng)建mapper.xml文件

Entity包:創(chuàng)建一個(gè)UserEntity類脯宿,內(nèi)容如下:

public class UserEntity {
    private Integer userId;
    private String userName;
    private String userAddress;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }
}

Dao包:創(chuàng)建一個(gè)UserDao接口念颈,內(nèi)容如下:

import com.example.test.Entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserDao {
     List<UserEntity> queryLimit(Integer currentPage, Integer pageSize);

     Integer addUser(UserEntity user);

     Integer updateUser(UserEntity user);

     Integer deleteUser(UserEntity user);
}

Service包:創(chuàng)建一個(gè)UserService類泉粉,內(nèi)容如下:

import com.example.test.Dao.UserDao;
import com.example.test.Entity.UserEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("UserService")
public class UserService {
    @Autowired
    private UserDao userDao;

    public List<UserEntity> queryLimit(Integer currentPage,Integer pageSzie){
        return userDao.queryLimit(currentPage,pageSzie);
    }

    public Integer addUser(UserEntity user){
        return userDao.addUser(user);
    }

    public Integer updateUser(UserEntity user){
        return userDao.updateUser(user);
    }

    public Integer deleteUser(UserEntity user){
        return userDao.deleteUser(user);
    }
}

Controller包:創(chuàng)建一個(gè)UserController類,內(nèi)容為:

import com.example.test.Entity.UserEntity;
import com.example.test.Service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private UserService userService;

    String message = "";
    @RequestMapping("/queryLimit")
    public List<UserEntity> queryLimit(@RequestParam("currentPage") Integer currentPage,@RequestParam("pageSize") Integer pageSize){
        return userService.queryLimit(currentPage,pageSize);
    }

    @PostMapping("/addUser")
    public String addUer(@RequestBody UserEntity user){
        //用Mybatis執(zhí)行insert語(yǔ)句的時(shí)候榴芳,插入成功會(huì)返回1嗡靡,不成功則會(huì)拋出異常,捕獲一下異常就好
        try {
            userService.addUser(user);
            message = "增加用戶成功";
        }catch (Exception exception){
            message = "增加用戶異常";
        }
        return message;
    }

    @PutMapping("/updateUser")
    public String updateUser(@RequestBody UserEntity user){
        //Mybatis的更新操作成功返回1窟感,用戶不存在返回0讨彼,失敗則拋異常
        try {
            message = userService.updateUser(user) == 1?"更新用戶成功":"用戶不存在,更新失敗";
        }catch (Exception exception){
            message = "更新異常";
        }
        return message;
    }

    @DeleteMapping("/deleteUser")
    public String deleteUser(@RequestBody UserEntity user){
        //Mybatis的刪除操作和更新返回值一樣柿祈,成功返回1哈误,用戶不存在返回0,失敗則拋異常
        try {
            message = userService.deleteUser(user) == 1?"刪除用戶成功":"用戶不存在躏嚎,刪除失敗";
        }catch (Exception exception){
            message = "刪除異常";
        }
        return message;
    }
}

編寫(xiě)完上面的內(nèi)容之后我們需要在Mapper文件夾下創(chuàng)建mapper.xml文件蜜自,如下圖:


截屏2023-03-24 14.15.16.png

mapper.xml文件內(nèi)容如下:需要注意的地方是namespace:這個(gè)路徑是你的UserDao接口的路徑,因?yàn)槟銈鬟^(guò)來(lái)的數(shù)據(jù)需要和xml進(jìn)行一個(gè)綁定卢佣,這樣你編寫(xiě)的SQL語(yǔ)句才能接收到你前端傳過(guò)來(lái)的數(shù)據(jù)(大體意思可以這么理解)重荠,而id則是和你UserDao中的接口方法相對(duì)應(yīng),比如我的UserDao接口中的查找方法命名是queryLimit虚茶,那么我在xml文件中的查詢語(yǔ)句的id就應(yīng)該和queryLimit想對(duì)應(yīng)戈鲁,即:id=“queryLimit”仇参。
resultType是返回?cái)?shù)據(jù)的類型
parameterType則是傳入的數(shù)據(jù)類型
具體這些細(xì)節(jié)就不贅述了,只寫(xiě)實(shí)現(xiàn)的功能婆殿,想了解的小伙伴可以去看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">
<mapper namespace="com.example.test.Dao.UserDao">
    <select id="queryLimit" resultType="UserEntity">
        select * from user limit #{currentPage},#{pageSize};
    </select>

    <insert id="addUser" parameterType="UserEntity">
        insert into user(userName,userAddress) values(#{userName},#{userAddress});
    </insert>

    <update id="updateUser" parameterType="UserEntity">
        update user set userName=#{userName},userAddress=#{userAddress} where userId=#{userId};
    </update>

    <delete id="deleteUser" parameterType="UserEntity">
        delete from user where userId=#{userId};
    </delete>
</mapper>

最后我們需要在啟動(dòng)類加一點(diǎn)東西(MapperScan掃描的是我們Dao包的地址诈乒,填寫(xiě)自己的就好)


截屏2023-03-24 14.16.42.png

第五:測(cè)試結(jié)果(這里我用的postman來(lái)進(jìn)行接口測(cè)試)

查詢用戶數(shù)據(jù)->地址為:http://localhost:8080/user/queryLimit?currentPage=0&pageSize=5

截屏2023-03-24 14.17.32.png

添加用戶數(shù)據(jù)-> 地址為:http://localhost:8080/user/addUser
截屏2023-03-24 14.17.57.png

截屏2023-03-24 14.18.14.png

更新用戶數(shù)據(jù)-> 地址為:http://localhost:8080/user/updateUser

截屏2023-03-24 14.19.22.png

更新之后數(shù)據(jù)庫(kù)數(shù)據(jù)為:
截屏2023-03-24 14.19.52.png

刪除用戶數(shù)據(jù)-> 地址為:http://localhost:8080/user/deleteUser
截屏2023-03-24 14.20.31.png

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市婆芦,隨后出現(xiàn)的幾起案子抓谴,更是在濱河造成了極大的恐慌,老刑警劉巖寞缝,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癌压,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荆陆,警方通過(guò)查閱死者的電腦和手機(jī)滩届,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)被啼,“玉大人帜消,你說(shuō)我怎么就攤上這事∨ㄌ澹” “怎么了泡挺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)命浴。 經(jīng)常有香客問(wèn)我娄猫,道長(zhǎng),這世上最難降的妖魔是什么生闲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任媳溺,我火速辦了婚禮,結(jié)果婚禮上碍讯,老公的妹妹穿的比我還像新娘悬蔽。我一直安慰自己,他們只是感情好捉兴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布蝎困。 她就那樣靜靜地躺著,像睡著了一般倍啥。 火紅的嫁衣襯著肌膚如雪禾乘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天逗栽,我揣著相機(jī)與錄音盖袭,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鳄虱,可吹牛的內(nèi)容都是我干的弟塞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拙已,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼决记!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起倍踪,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤系宫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后建车,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體扩借,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年缤至,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了潮罪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡领斥,死狀恐怖嫉到,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情月洛,我是刑警寧澤何恶,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站嚼黔,受9級(jí)特大地震影響细层,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隔崎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一今艺、第九天 我趴在偏房一處隱蔽的房頂上張望韵丑。 院中可真熱鬧爵卒,春花似錦、人聲如沸撵彻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)陌僵。三九已至轴合,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碗短,已是汗流浹背受葛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人总滩。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓纲堵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親闰渔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子席函,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容