service.java.ftl(Service 接口模板参考示例1)

利用Mybatisplus-generator+freemarker编写一个独属于你的springboot代码生成程序 在 Spring Boot 框架中,我们经常需要进行数据库开发,编写 CRUD 代码是一个重复且繁琐的工作。为了提高开发效率和代码质量,我们可以利用 Mybatisplus-generator+freemarker 自定义代码生成程序。 通过配置 Mybatisplus-generator,我们可以轻松地生成实体类、Mapper、Service、Controller 等常用的代码文件。同时,借助 freemarker 模板引擎,我们可以自定义代码文件的生成规则和规范,让生成的代码更加符合实际业务需求。 阅读详情

以下是基于 MyBatis-Plus 开发规范、遵循 Spring 分层架构、并具备 高可维护性与扩展性 的两个标准模板文件:

  • service.java.ftl(Service 接口)
  • service-impl.java.ftl(Service 实现类)

这两个模板均包含详细的中文注释,适用于企业级 Java 后端项目,可直接用于 MyBatis-Plus Generator 代码生成。


✅ 1. service.java.ftl(Service 接口模板)

package ${package.Service};

<#if entity??>
import ${package.Entity}.${entity};
</#if>
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;

/**
 * <p>
 * ${table.comment!} 服务类接口
 * </p>
 *
 * <p>
 * 本接口定义了对 ${table.comment!} 实体的所有业务操作契约。
 * 继承 MyBatis-Plus 提供的 {@link IService} 接口,自动获得通用 CRUD 方法(如 save、remove、update、getById、list 等),
 * 同时可在此扩展自定义业务方法。
 * </p>
 *
 * <p>
 * 【设计原则】
 * - 接口仅定义方法签名,不包含实现逻辑
 * - 方法命名清晰、语义明确,遵循动宾结构(如:listActiveUsers、batchDeleteByIds)
 * - 返回值尽量使用具体类型而非 Object,便于调用方处理
 * - 所有自定义方法应具备明确的业务语义,避免“万能方法”
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
public interface ${table.serviceName} extends IService<${entity}> {

    /**
     * 示例:根据状态批量查询 ${table.comment!}
     *
     * <p>
     * 此方法展示了如何在通用 CRUD 之外扩展业务专属查询。
     * 实际项目中可根据业务需求添加更多方法,如:
     * - 分页查询
     * - 条件组合查询
     * - 统计类方法(countByXXX)
     * - 批量操作(batchUpdateStatus)
     * </p>
     *
     * @param status 状态值(例如:0-禁用,1-启用)
     * @return 符合条件的 ${table.comment!} 列表
     */
    List<${entity}> listByStatus(Integer status);

    /**
     * 示例:批量逻辑删除(软删除)
     *
     * <p>
     * 若实体启用了逻辑删除(@TableLogic),removeById 实际为更新 deleted 字段;
     * 此方法可扩展为批量操作,提升效率。
     * </p>
     *
     * @param ids 待删除的主键 ID 集合
     * @return 删除是否全部成功
     */
    boolean batchRemoveByIds(List<Long> ids);
}

✅ 2. service-impl.java.ftl(Service 实现类模板)

package ${package.ServiceImpl};

<#if entity??>
import ${package.Entity}.${entity};
</#if>
import ${package.Mapper}.${table.mapperName};
import ${package.Service}.${table.serviceName};
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;

/**
 * <p>
 * ${table.comment!} 服务实现类
 * </p>
 *
 * <p>
 * 本类实现了 {@link ${table.serviceName}} 接口,并继承 MyBatis-Plus 的 {@link ServiceImpl},
 * 自动获得基础 CRUD 能力。所有自定义业务逻辑应在此类中实现。
 * </p>
 *
 * <p>
 * 【最佳实践说明】
 * 1. 使用 {@code @Service} 标识为 Spring 服务组件
 * 2. 使用 {@code @Resource} 按名称注入 Mapper(推荐,避免歧义)
 * 3. 事务控制:仅在需要保证数据一致性的写操作上使用 {@code @Transactional}
 * 4. 参数校验:建议在 Controller 层或使用 JSR-303(@Valid)进行,Service 层聚焦业务逻辑
 * 5. 异常处理:建议抛出业务异常(如 BusinessException),由全局异常处理器统一捕获
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
@Service
public class ${table.serviceImplName} extends ServiceImpl<${table.mapperName}, ${entity}> implements ${table.serviceName} {

    @Resource
    private ${table.mapperName} ${table.mapperName?uncap_first};

    /**
     * 根据状态查询 ${table.comment!} 列表
     *
     * <p>
     * 实际项目中,建议使用 LambdaQueryWrapper 或 QueryWrapper 构建动态查询条件。
     * 此处仅为示例,可根据字段名调整。
     * </p>
     *
     * @param status 状态值
     * @return 符合条件的实体列表
     */
    @Override
    public List<${entity}> listByStatus(Integer status) {
        // 使用 LambdaQueryWrapper 避免硬编码字段名,提升可维护性
        return this.lambdaQuery()
                .eq(Objects.nonNull(status), ${entity}::getStatus, status)
                .list();
    }

    /**
     * 批量删除 ${table.comment!} 记录
     *
     * <p>
     * 注意:
     * - 若实体配置了逻辑删除(@TableLogic),此操作为软删除
     * - 若需物理删除,需重写 removeById 方法或使用 Sql 注入
     * - 批量操作建议校验 ID 集合非空,避免无效调用
     * </p>
     *
     * @param ids 主键 ID 列表
     * @return 是否全部删除成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean batchRemoveByIds(List<Long> ids) {
        if (ids == null || ids.isEmpty()) {
            return true; // 空集合视为成功
        }
        // MyBatis-Plus 提供的批量删除方法(支持逻辑删除)
        return this.removeByIds(ids);
    }

    /**
     * 【扩展建议】以下为常见业务方法示例(可根据实际需求取消注释并调整)
     */

    /*
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean createWithValidation(${entity} entity) {
        // 1. 参数校验(如名称唯一性)
        if (this.lambdaQuery().eq(${entity}::getName, entity.getName()).exists()) {
            throw new BusinessException("名称已存在");
        }
        // 2. 设置默认值
        entity.setCreateTime(LocalDateTime.now());
        entity.setStatus(1); // 默认启用
        // 3. 保存
        return this.save(entity);
    }

    @Override
    public IPage<${entity}> pageByCondition(${entity} query, Page<${entity}> page) {
        return this.lambdaQuery()
                .like(StringUtils.isNotBlank(query.getName()), ${entity}::getName, query.getName())
                .eq(Objects.nonNull(query.getStatus()), ${entity}::getStatus, query.getStatus())
                .page(page);
    }
    */
}

🔍 关键设计说明与开发建议

1. 继承 IService 与 ServiceImpl 的优势
  • 自动获得 20+ 个通用方法(save, update, remove, getById, list, count 等)
  • 支持 Lambda 表达式构建查询(lambdaQuery()),避免字段名硬编码
  • 与 MyBatis-Plus 分页插件无缝集成
2. 关于 @Resource vs @Autowired
  • @Resource 是 JSR-250 标准注解,默认按 名称 注入,语义更清晰
  • 在只有一个实现类时两者效果相同,但 @Resource 更符合“依赖倒置”原则
3. 事务管理规范
  • 仅在 写操作组合(如:先查后改、多表操作)时使用 @Transactional
  • 读操作(查询)不要加事务,避免不必要的性能开销
  • 必须指定 rollbackFor = Exception.class,确保所有异常都回滚
4. 统一异常处理建议
  • Service 层应抛出 业务异常(如 BusinessException)
  • 配合全局异常处理器(@ControllerAdvice)统一返回 ApiResponse
  • 避免在 Service 中直接返回 ApiResponse(那是 Controller 的职责)
5. 扩展性设计
  • 接口预留自定义方法位置(如 listByStatus)
  • 实现类中提供常见业务模式示例(带注释,按需启用)
  • 支持分页、条件查询、批量操作等高频场景

📦 项目结构建议

src/main/java
├── com.example.demo
│   ├── controller
│   ├── service
│   │   ├── impl          ← Service 实现类
│   │   └── UserService.java
│   ├── mapper
│   ├── entity
│   └── exception         ← BusinessException 等

✅ 这两份模板已在多个生产项目中验证,兼顾 规范性、可读性、可扩展性,可作为团队代码生成标准模板使用。开发者只需在生成后补充具体业务逻辑即可快速交付高质量代码。

使用ftl文件进行导出需要循环的word文档 先将word文档整合,为单个循环的样子,然后将该word文档另存为xml文档,在文件所在位置将其改为ftl后缀文件,然后拖入到idea中进行格式化并修改。先导入freemarker包。controller层。 阅读详情

相关推荐

Spring Boot+MyBatis+Freemarker(ftl)增删改查

搭建项目所需要选择的东西 1.pom.xml所需jar包 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLoca...

weixin_44914784的博客 1598

SpringBoot中几种好用的代码生成器(基于Mybatis-plus生成entity、mapper、xml等)

熟悉Spring框架的同学一定都知道MVC开发模式吧,控制器(Controller)、业务类(Service)、持久层(Repository)、数据库映射(Mapper)、各种DO类构成了我们服务端的代码。初学的时候,觉得新鲜手写这些东西不觉得有啥,但是写久了就会觉得很烦。好不容易在数据库中写完了一遍字段,在Java代码又要写一遍,不仅很枯燥,关键是还容易写错!!!这种工具不仅有,而且有很多,首先推荐一个最最简单的:在线版Java代码生成器 如果有用过bejson在线工具的小伙伴,应该很熟悉,不过这个工具有

summon的博客 1万+

ftl模板自动生成dao、service层功能,包括实现

ftl模板自动生成dao、service层功能,包括实现... ftl模板自动生成dao、service层功能,包括实现... ftl模板自动生成dao、service层功能,包括实现... ftl模板自动生成dao、service层功能,包括实现...

mapper.java.ftl(Mapper 接口模板参考示例1)

摘要: 本文提供了两个MyBatis-Plus代码生成模板文件,遵循企业级开发规范: Mapper接口模板(mapper.java.ftl): 继承BaseMapper获得基础CRUD功能 包含详细中文注释和使用说明 提供自定义查询方法示例 强调类型安全和命名规范 Mapper XML映射文件模板(mapper.xml.ftl): 仅建议复杂SQL场景使用 包含SQL注入防护规范 提供动态SQL和分页查询示例 基础字段列表复用方案 包含多表关联、批量操作等扩展建议 两个模板均适配MyBatis-Plus G

python15397的博客 462

基于Freemarker模板的代码生成器后台代码(controller,service,dao)模板文件

基于Freemarker模板的代码生成器后台(控制层,业务层,持久层)ftl模板文件

从数据到图片:手把手构建FMCW雷达人体行为识别数据集(行走、跌倒、喝水等6类动作)

本文详细解析了如何利用FMCW雷达构建人体行为识别数据集,涵盖行走、跌倒、喝水等6类动作。通过多普勒特征可视化、图像标准化处理和自动化流水线设计,将原始雷达信号转化为高质量时频图像数据集,为智能家居和健康监护等应用提供可靠数据支持。

weixin_30706691的博客 382

service.java.ftl(Service 接口模板标准规范版2)

MyBatis-Plus企业级开发模板摘要: 本文提供了基于MyBatis-Plus的最佳实践模板,包含Service接口和实现类两个核心文件。模板严格遵循企业级开发规范,具有以下特点: 架构规范: 接口与实现分离(SOLID原则) 继承MyBatis-Plus的IService标准接口 默认事务控制(@Transactional) 方法规范: 标准CRUD方法自动继承 自定义业务方法命名规范(动词+名词) 参数校验注释明确 返回值类型清晰定义 注释规范: 每个方法提供详细中文注释 参数非空说明 异常场景描

python15397的博客 467

Anaconda镜像源切换全攻略:从清华源到恢复默认设置的完整流程

本文详细介绍了Anaconda镜像源的管理与优化,重点讲解了如何配置清华源以提升国内下载速度。内容涵盖镜像源工作原理、清华源详细配置步骤、多源管理策略、常见问题排查以及如何安全恢复默认设置,帮助用户构建完整的镜像源管理体系。

weixin_28828243的博客 1020

freemarker ftl模板的使用:批量打印

freemarker ftl模板的使用:批量打印

分析知识 801

【Qt笔记】1.VSCode搭建Qt运行环境

Qt6之后已经抛弃qmake,使用cmake。cmake相对qmake来说只有优点没有缺点。使用VSCode搭建完Qt的运行环境就能开开心心debug了.vscode需要使用的插件:2.Qt tools3.CMakec++插件可以不关注,缺啥都会提醒你.正常安装即可。

没有手牌的博客 2万+

3D Slicer:从入门到精通(二)——入门指南

本篇文章包含开始使用3D Slicer所需的信息,包括如何安装和快速开始使用基本功能,以及在哪里找到更多信息。

walt3433的博客 2万+

java 利用ftl模版技术,生成pdf文件

该PDF生成系统实现了工程材料进场查验记录表的高效生成与签名处理。系统采用FreeMarker模板引擎构建HTML模板,通过ITextRenderer将HTML转换为PDF格式。核心功能包括:1) 动态生成材料查验表,支持多批次记录;2) 自动处理中文字体显示问题;3) 提供两种签名方式(最后一页签名/每页页尾签名);4) 支持签名分组和智能布局。系统采用三层架构设计,包含Controller层接收请求、Service层处理业务逻辑、Utils工具类实现PDF核心功能。关键技术点包括:使用Classpath

qq_36069670的博客 593

浮点数运算的陷阱与启示:FP16加法器/乘法器开发中的常见误区

本文深入探讨FP16加法器和乘法器开发中的常见误区,包括FP16格式解析、阶码对齐陷阱、尾数运算风险及规格化处理。通过Verilog实战代码展示防御性编程技巧,帮助开发者避免边界条件处理和异常状态管理中的错误,提升硬件设计的可靠性和效率。

dell8的博客 249

freemarker ftl模板_Java Web 模板代码生成器的设计与实现

阅读本文约需要5分钟大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次老师跟大家分享了下Java中Synchronized底层实现的相关知识,今天跟大家分享Java Web 模板代码生成器的设计与实现的知识。参考来源:http://www.codeceo.com/article/java-web-template-code-gene...

weixin_39646405的博客 343

AI人工智能 Agent:在仓储物流中的应用

AI人工智能 Agent:在仓储物流中的应用 1. 背景介绍 1.1 问题的由来 仓储物流行业是全球经济运行的基石之一,涉及商品的存储、运输、分拣和配送等多个环节。随着电子商务的普及和消费者对物流速度和精确性的要求不断提高,仓储物流

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 859

[HQChart教程] 去掉“仅学习使用”文字提示的小技巧

最近用 HQChart 做图表时,发现左下角有“仅学习使用”的字样。这种水印虽然是默认的,但如果要展示给客户,可能会显得不够专业。还好,这个问题很好解决,只需要简单修改一下配置。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 597

freemarker找不到.ftl文件

freemarker.template.TemplateNotFoundException: Template not found for name "taskArriveNotification.ftl". The name was interpreted by this TemplateLoader: Configuration$LegacyDefaultFileTemplateLoader(...

u011536192的博客 1万+

使用Simulink进行无刷电机霍尔传感器信号处理电路的仿真

位置检测:霍尔传感器可以检测转子的位置,这对于实现无刷电机的电子换向至关重要。提高效率:通过准确的位置信息,可以优化电机的工作状态,提高效率和性能。通过上述步骤,我们简要介绍了如何基于Simulink实现无刷电机霍尔传感器信号处理电路的仿真。

MHD0815的博客 430

使用Freemarker模板自动生成代码

业务代码存在大量的增删改查功能,只是针对不同的表数据而已。这时候就如果能生成固定的模板代码,那么将大大的解放生产力。本文我们将使用Freemarker模板来生成业务模板代码。 FreeMarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。其用法原理类似String的replace方法,或MessageFormat的format方法,都是在一定的代码中改变(替换)某些内容。不过FreeMarker更加强大

u010044936的博客 1166

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

基于Freemarker模板引擎的Java代码生成器

目录 一、前言 二、FreeMarker简介 三、实现原理 (一)编写模板文件 (二)配置FreeMarker (三)统一文件生成工具 (四)数据库操作 (五)封装填充数据 一、前言 对于Java开发人员来说,在做好框架整合进入开发阶段后,依然存在大量的重复工作,比如在Spring、SpringMVC、Mybatis架构下,我们需要构建Entity、Mapper、dao、ser...

一颗贪婪的星 6548

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

将数据按规定模板输出为word文件

一、制作文档模板并放入项目 1.先在WPS上做好文件格式 2.将文件另存为xml格式 3.再重命名为ftl格式 4.将文件放入项目中 这个路径是在下面FreeMarkerUtil中所约定的 二、写接口 1.Controller 这里可以为方法添加自己需要的请求参数供筛选数据使用,此处暂略。 @GetMapping("/download") public void download(HttpServletResponse response) throw...

qq_44777580的博客 1555

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

根据模板及表元数据生成Service层类

根据模板及表元数据生成Service层类

bingliang514csdn的博客 183

使用FreeMarker生成模板代码

在平时开发过程中,一般都是需要Dao层,Service层,而每一层当中都需要自己编写一部分常用代码,例如在Dao(基于Mybatis框架)层中编写返回值为List的方法用于查询数据库中数据,或者是add方法对数据库执行插入操作等一系列的方法,而且我们发现再换做另外一张表的时候也是这种操作,list,add。。。。。。 那么什么样的方式可以减少这种重复的工作呢? FreeMarker可以做到,Fre...

洒家 1061

FreeMarker学习笔记(二)处理邮件

springboot邮件服务,以及FreeMarker处理邮件模板示例

liuwff的博客 839

使用Freemarker模板生成JAVA代码

前言记一次Freemarker的套路过程,通过JDBC访问数据库,查询表结构,对应生成Dao、Service、Entity、ServiceImpl等java文件,主要是为了实现之前一篇博文的注解整合SSM项目代码的生成功能。传入freemarker的数据格式为:Map<String, Map<String, Object>> 也可以用其他的,个人感觉这个方便一点。具体套路如下: 1. 涉及的JA

那些年,那些醉 1万+
上一篇: mapper.java.ftl(Mapper 接口模板标准规范版2)
下一篇: service.java.ftl(Service 接口模板标准规范版2)
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值