MyBatis 常用扩展组件详解(含代码示例)
MyBatis 常用扩展组件详解(含代码示例)
1. MyBatis-Plus
功能:简化 MyBatis 的 CRUD 操作,提供代码生成器、分页插件、条件构造器等功能。
核心类:com.baomidou.mybatisplus.core.MybatisPlusInterceptor
、com.baomidou.mybatisplus.core.mapper.BaseMapper
。
代码示例
步骤1:添加依赖
<!-- pom.xml -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3</version>
</dependency>
步骤2:配置分页插件
// 配置类(如 MyBatisConfig.java)
@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 分页插件return interceptor;}
}
步骤3:使用 BaseMapper
// UserMapper.java(继承 BaseMapper)
public interface UserMapper extends BaseMapper<User> {// 自定义 SQL 可在此处添加
}// UserServiceImpl.java
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Autowiredprivate UserMapper userMapper;public List<User> listUsers() {return userMapper.selectList(null); // 简化查询}public Page<User> pageUsers(int pageNum, int pageSize) {Page<User> page = new Page<>(pageNum, pageSize);return userMapper.selectPage(page, null); // 分页查询}
}
2. PageHelper
功能:分页插件,支持复杂查询的分页。
核心类:com.github.pagehelper.PageHelper
、com.github.pagehelper.PageInfo
。
代码示例
步骤1:添加依赖
<!-- pom.xml -->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.5</version>
</dependency>
步骤2:配置分页插件
// 配置类(如 PageHelperConfig.java)
@Configuration
public class PageHelperConfig {@Beanpublic PageInterceptor pageInterceptor() {return new PageInterceptor();}
}
步骤3:使用分页
// UserService.java
public PageInfo<User> getUsers(int pageNum, int pageSize) {PageHelper.startPage(pageNum, pageSize); // 开启分页List<User> users = userMapper.selectAll();return new PageInfo<>(users); // 封装分页信息
}
3. Dynamic-Datasource
功能:动态数据源切换,支持多数据源(主从分离、读写分离)。
核心类:com.baomidou.dynamic.datasource.annotation.DS
、com.baomidou.dynamic.datasource.provider.DsProvider
。
代码示例
步骤1:添加依赖
<!-- pom.xml -->
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.3</version>
</dependency>
步骤2:配置数据源
# application.yml
dynamic:datasource:primary: masterdatasource:master:url: jdbc:mysql://localhost:3306/master_dbusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverslave:url: jdbc:mysql://localhost:3306/slave_dbusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
步骤3:切换数据源
// Service层使用注解切换数据源
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@DS("master") // 切换到主库public void saveUser(User user) {userMapper.insert(user);}@DS("slave") // 切换到从库public List<User> listUsers() {return userMapper.selectAll();}
}
4. MyBatis-Spring-Boot-Starter
功能:Spring Boot 与 MyBatis 的集成 starter,简化配置。
核心类:org.mybatis.spring.boot.autoconfigure.MyBatisAutoConfiguration
。
代码示例
步骤1:添加依赖
<!-- pom.xml -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version>
</dependency>
步骤2:配置 MyBatis
# application.yml
mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.example.entity
步骤3:使用 Mapper
// UserMapper.xml
<select id="selectUserById" resultType="User">SELECT * FROM user WHERE id = #{id}
</select>// UserMapper.java
public interface UserMapper {User selectUserById(Long id);
}// Service层调用
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Long id) {return userMapper.selectUserById(id);}
}
5. MyBatis-Generator
功能:代码生成器,自动生成 Entity、Mapper、XML 文件。
核心类:org.mybatis.generator.api.MyBatisGenerator
。
代码示例
步骤1:添加依赖
<!-- pom.xml -->
<dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.4.0</version>
</dependency>
步骤2:配置生成器(generatorConfig.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration><context id="DB2Target" targetRuntime="MyBatis3"><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/mydb"userId="root"password="root"></jdbcConnection><javaModelGenerator targetPackage="com.example.entity" targetProject="src/main/java"/><sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/><javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/><table tableName="user" domainObjectplural="User"/></context>
</generatorConfiguration>
步骤3:执行生成命令
// 执行生成器(如 Main.java)
public class MyBatisGenerator {public static void main(String[] args) throws Exception {DefaultShellCallback callback = new DefaultShellCallback(true);ConfigurationParser cp = new ConfigurationParser(callback, null);Configuration config = cp.parseConfiguration(new File("generatorConfig.xml"));MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, null);myBatisGenerator.generate(null);}
}
6. MyBatis-Interceptor
功能:拦截器扩展,实现自定义拦截逻辑(如日志、权限控制)。
核心类:org.apache.ibatis.plugin.Interceptor
。
代码示例
步骤1:创建拦截器
@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
public class LoggingInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 记录查询日志System.out.println("SQL Execution Start");Object result = invocation.proceed();System.out.println("SQL Execution End");return result;}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}
}
步骤2:注册拦截器
// 配置类(如 MyBatisConfig.java)
@Configuration
public class MyBatisConfig {@Beanpublic Interceptor loggingInterceptor() {return new LoggingInterceptor();}
}
总结表格
组件名称 | 功能 | 核心类 | 适用场景 | 代码关键点 |
---|---|---|---|---|
MyBatis-Plus | 简化 CRUD,分页,代码生成器 | BaseMapper , MybatisPlusInterceptor | 快速开发、减少重复代码 | @TableId , selectPage() |
PageHelper | 分页插件(复杂查询分页) | PageHelper , PageInfo | 需要灵活分页的场景 | PageHelper.startPage() |
Dynamic-Datasource | 动态数据源切换 | @DS , DsProvider | 主从分离、读写分离 | @DS("master/slave") |
MyBatis-Spring-Starter | Spring Boot 集成 | MyBatisAutoConfiguration | Spring Boot 项目快速集成 MyBatis | @MapperScan , 配置 application.yml |
MyBatis-Generator | 自动生成代码 | MyBatisGenerator | 快速生成 Entity、Mapper、XML | generatorConfig.xml 配置 |
MyBatis-Interceptor | 自定义拦截逻辑(日志/权限) | Interceptor | 需要拦截 SQL 执行或添加公共逻辑 | 实现 intercept() 方法 |
关键选择建议
- 快速开发:优先选择 MyBatis-Plus,减少重复代码。
- 分页需求:根据复杂度选择 PageHelper(灵活分页)或 MyBatis-Plus 分页插件(简单场景)。
- 多数据源:使用 Dynamic-Datasource 实现动态切换。
- 代码生成:用 MyBatis-Generator 自动生成基础代码。
- 扩展功能:通过 Interceptor 实现日志、权限等公共逻辑。