戳我抵達前端
項目描述:用Vscode創建Spring Boot+mybatis項目,用maven進行管理。創建一個User表,對其內容進行表的基本操作(增刪改查),顯示在前端。
項目地址:戳我一鍵下載項目
運行效果如下:
項目目錄:
核心代碼講解:
1.UserController.java
package improv1.improv1;
import improv1.improv1.MybatisConnect.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.springframework.web.bind.annotation.*;import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/user")
public class UserController {// 新增用戶@PostMapping("/add")public Map<String, Object> addUser(@RequestParam String name, @RequestParam String email) {Map<String, Object> result = new HashMap<>();if (name == null || email == null) {result.put("error", "參數不足,需提供 name 和 email");return result;}try (SqlSession session = MyBatisUtil.getSqlSession()) {UserMapper mapper = session.getMapper(UserMapper.class);Map<String, Object> params = new HashMap<>();params.put("name", name);params.put("email", email);params.put("createTime", LocalDateTime.now());int rows = mapper.insertUser(params);session.commit();result.put("message", "新增成功");result.put("rows", rows);result.put("id", params.get("id"));} catch (Exception e) {result.put("error", e.getMessage());}return result;}// 查詢所有用戶@GetMapping("/list")public List<Map<String, Object>> getAllUsers() {try (SqlSession session = MyBatisUtil.getSqlSession()) {UserMapper mapper = session.getMapper(UserMapper.class);return mapper.getAllUsers();}}// 更新用戶@PostMapping("/update")public Map<String, Object> updateUser(@RequestParam Integer id,@RequestParam String name,@RequestParam String email) {Map<String, Object> result = new HashMap<>();if (id == null || name == null || email == null) {result.put("error", "參數不足,需提供 id、name、email");return result;}try (SqlSession session = MyBatisUtil.getSqlSession()) {UserMapper mapper = session.getMapper(UserMapper.class);Map<String, Object> params = new HashMap<>();params.put("id", id);params.put("name", name);params.put("email", email);int rows = mapper.updateUser(params);session.commit();result.put("message", "更新成功");result.put("rows", rows);} catch (Exception e) {result.put("error", e.getMessage());}return result;}// 刪除用戶@PostMapping("/delete")public Map<String, Object> deleteUser(@RequestParam Integer id) {Map<String, Object> result = new HashMap<>();if (id == null) {result.put("error", "請提供要刪除的用戶ID");return result;}try (SqlSession session = MyBatisUtil.getSqlSession()) {UserMapper mapper = session.getMapper(UserMapper.class);int rows = mapper.deleteUser(id);session.commit();result.put("message", "刪除成功");result.put("rows", rows);} catch (Exception e) {result.put("error", e.getMessage());}return result;}
}
解析:
操作數據庫表一般把對一張表的操作寫在一個文件里。
Spring Boot項目把文件寫成controller,默認會部署到tomcat,可以通過htttp://localhost:8080/映射地址來訪問。這里的映射地址是由前綴+映射子地址組成的,在這里若要查詢表映射地址為/user/list。若要刪除表,完整的地址是htttp://localhost:8080/user/delete剩下的以此類推。
2.mybatis框架應用部分
如果要在spring Boot項目里用mybatis框架管理表,首先,要在resources目錄下建立mapper文件夾,在里面編寫,數據庫表對應的mapper.xml文件。可以在resouces根目錄下編寫mybatis-config.xml文件。
當然,最好不要編寫mybatis-config文件,在application.properties里填寫相關數據庫信息進行統一管理比較好。接著,在pom.xml文件里加入Spring Boot和mybatis以及數據庫相關依賴。
最后,在項目里編寫mapper.xml對應的操作數據庫表接口文件,對表進行操作。
一般要添加的pom.xml內容如下:
<!-- Spring boot配置mybatis -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.4</version></dependency><!-- 配置mysql數據庫--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency><!-- 配置spring boot--></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
1)UserMapper.xml
<?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="improv1.improv1.UserMapper"><!-- 插入用戶 --><insert id="insertUser" parameterType="map">INSERT INTO user(name, email, create_time)VALUES(#{name}, #{email}, #{createTime})</insert><!-- 刪除用戶 --><delete id="deleteUser" parameterType="int">DELETE FROM user WHERE id = #{id}</delete><!-- 更新用戶 --><update id="updateUser" parameterType="map">UPDATE user SETname = #{name},email = #{email}WHERE id = #{id}</update><!-- 查詢所有用戶 --><select id="getAllUsers" resultType="map">SELECT id, name, email, create_time as createTimeFROM user</select>
</mapper>
解析:
? 其中INSERT INTO user(name, email, create_time)
? ? ? ? VALUES(#{name}, #{email}, #{createTime})這里的user(屬性)和values(#{屬性}),要保持一致。id與mapper.xml對應的操作類方法名對應一致
2)UserMapper.java
package improv1.improv1;
import java.util.List;
import java.util.Map;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("improv1.improv1")
public interface UserMapper {// 使用Map作為參數int insertUser(Map<String, Object> params);int deleteUser(int id);int updateUser(Map<String, Object> params);List<Map<String, Object>> getAllUsers();
}
解析:
1.這里的MapperScan的作用是用于自動掃描和注冊 MyBatis 的 Mapper 接口。如果不配置,可能就會報錯找不到mapper。
2.這里的getAllUsers返回的結果要進行接受顯示,所以我們把返回類型用List數組來接收,每一個元素都是鍵值對的形式對應數據庫表里的每一行數據。
3)application.properties
spring.application.name=improv1
# 數據庫連接配置
spring.datasource.url=jdbc:mysql://localhost:3306/mybaitistest?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# MyBatis 配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=improv1.improv1 # 你的實體類包名
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
解析:
mybatis.type-aliases-package=improv1.improv1 這里配置的就是操作數據庫表的類所在包的位置。
3.CorsConfig.java
package improv1.improv1;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class CorsConfig {@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*").allowedMethods("*").allowedHeaders("*").allowCredentials(true);}};}
}
解析:
這段代碼是一個Spring Boot的CORS(跨域資源共享)配置類,用于全局配置跨域請求。主要功能包括:
- 允許所有路徑(
/**
)的跨域請求- 允許所有來源(
allowedOriginPatterns("*")
)- 允許所有HTTP方法(
allowedMethods("*")
)- 允許所有請求頭(
allowedHeaders("*")
)- 允許攜帶憑證(
allowCredentials(true)
)如果不寫,就可能會引發瀏覽器訪問受阻,訪問失敗報200錯誤。其實這些配置也可以寫在application.properties里面,但是這樣這種方式只適用于簡單場景,且部分老版本 Spring Boot 可能不支持。如果你需要更細粒度的控制(如只允許部分接口、部分域名),還是建議使用?Java 配置類。
擴展:
1.postMapper和getMapper的區別
定義與用途?postMapper通常指代處理HTTP POST請求的映射器,用于接收客戶端提交的數據(如表單、JSON等),適用于數據修改或新增操作。getMapper則對應HTTP GET請求的映射器,用于獲取資源,適合數據查詢場景。
數據傳遞方式?postMapper通過請求體(body)傳輸數據,數據在HTTP包體中,適合傳輸大量或敏感信息。getMapper通過URL參數傳遞數據,數據附加在URL后,長度受限且可見。
安全性?postMapper相對更安全,數據不直接暴露在URL中,適合密碼等敏感信息。getMapper參數明文顯示在URL,可能被日志或瀏覽器歷史記錄留存。
冪等性?getMapper具有冪等性,多次執行同一請求不會改變資源狀態。postMapper通常是非冪等的,重復提交可能導致多次資源變更。
2.@RequestMapping("/user")是什么怎么用
@RequestMapping("/user")是什么怎么用
作用與含義
- 路徑映射:將特定 URL 路徑(如?
/user
)與控制器(Controller)類或方法綁定。 - 請求處理:當客戶端請求匹配該路徑時,Spring 會調用對應的控制器方法處理請求。
使用方法
類級別注解
標注在控制器類上,定義該控制器所有方法的公共路徑前綴:
@Controller
@RequestMapping("/user")
public class UserController {// 方法實際路徑為 /user/profile@RequestMapping("/profile")public String profile() {return "profile";}
}
方法級別注解
標注在具體方法上,定義獨立路徑:
@Controller
public class UserController {// 直接響應 /login 路徑@RequestMapping("/login")public String login() {return "login";}
}
組合使用
類注解定義前綴,方法注解補充子路徑:
@RestController
@RequestMapping("/api/user")
public class UserApiController {// 完整路徑為 /api/user/info@GetMapping("/info")public UserInfo getInfo() {return userService.getInfo();}
}
支持的屬性
可通過額外屬性進一步定義請求匹配規則:
@RequestMapping(value = "/create",method = RequestMethod.POST,consumes = "application/json",produces = "application/json"
)
常見派生注解
@GetMapping
:等價于?@RequestMapping(method = RequestMethod.GET)
@PostMapping
:等價于?@RequestMapping(method = RequestMethod.POST)
@PutMapping
/@DeleteMapping
?等同理
該注解是 Spring Web 開發的核心配置方式,合理使用可實現清晰的 URL 路由結構。
3.mapper.xml中的id是怎么用的
id 的作用
在 MyBatis 的映射文件(XML 文件)中,id
?是?<insert>
?標簽的一個屬性,用于唯一標識該 SQL 語句。id
?的主要作用是讓 MyBatis 能夠通過它找到對應的 SQL 語句并執行。
id 的用途
id
?與 Mapper 接口中的方法名一一對應。例如,如果 Mapper 接口中有一個方法名為?insertUser
,那么在映射文件中,<insert>
?標簽的?id
?也必須是?insertUser
,這樣才能正確關聯接口方法與 SQL 語句。
使用方法
-
定義 Mapper 接口
在 Mapper 接口中聲明一個方法,方法名與映射文件中的?id
?一致。public interface UserMapper {int insertUser(User user); }
-
在映射文件中配置 SQL
映射文件中的?<insert>
?標簽的?id
?必須與接口方法名相同。<insert id="insertUser" parameterType="map">INSERT INTO user(name, email, create_time)VALUES(#{name}, #{email}, #{createTime}) </insert>
-
調用方法
通過 MyBatis 的 SqlSession 或 Mapper 代理對象調用接口方法,MyBatis 會根據?id
?找到對應的 SQL 并執行。UserMapper userMapper = sqlSession.getMapper(UserMapper.class); Map<String, Object> params = new HashMap<>(); params.put("name", "John"); params.put("email", "john@example.com"); params.put("createTime", new Date()); userMapper.insertUser(params);
注意事項
id
?必須在同一個命名空間(namespace)內唯一,不能重復。id
?的值應與 Mapper 接口中的方法名嚴格匹配,否則會導致 MyBatis 無法找到對應的 SQL 語句。- 如果使用注解方式(如?
@Insert
),則無需在 XML 中配置?id
,但方法名仍需與 SQL 邏輯對應。