MyBatis-Plus 使用总结
1. POM 依赖
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- mybatis-plus-generator 生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
<!-- freemarker 模板引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>2.6.7</version>
</dependency>
2. YML 配置
mybatis-plus:
mapper-locations: classpath*:/mapper/**Mapper.xml
configuration:
local-cache-scope: statement
3. MybatisPlusConfig 配置类
配置分页插件以及全表更新删除插件
@Configuration
@MapperScan("fan.**.dao")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// 添加全表更新删除插件
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
return interceptor;
}
}
4. CodeGenerator 代码生成
-
获取项目数据库所对应表和字段的信息(information_schema 数据库的 TABLES 和 COLUMNS)
# 获取表 SELECT * FROM information_schema. TABLES WHERE TABLE_SCHEMA = (SELECT DATABASE()); # 获取字段 SELECT * FROM information_schema. COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE()) AND TABLE_NAME = "sys_user";
-
使用生成器的模板新建一个 freemarker(模板引擎)的页面模板 - SysUser.java.ftl - ${baseEntity}
-
提供相关需要进行渲染的动态数据 - BaseEntity、表字段、注释、baseEntity=SuperEntity
-
使用 freemarker 模板引擎进行渲染 - SysUser.java
public class CodeGenerator {
private static final DataSourceConfig.Builder DATA_SOURCE_CONFIG = new DataSourceConfig
.Builder("jdbc:mysql://124.222.118.90:3306/enterprise_hrms?connectTimeout=5000&socketTimeout=10000&autoReconnect=true&failOverReadOnly=false&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8", "root", "fan223");
public static void main(String[] args) {
FastAutoGenerator.create(DATA_SOURCE_CONFIG)
// 全局配置
.globalConfig((scanner, builder) -> builder.author(scanner.apply("请输入作者名称")).enableSwagger())
// 包配置
.packageConfig((scanner, builder) -> builder.parent(scanner.apply("请输入包名")))
// 策略配置
.strategyConfig((scanner, builder) -> builder.addInclude(scanner.apply("请输入表名,多个表名用,隔开")))
// 模板配置
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
}
详细配置信息:https://baomidou.com/pages/981406/
生成如下:
Service
public interface SysMenuService extends IService<SysMenuDO> {
}
ServiceImpl
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuDAO, SysMenuDO> implements SysMenuService {
}
DAO
public interface SysMenuDAO extends BaseMapper<SysMenuDO> {
}
5. 使用分页
前提先要配置分页插件,否则无效
public Page<EmployeeDTO> getEmployeeList(ConditionDTO conditionDTO) {
QueryWrapper<EmployeeDO> queryWrapper = new QueryWrapper<>();
// 创建一个 Page,传入当前页和页面大小
Page<EmployeeDO> page = new Page<>(conditionDTO.getPageNum(), conditionDTO.getPageSize());
// 调用 selectPage() 方法,返回一个 Page 对象
Page<EmployeeDO> employeeDOPage = employeeDAO.selectPage(page, queryWrapper);
// 转换为 DTO
......
return employeeDTOPage;
}
返回结果如下所示:current 表示当前页,size 表示单页最大数量,total 表示总数,pages 表示页面数,records 表示数据。
6. in 的使用
在 Mybatis-Plus 中,当传入参数为 list 集合的时候,会自动把其封装为一个 map,以 “list” 作为 key,每个元素的值作为 value,格式为 Map<"list", value>。当传入参数为数组的时候会自动把其封装为一个 map,以 “array” 作为 key,每个元素的值作为 value,格式为 Map<"array", value>
public interface EmployeeDAO extends BaseMapper<EmployeeDO> {
void deleteEmployee(List<String> empIds);
}
正确写法:
<update id="deleteEmployee">
UPDATE employee
SET vali_flag = '0'
WHERE emp_id in
<foreach item="item" collection="list" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</update>
错误写法
<update id="deleteEmployee">
UPDATE employee
SET vali_flag = '0'
WHERE emp_id in
<foreach item="item" collection="empIds" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</update>