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,如需集成可按以下步骤修改:

  1. 修改ruoyi-generator/src/main/resources/vm目录下的相关代码文件
  2. 首先是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在你的项目代码中了。

    Logo

    有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

    更多推荐