【日程三】Spring Web + Mybatis + Mysql
一、地圖
上一篇我們通過簡單的Controller Service是實現瞭解了常用的Spring web註解,同時建立了基本的model mapper service controller結構
上一篇我們採用List模擬資料庫的操作,這一篇我們來整合Mybatis與Mysql到Spring專案中,建立真正的資料庫增刪查改
可以用到的資料
Mybatis官方文件 https://mybatis.org/mybatis-3/zh/getting-started.html
Mybatis Spring官方文件 http://mybatis.org/spring/zh/index.html
Mybatis Spring Boot 官方文件
http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/狂神說Mybatis https://www.bilibili.com/video/BV1NE411Q7Nx
二、問題
我該如何實現Mybatis Mysql 與 Spring Boot 的整合 ?如何實現增刪查改?@RequestParam 與無註解引數如何使用?
三、回答
Ⅰ、@RequestParam 與無註解引數
在上篇內容的基礎上增加
我們有了一個新處理方法,它的引數沒有@RequestBody標籤 ,它的路徑是localhost:8080/user/args
我們啟動並測試
成功新增
檢視他的請求體
同時也支援form-data
也支援在url上指定引數
我們再新增一個方法
同樣能新增成功,實際上,這兩種方式原理都是利用請求體中的引數尋找方法引數中相同名字的引數,或者物件中的屬性來進行賦值。
既然如此 @RequestParam 有什麼作用呢?
方法的引數不指定註解就是預設使用了@RequestParam ,而@RequestParam 可以指定更多的屬性
https://blog.csdn.net/sswqzx/article/details/84195043
我們可以利用@RequestParam顯式指定引數對映、 是否必須 、預設值
以下是一個實際使用的例子
Ⅱ、實現Mybatis Mysql 與 Spring Boot 的整合
現在我們引入專案的 Mybatis 與 Mysql依賴
搜尋Mybatis元件
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
搜尋Mysql 包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
將依賴加入pom中
在resources中建立 application.yml 這裡名稱位置是固定的,它是Spring boot 應用的配置檔案
我們來觀察 微人事 專案的配置
這裡 spring.datasource 是關於資料來源的配置,最主要的是 資料庫驅動 使用者名稱 密碼 URL
這裡微人事用到了阿里的德魯伊資料來源,我們不用管
mysql的安裝這裡不再介紹,確保兩點 1.時區設為東八區 2.字符集設為utf-8 具體參考百度
使用mysql 工具 mysql workbench 建立一個數據庫
在application.yml中填寫配置
server:
port: 80
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
password:
url: jdbc:mysql://localhost:3306/mybatis?useSSL=true&characterEncoding=UTF-8
username: root
這裡我的資料庫沒有密碼,所以為空,另外,url的寫法可以參閱mysql url https://blog.csdn.net/cyy356/article/details/90751581
此時spring 就擁有了 一個數據源
編寫UserMapper介面,依照 Mybatis spring boot 官方文件的介紹 簡單的CRUD 可以使用註解開發 http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
package com.bao.mapper;
import com.bao.model.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface UserMapper {
@Select("select * from user")
List<User> getAllUser();
@Select("select * from user where id=#{id}")
User getUserById(int id);
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{password})")
int addUser(User user);
@Update("update user set name=#{name},pwd=#{password} where id=#{id}")
int updateUser(User user);
@Delete("delete from user where id=#{id}")
int deleteUserById(int id);
}
我們來為這個mapper做個測試,但是要做測試,就需要引入測試元件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
放入pom中
新建一個測試類
import com.bao.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest(classes = {com.bao.LearnApp.class})
public class MyTest {
@Autowired
UserMapper userMapper;
@Test
public void t1(){
System.out.println(userMapper.getAllUser());
}
}
執行測試後可以看到結果
這裡會有一個奇怪的發現 ,所有的password 都是null
這是因為資料庫鍵和User物件屬性對不上的原因
我們需要為這一問題自定結果集對映
package com.bao.mapper;
import com.bao.model.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
@Mapper
@Component
public interface UserMapper {
@Select("select * from user")
@Results(id = "UserMap",value = {
@Result(property = "password",column = "pwd")
})
List<User> getAllUser();
@Select("select * from user where id=#{id}")
@ResultMap("UserMap")
User getUserById(int id);
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{password})")
int addUser(User user);
@Update("update user set name=#{name},pwd=#{password} where id=#{id}")
int updateUser(User user);
@Delete("delete from user where id=#{id}")
int deleteUserById(int id);
}
再次執行測試
問題解決,所有使用者都可以查到, Spring boot 與 Mybatis Mysql 成功整合。
sql語句 與 mapper介面 相關的知識可以參閱 Mybatis 官方文件 https://mybatis.org/mybatis-3/zh/sqlmap-xml.html
Ⅲ、實現增刪查改
我們將mapper注入到service層中,並編寫程式碼
package com.bao.service;
import com.bao.mapper.UserMapper;
import com.bao.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
UserMapper userMapper;
public List<User> getAllUser(){
return userMapper.getAllUser();
}
public int addUser(User user){
return userMapper.addUser(user);
}
public User getUserById(int id){
return userMapper.getUserById(id);
}
public int updateUser(User user){
return userMapper.updateUser(user);
}
public int deleteUserById(int id){
return userMapper.deleteUserById(id);
}
}
之後將service層注入controller層中,並編寫程式碼
package com.bao.controller;
import com.bao.model.User;
import com.bao.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
UserService userService;
@GetMapping("/")
public List<User> getAllUser(){
return userService.getAllUser();
}
@GetMapping("/{id}")
public User getUserById(@PathVariable int id){
return userService.getUserById(id);
}
@PostMapping("/")
public int addUser(@RequestBody User user){
return userService.addUser(user);
}
@PutMapping("/")
public int updateUser(@RequestBody User user){
return userService.updateUser(user);
}
@DeleteMapping("/{id}")
public int deleteUser(@PathVariable int id){
return userService.deleteUserById(id);
}
}
啟動我們的專案並進行測試
查詢使用者
新增使用者
修改
刪除
成功實現
技能點
技能點 |
---|
@RequestParam |
spring boot 配置 |
@Mapper |
@Select @Insert @Delete @Update |
@Autowired |
@Service |
@Results @Result @ResultMap |
@Component |