Ruoyi项目使用MyBatis-Plus优化自动生成代码文件
MyBatis-Plus集成摘要 MyBatis-Plus(MP)是一个MyBatis增强工具,提供无侵入式的CRUD简化、代码生成器、条件构造器等特性,可减少70%样板代码。本文详细介绍了在若依框架中集成MyBatis-Plus的完整方案,包括对Domain、Mapper、Service和Controller层的改造要点: Domain层继承CommonEntity并添加@TableName注解
MyBatis-Plus简介
MyBatis-Plus(简称MP)是一个基于MyBatis的增强工具,旨在简化开发、提高效率。它在MyBatis的基础上只做增强不做改变,引入后不会对现有MyBatis架构产生影响,同时提供了大量便捷功能。
核心特性
1. 无侵入设计
MyBatis-Plus完全兼容原生MyBatis,所有功能均通过扩展实现,无需修改现有MyBatis配置和代码。
2. CRUD简化
内置通用Mapper和Service,通过继承即可实现单表CRUD操作,无需编写XML文件。例如:
// 查询所有用户
userMapper.selectList(null);
3. 代码生成器
支持一键生成Entity、Mapper、Service、Controller等代码,大幅减少重复劳动。
4. 条件构造器
提供LambdaQueryWrapper和UpdateWrapper等条件封装类,支持链式调用。例如:
queryWrapper.lambda().eq(User::getName, "Tom").ge(User::getAge, 18);
5. 分页插件
内置物理分页插件,支持多种数据库,无需手动处理分页逻辑。例如:
Page<User> page = new Page<>(1, 10);
userMapper.selectPage(page, queryWrapper);
优势对比
与原生MyBatis对比
- 减少约70%的CRUD代码量
- 提供自动化代码生成工具
- 内置性能分析插件
与其他ORM框架对比
- 保留MyBatis灵活性的同时提供更多便利功能
- 学习曲线平缓,适合快速上手
适用场景
- 需要快速开发的中小型项目
- 以单表操作为主的业务场景
- 希望减少样板代码但需保留SQL优化能力的团队
MyBatis-Plus通过合理的封装和扩展,在保持MyBatis核心优势的同时,显著提升了开发效率,是目前Java领域广泛使用的ORM增强框架之一。
若依框架当前未集成MyBatisPlus,如需集成可按以下步骤修改:
- 修改ruoyi-generator/src/main/resources/vm目录下的相关代码文件
- 首先是domain,继承了CommonEntity类,只需要添加自身属性即可
package ${packageName}.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.baomidou.mybatisplus.annotation.TableName;
#foreach ($import in $importList)
import ${import};
#end
import com.ruoyi.common.annotation.Excel;
#if($table.crud || $table.sub)
import com.ruoyi.common.core.domain.CommonEntity;
#elseif($table.tree)
import com.ruoyi.common.core.domain.TreeStringIdEntity;
#end
/**
* ${functionName}对象 ${tableName}
*
* @author eddie
* @date ${datetime}
*/
#if($table.crud || $table.sub)
#set($Entity="CommonEntity")
#elseif($table.tree)
#set($Entity="TreeStringIdEntity")
#end
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "${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 HH:mm:ss")
@Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
#else
@Excel(name = "${comment}")
#end
#end
#if($column.javaField == "id")
@TableId(type = IdType.AUTO)
#end
private $column.javaType $column.javaField;
#end
#end
#if($table.sub)
/** $table.subTable.functionName信息 */
@TableField(exist = false)
private List<${subClassName}> ${subclassName}List;
#end
}
2.Mapper文件,去掉了原有增删改查方法块,优化为继承mybatisplusBaseMapper类,使其具备基础的增删改查方法。
package ${packageName}.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import ${packageName}.domain.${ClassName};
#if($table.sub)
import ${packageName}.domain .${subClassName};
#end
/**
* ${functionName}Mapper接口
*
* @author ${author}
* @date ${datetime}
*/
@Mapper
public interface ${ClassName}Mapper extends BaseMapper<${ClassName}> {
}
3.Mapper.xml,去掉原有增删改查代码,优化为单一的resultMap定义(也可以不要)原因是已经继承了BaseMapper文件所以这些都不需要了。根据业务场景添加自己的方法即可。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//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
</mapper>
4.Service类,同理集成mybatisplus的IService接口类,去掉了之前的增删改查代码。
package ${packageName}.service;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import ${packageName}.domain.${ClassName};
/**
* ${functionName}Service接口
*
* @author ${author}
* @date ${datetime}
*/
public interface I${ClassName}Service extends IService<${ClassName}> {
}
5.ServiceImpl类
package ${packageName}.service.impl;
import java.util.List;
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.beans.factory.annotation.Autowired;
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 {
@Autowired
private ${ClassName}Mapper ${className}Mapper;
}
6.Controller类
package ${packageName}.controller.${moduleName};
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
{
@Autowired
private 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(new QueryWrapper<>(${className}));
return getDataTable(list);
}
#elseif($table.tree)
public AjaxResult list(${ClassName} ${className}) {
List<${ClassName}> list = ${className}Service.list(new QueryWrapper<>(${className}));
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(new QueryWrapper<>(${className}));
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)
@PostMapping
public AjaxResult add(@RequestBody ${ClassName} ${className})
{
return toAjax(${className}Service.save(${className}));
}
/**
* 修改${functionName}
*/
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')")
@Log(title = "${functionName}", businessType = BusinessType.UPDATE)
@PutMapping
public 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 ${pkColumn.javaType}[] ${pkColumn.javaField}s)
{
return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s));
}
}
通过以上配置就可以实现代码生成后无需改动过多文件就可以集成Mybatisplus在你的项目代码中了。
更多推荐
所有评论(0)