前言
在現代 Java Web 開發中,Spring Boot 和 MyBatis 是兩個非常流行的技術框架。它們的結合使得數據庫操作變得更加簡潔和高效。本文將詳細介紹如何在 Spring Boot 項目中使用 MyBatis 的 XML 文件來編寫 SQL 語句,包括配置、代碼結構、SQL 編寫技巧以及最佳實踐等內容。
一、什么是 MyBatis?
MyBatis 是一個基于 Java 的持久層框架,它允許開發者通過 XML 或注解方式編寫 SQL,并與 Java 對象進行映射(ORM)。相比 Hibernate 等全自動 ORM 框架,MyBatis 更加靈活,適用于需要對 SQL 進行精細控制的場景。
二、Spring Boot + MyBatis 的基本架構
典型的 Spring Boot + MyBatis 項目結構如下:
src
└── main├── java│ └── com.example.demo│ ├── DemoApplication.java│ ├── controller│ ├── service│ ├── mapper│ └── model└── resources├── application.properties└── mapper└── UserMapper.xml
其中 mapper
包下的接口與 resources/mapper
下的 XML 文件是一一對應的。
?? 三、搭建環境
1. 添加依賴(Maven)
<dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- MyBatis Starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><!-- MySQL 驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency>
</dependencies>
2. 配置數據庫連接(application.properties)
spring.datasource.url=jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Drivermybatis.mapper-locations=classpath:mapper/**/*.xml
mybatis.type-aliases-package=com.example.demo.model
四、編寫 Mapper 接口和 XML 文件
1. 創建實體類(Model)
package com.example.demo.model;public class User {private Long id;private String name;private String email;// Getter and Setter
}
2. 創建 Mapper 接口
package com.example.demo.mapper;import com.example.demo.model.User;
import java.util.List;public interface UserMapper {List<User> getAllUsers();User getUserById(Long id);void insertUser(User user);void updateUser(User user);void deleteUserById(Long id);
}
3. 創建 XML 映射文件(resources/mapper/UserMapper.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.demo.mapper.UserMapper"><!-- 查詢所有用戶 --><select id="getAllUsers" resultType="User">SELECT * FROM users</select><!-- 根據ID查詢用戶 --><select id="getUserById" parameterType="long" resultType="User">SELECT * FROM users WHERE id = #{id}</select><!-- 插入用戶 --><insert id="insertUser">INSERT INTO users (name, email)VALUES (#{name}, #{email})</insert><!-- 更新用戶 --><update id="updateUser">UPDATE usersSET name = #{name}, email = #{email}WHERE id = #{id}</update><!-- 刪除用戶 --><delete id="deleteUserById">DELETE FROM users WHERE id = #{id}</delete></mapper>
五、動態 SQL 使用詳解
MyBatis 提供了強大的動態 SQL 功能,常見標簽有 <if>
、<choose>
、<when>
、<set>
、<where>
、<foreach>
等。
示例:根據條件查詢用戶
Mapper 接口:
List<User> searchUsers(@Param("name") String name, @Param("email") String email);
XML 文件:
<select id="searchUsers" resultType="User">SELECT * FROM users<where><if test="name != null and name != ''">AND name LIKE CONCAT('%', #{name}, '%')</if><if test="email != null and email != ''">AND email LIKE CONCAT('%', #{email}, '%')</if></where>
</select>
示例:批量插入用戶
<insert id="batchInsert">INSERT INTO users (name, email)VALUES<foreach collection="list" item="user" separator=",">(#{user.name}, #{user.email})</foreach>
</insert>
六、測試 MyBatis SQL
可以創建一個簡單的 Service 層調用 Mapper 并打印結果。
Service 示例:
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public void printAllUsers() {List<User> users = userMapper.getAllUsers();users.forEach(System.out::println);}
}
Controller 示例:
@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic void getUsers() {userService.printAllUsers();}
}
七、MyBatis XML 常見標簽總結
標簽 | 用途 |
---|---|
<select> | 查詢操作 |
<insert> | 插入操作 |
<update> | 更新操作 |
<delete> | 刪除操作 |
<where> | 自動處理 WHERE 子句,避免多余的 AND /OR |
<if> | 條件判斷 |
<choose>/<when>/<otherwise> | 多條件選擇 |
<set> | 自動處理更新字段中的逗號問題 |
<foreach> | 循環處理集合數據(如 IN 子句、批量插入) |
八、最佳實踐建議
- 命名規范統一:XML 文件名與 Mapper 接口名保持一致。
- SQL 與業務邏輯分離:將 SQL 放在 XML 中,便于維護和審計。
- 使用
<where>
和<set>
避免語法錯誤。 - 合理使用
<resultMap>
映射復雜對象關系。 - 開啟 MyBatis 日志輸出,方便調試:
logging:level:com.example.demo.mapper: debug
九、擴展功能推薦
- PageHelper 分頁插件:輕松實現分頁查詢。
- MyBatis Generator:自動生成 Model、Mapper 和 XML 文件。
- MyBatis Plus:增強型 MyBatis 工具包,簡化 CRUD 操作。
十、結語
在 Spring Boot 中使用 MyBatis 的 XML 方式編寫 SQL,不僅保留了 SQL 的靈活性,還利用了框架提供的強大映射能力。通過本篇博客,你已經掌握了從項目搭建到 SQL 編寫的完整流程,以及動態 SQL 的高級用法。希望你在實際項目中能夠熟練運用這些知識,寫出更優雅、高效的數據庫操作代碼!