本文只做了简单的实现,具体的细节需根据自己的需求进一步实现。如果实现中遇到问题欢迎留言讨论。
引入 MyBatis-Plus
引入相关依赖(pom.xml)
推荐先直接在顶级 pom.xml 中直接依赖,等调试通过之后,在去按需依赖(细分)。
<dependencies><!-- lombok 工具--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency><!-- mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version></dependency> </dependencies>
调整配置信息(application.yml)
注释原 mybatis 配置
## MyBatis配置
#mybatis:
# # 搜索指定包别名
# typeAliasesPackage: com.ruoyi.**.domain
# # 配置mapper的扫描,找到所有的mapper.xml映射文件
# mapperLocations: classpath*:mapper/**/*Mapper.xml
# # 加载全局的配置文件
# configLocation: classpath:mybatis/mybatis-config.xml
添加 mybatis-plus 配置
# MyBatis配置
mybatis-plus:# 搜索指定包别名typeAliasesPackage: com.ruoyi.**.domain# 配置mapper的扫描,找到所有的mapper.xml映射文件mapperLocations: classpath*:mapper/**/*Mapper.xmlconfiguration:cache-enabled: trueuse-generated-keys: truedefault-executor-type: simplelog-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
调整配置文件(MyBatisConfig.java)
注释原配置文件(MyBatisConfig.java)的 @Configuration 注解
package com.ruoyi.framework.config;....../*** Mybatis支持*匹配扫描包* * @author ruoyi*/
//@Configuration
public class MyBatisConfig
{......
}
添加新配置文件(MybatisPlusConfiguration.java)
package com.ruoyi.framework.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author puff* @date 2023/8/30* @desc Mybatis-Plus 自动装配*/
@Configuration
public class MybatisPlusConfiguration {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//分页插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//乐观锁插件interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());//sql性能规范// interceptor.addInnerInterceptor(new IllegalSQLInnerInterceptor());//防止全表更新与删除interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());return interceptor;}
}
排除非数据库表字段(BaseEntity.java、TreeEntity.java)
自动生成的 domain 类会继承 BaseEntity.java 或 TreeEntity.java 类,所以针对这两个类中的非数据库字段需使用 @TableField(exist = false) 进行排除,不然在使用时会出现异常。
修改 .vm 模板文件
.vm 模板文件的位置在 ruoyi-generator 模块的 resources 目录下
domain.java.vm
package ${packageName}.domain;import lombok.Data;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
#foreach ($import in $importList)
import ${import};
#end
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
#if($table.crud || $table.sub)
import com.ruoyi.common.core.domain.BaseEntity;
#elseif($table.tree)
import com.ruoyi.common.core.domain.TreeEntity;
#end/*** ${functionName}对象 ${tableName}** @author ${author}* @date ${datetime}*/
#if($table.crud || $table.sub)#set($Entity="BaseEntity")
#elseif($table.tree)#set($Entity="TreeEntity")
#end
@Data
@TableName("${tableName}")
public class ${ClassName} extends ${Entity} {
private static final long serialVersionUID=1L;#foreach ($column in $columns)#if(!$table.isSuperColumn($column.javaField))/** $column.columnComment */#if($column.list)#set($parentheseIndex=$column.columnComment.indexOf("("))#if($parentheseIndex != -1)#set($comment=$column.columnComment.substring(0, $parentheseIndex))#else#set($comment=$column.columnComment)#end#if($parentheseIndex != -1)@Excel(name = "${comment}" , readConverterExp = "$column.readConverterExp()")#elseif($column.javaType == 'Date')@JsonFormat(pattern = "yyyy-MM-dd")@Excel(name = "${comment}" , width = 30, dateFormat = "yyyy-MM-dd")#else@Excel(name = "${comment}")#end#end#if($column.isPk == 1)@TableId(value = "$column.columnName" , type = IdType.ASSIGN_ID)#else@TableField(value = "$column.columnName")#endprivate $column.javaType $column.javaField;#end
#end
#if($table.sub)
/** $table.subTable.functionName信息 */
private List<${subClassName}> ${subclassName}List;#end@Override
public String toString(){return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)#foreach ($column in $columns)#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))#set($AttrName=$column.javaField)#else#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})#end.append("${column.javaField}" ,get${AttrName}())#end#if($table.sub).append("${subclassName}List" ,get${subClassName}List())#end.toString();}}
mapper.java.vm
package ${packageName}.mapper;import ${packageName}.domain.${ClassName};
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
#if($table.sub)
import ${packageName}.domain.${subClassName};
#end/*** ${functionName}Mapper接口** @author ${author}* @date ${datetime}*/
public interface ${ClassName}Mapper extends BaseMapper<${ClassName}> {}
service.java.vm
package ${packageName}.service;import ${packageName}.domain.${ClassName};
import com.baomidou.mybatisplus.extension.service.IService;/*** ${functionName}Service接口** @author ${author}* @date ${datetime}*/
public interface I${ClassName}Service extends IService<${ClassName}> {}
serviceImpl.java.vm
package ${packageName}.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;#foreach ($column in $columns)#if($column.javaField == 'createTime' || $column.javaField == 'updateTime')import com.ruoyi.common.utils.DateUtils;#break#end#end
import org.springframework.stereotype.Service;#if($table.sub)import java.util.ArrayList;import com.ruoyi.common.utils.StringUtils;import org.springframework.transaction.annotation.Transactional;import ${packageName}.domain.${subClassName};#end
import ${packageName}.mapper.${ClassName}Mapper;
import ${packageName}.domain.${ClassName};
import ${packageName}.service.I${ClassName}Service;/*** ${functionName}Service业务层处理** @author ${author}* @date ${datetime}*/
@Service
public class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}>implements I${ClassName}Service {}
controller.java.vm
package ${packageName}.controller;import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import ${packageName}.domain.${ClassName};
import ${packageName}.service.I${ClassName}Service;
import com.ruoyi.common.utils.poi.ExcelUtil;
#if($table.crud || $table.sub)
import com.ruoyi.common.core.page.TableDataInfo;
#elseif($table.tree)
#end/*** ${functionName}Controller* * @author ${author}* @date ${datetime}*/
@RestController
@RequestMapping("/${moduleName}/${businessName}")
public class ${ClassName}Controller extends BaseController
{@Autowiredprivate I${ClassName}Service ${className}Service;/*** 查询${functionName}列表*/@PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')")@GetMapping("/list")
#if($table.crud || $table.sub)public TableDataInfo list(${ClassName} ${className}){
## startPage();List<${ClassName}> list = ${className}Service.list();return getDataTable(list);}
#elseif($table.tree)public AjaxResult list(${ClassName} ${className}){List<${ClassName}> list = ${className}Service.list();return success(list);}
#end/*** 导出${functionName}列表*/@PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')")@Log(title = "${functionName}", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, ${ClassName} ${className}){List<${ClassName}> list = ${className}Service.list();ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);util.exportExcel(response, list, "${functionName}数据");}/*** 获取${functionName}详细信息*/@PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')")@GetMapping(value = "/{${pkColumn.javaField}}")public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}){return success(${className}Service.getById(${pkColumn.javaField}));}/*** 新增${functionName}*/@PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')")@Log(title = "${functionName}", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody ${ClassName} ${className}){return toAjax(${className}Service.save(${className}));}/*** 修改${functionName}*/@PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')")@Log(title = "${functionName}", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody ${ClassName} ${className}){return toAjax(${className}Service.updateById(${className}));}/*** 删除${functionName}*/@PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')")@Log(title = "${functionName}", businessType = BusinessType.DELETE)@DeleteMapping("/{${pkColumn.javaField}s}")public AjaxResult remove(@PathVariable List<Integer> ${pkColumn.javaField}s){return toAjax(${className}Service.removeBatchByIds(${pkColumn.javaField}s));}
}
mapper.xml.vm
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${packageName}.mapper.${ClassName}Mapper"><resultMap type="${ClassName}" id="${ClassName}Result">#foreach ($column in $columns)<result property="${column.javaField}" column="${column.columnName}" />#end</resultMap>#if($table.sub)<resultMap id="${ClassName}${subClassName}Result" type="${ClassName}" extends="${ClassName}Result"><collection property="${subclassName}List" ofType="${subClassName}" column="${pkColumn.columnName}" select="select${subClassName}List" /></resultMap><resultMap type="${subClassName}" id="${subClassName}Result">#foreach ($column in $subTable.columns)<result property="${column.javaField}" column="${column.columnName}" />#end</resultMap>#end<sql id="select${ClassName}Vo">select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName}</sql></mapper>