Mybatis Common Mapper集成Spring Boot:极速配置指南

Mybatis Common Mapper集成Spring Boot:极速配置指南

【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 【免费下载链接】Mapper 项目地址: https://gitcode.com/gh_mirrors/ma/Mapper

引言:告别繁琐配置

你是否还在为MyBatis的XML映射文件编写而烦恼?是否觉得手动实现CRUD操作既重复又容易出错?本文将带你通过Mybatis Common Mapper(以下简称"通用Mapper")与Spring Boot的无缝集成,实现零XML配置、自动化CRUD操作,让数据访问层开发效率提升10倍。

读完本文后,你将掌握:

  • 通用Mapper的核心优势与实现原理
  • 3分钟极速集成Spring Boot的配置流程
  • 高级特性如逻辑删除、乐观锁的实战应用
  • 性能优化与常见问题解决方案

核心优势解析

通用Mapper是一款基于MyBatis的增强工具,通过以下机制实现开发效率的飞跃:

mermaid

核心优势对比

特性传统MyBatis通用Mapper效率提升
CRUD方法实现手动编写XML/SQL继承接口自动生成100%
动态SQLXML中维护if/where标签注解驱动自动生成80%
数据库兼容性手动适配不同数据库语法内置方言适配90%
代码量每个实体对应XML+接口仅需接口定义95%

环境准备与版本兼容

系统要求

  • JDK 8+
  • Spring Boot 2.x/3.x
  • MyBatis 3.5.x+
  • Maven/Gradle构建工具

版本兼容矩阵

Spring Boot版本通用Mapper版本推荐依赖
2.0.x - 2.3.x2.1.5+mapper-spring-boot-starter:2.1.5
2.4.x - 2.7.x2.1.6+mapper-spring-boot-starter:2.1.6
3.0.x+4.2.0+mapper-spring-boot-starter:4.2.0

极速集成步骤(3分钟完成)

步骤1:添加依赖

pom.xml中添加以下依赖:

<!-- 通用Mapper Spring Boot Starter -->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>4.2.0</version>
</dependency>

<!-- MySQL驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

注意:请根据Spring Boot版本选择正确的通用Mapper版本,避免兼容性问题。

步骤2:配置数据源与Mapper

application.yml中添加配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  mapper-locations: classpath:mapper/*.xml  # 如需自定义SQL时配置
  type-aliases-package: com.example.entity  # 实体类包路径

mapper:
  mappers: tk.mybatis.mapper.common.BaseMapper  # 基础Mapper接口
  not-empty: false  # insert/update时是否判断字符串类型!=''
  identity: MYSQL  # 数据库自增策略
  before: true  # 主键生成策略执行时机

步骤3:创建实体类

package com.example.entity;

import javax.persistence.*;
import java.time.LocalDateTime;

@Table(name = "sys_user")  // 对应数据库表名
public class User {
    @Id  // 主键标识
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 自增策略
    private Long id;
    
    @Column(name = "username")  // 对应表字段名
    private String username;
    
    @Column(name = "password")
    private String password;
    
    @Column(name = "email")
    private String email;
    
    @Column(name = "create_time")
    private LocalDateTime createTime;
    
    // Getters and setters
    // ...
}

步骤4:定义Mapper接口

package com.example.mapper;

import com.example.entity.User;
import tk.mybatis.mapper.common.BaseMapper;

// 仅需继承BaseMapper即可获得全部CRUD方法
public interface UserMapper extends BaseMapper<User> {
    // 无需编写任何方法实现
}

步骤5:Service层使用

package com.example.service.impl;

import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;

@Service
public class UserServiceImpl implements UserService {
    
    @Resource
    private UserMapper userMapper;
    
    @Override
    public List<User> findAll() {
        return userMapper.selectAll();  // 直接调用继承的方法
    }
    
    @Override
    public User findById(Long id) {
        return userMapper.selectByPrimaryKey(id);
    }
    
    @Override
    public int save(User user) {
        return userMapper.insertSelective(user);  // 只插入非空字段
    }
    
    @Override
    public int update(User user) {
        return userMapper.updateByPrimaryKeySelective(user);  // 只更新非空字段
    }
    
    @Override
    public int delete(Long id) {
        return userMapper.deleteByPrimaryKey(id);
    }
}

高级特性实战

逻辑删除实现

通用Mapper通过@LogicDelete注解实现逻辑删除功能,避免数据真正删除:

public class User {
    // ...其他字段
    
    @LogicDelete(value = "1", delval = "0")  // 1-正常 0-删除
    @Column(name = "is_deleted")
    private Integer isDeleted;
}

配置文件中添加:

mapper:
  logic-delete-value: 0  # 删除值
  logic-not-delete-value: 1  # 未删除值

原理示意图:

mermaid

乐观锁实现

通过@Version注解实现乐观锁控制,解决并发更新冲突:

public class Product {
    @Id
    private Long id;
    
    private String name;
    
    private Integer stock;
    
    @Version  // 乐观锁版本字段
    private Integer version;
}

更新时自动附加版本条件:

// 实际执行SQL
UPDATE product 
SET name = 'newName', stock = 100, version = version + 1 
WHERE id = 1 AND version = 2

批量操作优化

使用MySqlMapper接口提供的批量操作:

import tk.mybatis.mapper.common.MySqlMapper;

public interface UserMapper extends BaseMapper<User>, MySqlMapper<User> {
    // 继承后获得批量操作方法
}

// 批量插入示例
List<User> userList = new ArrayList<>();
// 添加用户数据...
userMapper.insertList(userList);  // 生成一条INSERT语句插入多条数据

性能优化指南

分页查询优化

通用Mapper结合PageHelper实现高效分页:

// 添加依赖
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.6</version>
</dependency>

// 代码中使用
PageHelper.startPage(1, 10);  // 第1页,每页10条
List<User> users = userMapper.select(null);
PageInfo<User> pageInfo = new PageInfo<>(users);

分页原理对比:

方式实现原理性能适用场景
内存分页查全部再截取O(n)小数据量
物理分页生成LIMIT/OFFSETO(1)大数据量
PageHelper拦截SQL添加分页O(1)所有场景

缓存配置优化

mybatis:
  configuration:
    cache-enabled: true  # 开启一级缓存
    local-cache-scope: session  # 会话级缓存
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 日志输出

mapper:
  cache: true  # 开启二级缓存

常见问题解决方案

问题1:字段名与属性名不一致

解决方案1:使用@Column注解显式映射

@Column(name = "user_name")
private String username;

解决方案2:配置驼峰命名转换

mybatis:
  configuration:
    map-underscore-to-camel-case: true  # 自动下划线转驼峰

问题2:多数据源配置冲突

解决方案:使用@MapperScan指定不同数据源的Mapper路径

@Configuration
@MapperScan(basePackages = "com.example.mapper.master", sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {
    // 配置略
}

@Configuration
@MapperScan(basePackages = "com.example.mapper.slave", sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveDataSourceConfig {
    // 配置略
}

问题3:自定义SQL与通用方法冲突

解决方案:使用@Provider注解自定义SQL

public interface UserMapper extends BaseMapper<User> {
    @SelectProvider(type = UserProvider.class, method = "selectByUsername")
    User selectByUsername(String username);
    
    class UserProvider {
        public String selectByUsername(String username) {
            return "SELECT * FROM sys_user WHERE username = #{username}";
        }
    }
}

项目实战案例

完整项目结构

com.example
├── ExampleApplication.java        # 应用入口
├── entity
│   ├── User.java                  # 用户实体
│   └── Product.java               # 产品实体
├── mapper
│   ├── UserMapper.java            # 用户Mapper接口
│   └── ProductMapper.java         # 产品Mapper接口
├── service
│   ├── UserService.java           # 用户服务接口
│   └── impl
│       └── UserServiceImpl.java   # 服务实现
└── controller
    └── UserController.java        # 控制器

核心配置文件

# application.yml完整配置
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  type-aliases-package: com.example.entity
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

mapper:
  mappers: tk.mybatis.mapper.common.BaseMapper,tk.mybatis.mapper.common.MySqlMapper
  not-empty: false
  identity: MYSQL
  before: true
  logic-delete-value: 0
  logic-not-delete-value: 1

总结与展望

通过本文的指南,我们实现了通用Mapper与Spring Boot的高效集成,主要收获包括:

  1. 开发效率提升:通过继承接口方式消除90%的重复代码
  2. 维护成本降低:实体类与数据库表结构变更时仅需修改注解
  3. 代码质量提升:标准化CRUD操作,减少人为错误
  4. 性能优化内置:分页、缓存等最佳实践开箱即用

进阶学习路线

  • 通用Mapper源码解析与自定义扩展
  • 分布式ID生成策略集成
  • 读写分离与分库分表实践
  • 与MyBatis-Plus的对比选型

最后,附上项目地址供参考:https://gitcode.com/gh_mirrors/ma/Mapper,建议定期关注官方更新,获取最新特性与安全补丁。

【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 【免费下载链接】Mapper 项目地址: https://gitcode.com/gh_mirrors/ma/Mapper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值