前言
為什么要學(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)就好了。
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)該是配置好了的状囱。
以上是所需要的依賴包术裸,如果忘記引入的,可以直接添加即可亭枷,不用再重新創(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ù)码俩,如下圖所示:
沒(méi)有啥好的畫(huà)圖工具,就隨便畫(huà)了一下歼捏,反正數(shù)據(jù)的流向就是這樣的稿存,大家可以湊合看一下。
在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ù)自己的配置
配置好yml文件之后,我們?nèi)タ从覀?cè)的Databases去看看能不能連接自己本地的MySQL數(shù)據(jù)庫(kù):
依次分別填练俐,數(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文件蜜自,如下圖:
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ě)自己的就好)
第五:測(cè)試結(jié)果(這里我用的postman來(lái)進(jìn)行接口測(cè)試)
查詢用戶數(shù)據(jù)->地址為:http://localhost:8080/user/queryLimit?currentPage=0&pageSize=5
添加用戶數(shù)據(jù)-> 地址為:http://localhost:8080/user/addUser
更新用戶數(shù)據(jù)-> 地址為:http://localhost:8080/user/updateUser
更新之后數(shù)據(jù)庫(kù)數(shù)據(jù)為:
刪除用戶數(shù)據(jù)-> 地址為:http://localhost:8080/user/deleteUser