若依框架 MyBatis 改为 MyBatis-Plus 的实现步骤

news2024/11/24 20:29:17

本文只做了简单的实现,具体的细节需根据自己的需求进一步实现。如果实现中遇到问题欢迎留言讨论。

引入 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.xml
  configuration:
    cache-enabled: true
    use-generated-keys: true
    default-executor-type: simple
    log-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 {

    @Bean
    public 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")
        #end
    private $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
{
    @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();
        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)
    @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 List<Integer> ${pkColumn.javaField}s)
    {
        return toAjax(${className}Service.removeBatchByIds(${pkColumn.javaField}s));
    }
}

 mapper.xml.vm

<?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

    <sql id="select${ClassName}Vo">
        select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName}
    </sql>

</mapper>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2091285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【hot100篇-python刷题记录】【三数之和】

R7-双指针篇 思路&#xff1a; 三个元素&#xff0c;代表需要3个指针&#xff0c;利用双指针收缩的思想&#xff0c;我们可以设置k,i,j三个元素指针。 k代表最外层的循环&#xff0c;循环一遍数组。&#xff08;为了降低时间复杂度以及搜索难度&#xff0c;我们先将nums sort…

移动硬盘文件夹变成白色无法正常访问,怎么恢复?

在使用移动硬盘时&#xff0c;有时会遇到文件夹变白的情况。这通常意味着文件夹已经损坏或无法正常访问。本文将分析移动硬盘文件夹变白的原因&#xff0c;并提供相应的恢复方法。 一、原因分析 文件系统损坏&#xff1a;移动硬盘的文件系统可能因多种原因而损坏&#xff0c;如…

001集——CAD—C#二次开发入门——开发环境基本设置

CAD C#二次开发首先需要搭建一个舒服的开发环境&#xff0c;软件安装后&#xff0c;需要修改相关设置。本文为保姆级入门搭建开发环境教程&#xff0c;默认已成功安装vs和cad 。 第一步&#xff1a;创建类库 第二步&#xff1a;进行相关设置&#xff0c;如图&#xff1a; 下一…

milvus资源限制 benchmarker压测 qps优化

根据milvus 资源限制的官网&#xff0c;我们得出百万数据资源限制。 1.dev 环境 对接不同的配置最大的qps 如下(dev的机器内存很小) 2.于是认为当前的性能是匹配的&#xff0c;然后加上资源限制&#xff0c;配置 压测结果如下 {"run_id": "13292982fee74f64…

基于springboot+vue的民族文化推广系统设计与实现---附源码92323

摘 要 在全球化和信息化日益加深的当下&#xff0c;保护和推广民族文化显得尤为重要。民族文化不仅是一个国家或地区的独特标识&#xff0c;更是其历史、传统和智慧的结晶。然而&#xff0c;随着现代社会的快速发展&#xff0c;许多传统文化和习俗面临着被遗忘和消失的风险。因…

ssh---配置密钥对验证

1&#xff0e;在客户端创建密钥对 ssh-keygen -t ecdsa秘钥存放位置&#xff08;生成密钥时的用户的工作目录下&#xff09; 2&#xff0e;将公钥文件上传至服务器 3&#xff0e;在服务器中导入公钥文本 4.在客户机设置ssh代理功能&#xff0c;实现免交互登录 5.测试

Python自适应光学模态星形小波分析和像差算法

&#x1f3af;要点 &#x1f3af;星形小波分析像差测量 | &#x1f3af;对比傅里叶和小波分析 | &#x1f3af;定义多尺度图像质量度量&#xff0c;矩阵数据 | &#x1f3af;像差校正算法 | &#x1f3af;受激发射损耗显微镜布局 | &#x1f3af;干涉仪分支校准&#xff0c;求…

Java 虚方法表(虚函数)

虚方法表 Java 中的虚方法表&#xff08;Virtual Method Table, VMT&#xff09;是实现动态方法分派和多态的重要机制。它帮助 Java 运行时系统&#xff08;JVM&#xff09;决定在继承体系中调用哪一个方法的具体实现。 什么是虚方法表&#xff1f; 虚方法表是一个类的内部数…

Linux学习笔记(4)----通过网口灯判断网速是千兆还是百兆

网卡PHY 移植注意事项 注意RTL8211F的LED0&#xff0c;LED1&#xff0c;LED2&#xff0c;软件是可以自定义的&#xff0c;比如百兆&#xff0c;千兆&#xff0c;是亮哪个灯&#xff0c;黄灯或者绿灯&#xff0c;还有传输时是闪烁哪个灯&#xff0c;要注意硬件上是怎么驱动灯的…

获取当前计算机的处理器架构platform.machine()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 获取当前计算机的处理器架构 platform.machine() 选择题 关于以下代码的输出结果说法正确的是&#xff1f; import platform print("【执行】print(platform.machine())") prin…

Websocket测试工具,在线调试 - 在线工具

WebSocket 测试工具是用于测试 WebSocket 连接、发送和接收消息的工具。它们通常提供一个简单的用户界面&#xff0c;使开发人员能够快速验证 WebSocket 服务器的功能和性能。 在线Websocket测试工具体验地址&#xff1a;https://ewbang.com/websocket/index.html 什么是 WebSo…

具身智能(Embodied Intelligence)概述

目录 一、引言 二、具身感知 三、具身交互 四、具身智能体 五、虚拟到现实 一、引言 最近无论是斯坦福机器人炒虾&#xff0c;还是特斯拉官宣机器人进厂&#xff0c;都赚足了眼球&#xff0c;实力证明了具身智能&#xff08;Embodied Intelligence&#xff09;的火爆。…

SEO之网站结构优化(十四-内部链接及权重分配2)

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客&#xff1a;阿幸SEO~探索搜索排名之道 4、翻页过多 稍大型的商务…

无心剑中译莎士比亚《无君相伴浸寒冬》

莎士比亚十四行诗第98首 Sonnet 98 无君相伴浸寒冬 From you have I been absent in the spring, When proud pied April, dressed in all his trim, Hath put a spirit of youth in every thing, That heavy Saturn laughed and leapt with him. Yet nor the lays of birds,…

Python | Leetcode Python题解之第385题迷你语法分析器

题目&#xff1a; 题解&#xff1a; class Solution:def deserialize(self, s: str) -> NestedInteger:index 0def dfs() -> NestedInteger:nonlocal indexif s[index] [:index 1ni NestedInteger()while s[index] ! ]:ni.add(dfs())if s[index] ,:index 1index …

Vue3项目开发——新闻发布管理系统(四)

文章目录 七、登录&注册页面设计开发2、登录&注册页面设计3、表单校验规则设置七、登录&注册页面设计开发 2、登录&注册页面设计 登录页面如下: 点击“注册 →”,切换到注册页面: 点击“← 返回”,又可以切换回登录页面。 页面布局是这么设计的: 1…

保姆级Maven安装、配置、版本查询教程(包含配置本地仓库、阿里云私服、环境变量)

文章目录 一、Maven安装1. 下载zip包2. 解压 zip包 二、配置1. 配置本地仓库2. 配置阿里云私服3. 配置环境变量 三、Maven验证 此教程摘选自我的笔记&#xff1a;黑马JavaWeb开发笔记11——Maven介绍、详细安装、环境配置步骤教程&#xff0c;想要了解Maven组成和作用可以移步此…

中国各地区数字经济发展对环境污染的影响数据(2011-2021年)

关于中国各地区数字经济发展对环境污染的影响数据&#xff08;2011-2021年&#xff09;&#xff0c;可以从以下几个方面获取相关信息&#xff1a; 数字经济水平&#xff1a;可以通过熵值法衡量的数字经济水平指标来评估各地区的数字经济发展情况。 环境污染物排放量&#xff1…

桥梁在线监测解决方案:科技赋能,守护桥梁安全

在现代社会&#xff0c;桥梁作为连接城市与乡村、跨越河流与峡谷的重要交通设施&#xff0c;其安全性和稳定性直接关系到人民生命财产的安全以及经济社会的正常运转。然而&#xff0c;桥梁在长期使用过程中&#xff0c;会受到自然环境、车辆荷载、材料老化等多种因素的影响&…

中国各地区-城市创新和产业创新指数(2001-2021年)

数据及指标 年份、行业代码、行业名称、大类行业、产业创新指数、城市代码、城市、省份、城市创新指数。 2001-2021年 中国各地区-城市创新和产业创新指数https://download.csdn.net/download/2401_84585615/89504735 中国各地区在城市创新和产业创新指数方面有显著的发展和…