spring-boot-starter-* 一站式依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>springboot-mybatis-demo</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version> <!-- JDK 17+ 基線 -->
</parent>
<properties>
<java.version>17</java.version>
<mybatis-spring-boot.version>3.0.3</mybatis-spring-boot.version>
</properties>
<dependencies>
<!-- Web + 核心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis 整合 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot.version}</version>
</dependency>
<!-- MySQL 驅動 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 連接池 HikariCP (Spring Boot 默認) -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
<!-- Lombok 簡化實體 -->
<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>
</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>
</project>
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.demo.entity
configuration:
map-underscore-to-camel-case: true # 下劃線轉駝峰
cache-enabled: true # 二級緩存
default-fetch-size: 100
default-statement-timeout: 30
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台打印 SQL
package com.example.demo.entity;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class User {
private Long id;
private String username;
private String email;
private Integer age;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
package com.example.demo.mapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE username = #{username}")
User findByUsername(@Param("username") String username);
@Select("SELECT COUNT(*) FROM user")
Long countAll();
}
資源目錄:src/main/resources/mapper/UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
<resultMap id="userMap" type="com.example.demo.entity.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="email" column="email"/>
<result property="age" column="age"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<sql id="baseColumns">
id, username, email, age, create_time, update_time
</sql>
<select id="findByConditions" resultMap="userMap">
SELECT <include refid="baseColumns"/>
FROM user
<where>
<if test="username != null and username != ''">
AND username LIKE CONCAT('%', #{username}, '%')
</if>
<if test="minAge != null">
AND age >= #{minAge}
</if>
<if test="maxAge != null">
AND age <= #{maxAge}
</if>
</where>
ORDER BY create_time DESC
LIMIT #{offset}, #{pageSize}
</select>
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (username, email, age, create_time, update_time)
VALUES (#{username}, #{email}, #{age}, NOW(), NOW())
</insert>
<update id="updateById">
UPDATE user
<set>
<if test="username != null">username = #{username},</if>
<if test="email != null">email = #{email},</if>
<if test="age != null">age = #{age},</if>
update_time = NOW()
</set>
WHERE id = #{id}
</update>
</mapper>
package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.demo.mapper") // 掃描 Mapper 接口
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
或在主配置類加 @MapperScan,或每個 Mapper 接口加 @Mapper(推薦統一掃描)。
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
private final UserMapper userMapper;
@GetMapping("/{username}")
public User getByUsername(@PathVariable String username) {
return userMapper.findByUsername(username);
}
@GetMapping
public List list(@RequestParam(required = false) String username,
@RequestParam(defaultValue = "0") Integer minAge,
@RequestParam(defaultValue = "100") Integer maxAge,
@RequestParam(defaultValue = "0") Integer offset,
@RequestParam(defaultValue = "10") Integer pageSize) {
return userMapper.findByConditions(username, minAge, maxAge, offset, pageSize);
}
@PostMapping
public Long create(@RequestBody User user) {
userMapper.insert(user);
return user.getId(); // 回寫自增 ID
}
@PutMapping("/{id}")
public void update(@PathVariable Long id, @RequestBody User user) {
user.setId(id);
userMapper.updateById(user);
}
}
@Configuration
@MapperScan(basePackages = "com.example.demo.mapper.db1", sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class Db1Config { ... }
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.6.3</version>
</dependency>
# 配置
pagehelper:
helper-dialect: mysql
reasonable: true
support-methods-arguments: true
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
提供 BaseMapper<T> 內置 CRUD、條件構建器、代碼生成器,大幅減少樣板代碼。
log-impl 開發期監控慢查詢EXPLAIN 分析執行計劃SELECT *、分頁優化(延遲關聯/游標分頁)INSERT ... VALUES (),(),() 或 foreach
@Service
@RequiredArgsConstructor
public class UserService {
private final UserMapper userMapper;
@Transactional(rollbackFor = Exception.class)
public void transfer(Long fromId, Long toId, Integer amount) {
userMapper.deductBalance(fromId, amount);
userMapper.addBalance(toId, amount);
}
}
Spring Boot + MyBatis 整合核心在於:Starter 自動配置數據源/事務管理器/SqlSessionFactory → @MapperScan 掃描接口 → XML/註解定義 SQL → 注入 Controller/Service 使用。掌握動態 SQL、分頁、事務、多数據源等進階場景,即可構建企業級高性能數據訪問層。