首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring Boot 整合 MyBatis 完整實戰:從零構建企業級數據訪問層

     編輯:Java 相關知識

一、Spring Boot 核心優勢回顧

  • 自動配置:spring-boot-starter-* 一站式依賴
  • 內嵌容器:Tomcat/Jetty/Undertow,無需 WAR 部署
  • 生產就緒:Actuator 監控、健康檢查、指標導出
  • 零 XML:Java Config + 條件裝配,極簡配置

二、項目初始化:Maven 依賴全配置


<?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>

三、配置文件:application.yml


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

四、實體類:Lombok 極簡定義


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;
}

五、Mapper 接口:註解式與 XML 並存

1. 註解式(簡單查詢)


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();
}

2. XML 式(複雜 SQL、動態條件)

資源目錄: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>

六、啟動類與 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(推薦統一掃描)。

七、Controller 測試接口


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);
    }
}

八、進階配置與最佳實踐

1. 多数據源


@Configuration
@MapperScan(basePackages = "com.example.demo.mapper.db1", sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class Db1Config { ... }

2. 分頁插件


<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

3. 通用 Mapper / MyBatis-Plus


<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.5</version>
</dependency>

提供 BaseMapper<T> 內置 CRUD、條件構建器、代碼生成器,大幅減少樣板代碼。

4. SQL 性能優化

  • 開啟 log-impl 開發期監控慢查詢
  • 使用 EXPLAIN 分析執行計劃
  • 合理索引、避免 SELECT *、分頁優化(延遲關聯/游標分頁)
  • 批量插入 INSERT ... VALUES (),(),() 或 foreach

5. 事務管理


@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、分頁、事務、多数據源等進階場景,即可構建企業級高性能數據訪問層。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved