一、自定义实现MyBatis-Plus逆向工程

多数据源的问题解决了,接下来开始进行实际开发时,你会发现,最麻烦的一件事情就是要创建与数据库表对应的POJO了。这些没什么难度,但是繁琐的内容会占据大量的开发时间。比如一个PmsProducr对象,有三四十个属性。这就需要开发一个庞大的POJO对象。相反,上层的CRUD操作则相当简单。只需要继承MyBatis-plus框架提供的BaseMapper接口即可。

@DS("goods")
public interface PmsProductMapper extends BaseMapper<PmsProduct> {
}

 标准的CRUD操作完全都不需要进行声明,直接就可以拿来用。只需要补充一些复杂的SQL操作即可。接下来当然是希望能够用程序快速自动的生成这些POJO类了,这样可以节省大量的开发时间。
关于如何生成POJO类,你当然可以使用MyBatis的逆向工程或者MyBatis-plus的逆向工程,这些网上有大量的资料,我们这里就不多做介绍。但是,你会不会有一种感觉,这些通用的逆向工程虽然优秀,但是却都太过复杂。他
们为了工具的通用性,做了很多对我们没有用的封装。你有没有想过自己做一个简单使用的逆向工程出来呢?做一些这样的思考会让你对枯燥的CRUD工作产生一些不一样的想法。
其实你可以思考一下,需要根据数据库的表创建出对应的POJO类,需要哪些信息? 其实要的信息并不多。表名、列名、列类型、主键信息。有这些就差不多了。而这些信息,其实都可以从最简单的JDBC操作中获取到。

public static void main(String[] args) throws Exception {//mysqlClass.forName("com.mysql.cj.jdbc.Driver");Properties props = new Properties();props.put("useInformationSchema", "true"); //mysql获取表注释需要加上这个属性props.put("user", "root");props.put("password", "root");Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/genserver?serverTimezone=GMT%2B8&characterEncoding=utf-8&autoReconnect=true",props);System.out.println("========映射表信息==============");DatabaseMetaData meta = con.getMetaData();ResultSet tables = meta.getTables("genserver", "%", "black_info", new String[]{"TABLE"});while(tables.next()) {ResultSetMetaData metaData = tables.getMetaData();System.out.println(metaData.getColumnCount());for(int i = 1 ; i <= metaData.getColumnCount(); i ++) {System.out.println(metaData.getColumnName(i)+" ==>"+tables.getString(metaData.getColumnName(i)));}System.out.println(tables.getString("TABLE_NAME")+" --->>>"+tables.getString("REMARKS"));}System.out.println("========映射列信息==============");ResultSet columns = meta.getColumns("genserver", "%", "black_info", "%");while(columns.next()) {String columnName = columns.getString("COLUMN_NAME");String columnType = columns.getString("TYPE_NAME");int datasize = columns.getInt("COLUMN_SIZE");int digits = columns.getInt("DECIMAL_DIGITS");int nullable = columns.getInt("NULLABLE");String remarks = columns.getString("REMARKS");System.out.println(columnName+" "+columnType+" "+datasize+" "+digits+" "+nullable+" "+remarks);}System.out.println("========映射主键信息==============");ResultSet primaryKeys = meta.getPrimaryKeys("genserver", "%", "black_info");while(primaryKeys.next()) {ResultSetMetaData metaData = primaryKeys.getMetaData();System.out.println(metaData.getColumnCount());for(int i = 1 ; i <= metaData.getColumnCount(); i ++) {System.out.println(metaData.getColumnName(i)+" ==>"+primaryKeys.getString(metaData.getColumnName(i)));}}
}

接下来如何将这些信息拼凑成一个POJO呢?你可以使用一个StringBuˌer,一点点拼接出POJO的完整代码,再一次输出到文件当中,这没有问题。但是这样显然会比较麻烦,而且容易出错。

MyBatis的逆向工程使用的就是这种方式。

二、使用Freemarker模板引擎实现一键开发模式

对于这种问题,其实可以用模版引擎来做。将代码中静态的部分写到模版当中,然后将动态部分交由模版生成。最为常用的模版引擎就是freemarker了。大部分场景下,freemarker通常是用来生成静态HTML页面的。比如在我们的电商场景中,就实现了对产品单品页的静态化功能。

使用静态化功能,需要你创建 %{user_home}\template\ftl\目录下放置report.ftl模版文件,同时需要提前创建 %{user_home}\template\report目录 

freemarker是一个基于模版和数据输出文本的通用工具。只需要准备好动态的业务数据,以及基于FTL语言编写的模版文件,就可以快生成静态的文本。 

如果你对freemarker不是很了解,可以从这个示例中快速理解freemarker模版引擎。这个引擎上手非常简单,对于有开发经验的你,肯定没什么问题。按照以下几个步骤就可以快速上手freemarker了。

1、引入maven依赖

<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version>
</dependency>

 2、构建后台数据

public class FreemarkerTest {public static void main(String[] args) throws Exception {// 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。Configuration configuration = new Configuration(Configuration.getVersion());// 第二步:设置模板文件所在的路径。configuration.setDirectoryForTemplateLoading(new File("D:\\ftl"));// 第三步:设置模板文件使用的字符集。一般就是utf‐8.注意版本。新版本不需要// configuration.setDefaultEncoding("UTF‐8");// 第四步:加载一个模板,创建一个模板对象。Template template = configuration.getTemplate("test.ftl");// 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。Map dataModel = new HashMap<>();//向数据集中添加数据dataModel.put("hello", "图灵学院电商VIP");// 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。Writer out = new FileWriter(new File("D:\\ftl\\out\\test.html"));// 第七步:调用模板对象的process方法输出文件。template.process(dataModel, out);// 第八步:关闭流。out.close();}
}

3、编写ftl模版文件


最简单模版文件就长这样

<h1>
${hello}
</h1>

执行完成后,就会将模版中的${hello}部分替换成 图灵学院电商VIP
一个ftl模版文件,是由少数几个动态标签加上其他静态的内容组成。动态标签包含以下几种:

  • 普通参数
    例如${hello}

  • list标签

    <#list studentList as student>
    student.id/{student.id}/student.id/{studnet.name}
    </#list>

  • if条件标签

    <#if student_index % 2 == 0>
    <#else>
    </#if>

在if标签中,还可以进行简单的null值判断

<#if a??>
a不为空时。。
<#else>
a为空时###
</#if>
  • 日期标签

    当前日期: date?date当前时间:{date?date} 当前时间:date?date当前时间:{date?time}
    当前日期和时间:date?datetime自定义日期格式:{date?datetime} 自定义日期格式:date?datetime自定义日期格式:{date?string("yyyyMM/dd HH:mm: ss")}

  • 包含标签

    <#include "hello.ftl"/>

接下来如果你发挥一些想象,freemarker既然可以生成html文件,那是不是可以用来生成java源文件呢?显然是可以的。

 能够自己生成POJO了,那是不是可以把Service、Mapper、Controller等等这些重复性的代码一起生成呢?实际上,如果你有这种规范化的思想,你甚至可以将前台页面都一并生成了。减少大部分的复制粘贴的重复工作。

最后,有了这个示例后,再来理解MyBatis-plus的逆向工程就非常容易了。 引入对应的依赖.

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.0.5</version>
</dependency>

 之后进入引入的jar包中,就能看到,MyBatis-plus的逆向工程也是使用freemarker和velocity提供的模版完成的逆向工程。

vm是velocity框架的模版文件。velocity是和freemarker功能类似的一个模版引擎。
后续在设计秒杀场景时,也会使用freemarker自动生成前端商品单品页,实现动态页面静态化。

然后,发挥一下你自己的想象力,你还可以给这样简单的CRUD项目还能添加哪些与众不同的,实用的设计?比如,MyBatis-plus使用模板引擎生成了后端代码, 那么,对于一些长得差不多的数据管理页面,我们能不能也使用模板引擎,把前台页面到后端管理的全栈功能都一起开发出来呢?

三、结合CBoard报表工具实现拖拽式报表开发

当我们将前后端整合到一起之后,就可以继续发挥想象力,给普通的CRUD工作带来一些不一样的乐趣。
CBoard是一款开源的拖拽式报表开发工具,前端使用的是和我们项目一样的VUE技术。那么,可不可以做这样的设想,把CBoard中最后展现报表的前端页面挪用到我们的前端项目中,然后将后端请求通过Dubbo开放出来,这样我们就可以用很小的代码集成一套拖拽式的报表开发工具了。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无代码测试平台ATECLOUD全场景测试方案

ATECLOUD 智能云测试平台是有纳米软件开发的一款以无代码架构与弹性扩展体系为核心的自动化测试平台&#xff0c;通过数据模型驱动的创新设计&#xff0c;为研发、产线等多场景提供高效可控的测试解决方案。​无代码架构 ATECLOUD 打破传统技术壁垒&#xff0c;构建完全可视化的…

当 AI 重构审计流程,CISA 认证为何成为破局关键

在南京审计大学最新发布的《面向审计行业 DeepSeek 大模型操作指南》中&#xff0c;一组数据引发行业深思&#xff1a;通过自动化数据处理、智能风险识别和定制化报告生成&#xff0c;AI 大模型能帮助审计人员降低 40% 以上的人工成本&#xff0c;同时将风险识别准确率提升至 9…

NAT技术、代理服务器

NAT/NAPT技术NAT的全称是network address translation&#xff0c;网络地址转换。NAT 能在对外通信时够将源 IP 转为新源 IP&#xff0c;对内通信时将目的ip转换成新目的ip&#xff0c;实现这个操作&#xff0c;靠的是地址转换表但NAT的说法其实是不准确的&#xff0c;因为多个…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-45,(知识点:负反馈的作用,基础理解,干扰和噪声的抑制)

目录 1、题目 2、解答 步骤一&#xff1a;明确负反馈的作用原理 步骤二&#xff1a;逐一分析选项 3、相关知识点 一、负反馈的基本原理 二、负反馈对干扰和噪声的抑制机制 三、选项分析与答案 四、扩展思考&#xff1a;如何抑制不同位置的干扰&#xff1f; 总结 题目…

Flutter蓝牙BLE开发完全指南(内含高级功能扩展)

Flutter蓝牙BLE开发完全指南 我将为您提供一个完整的Flutter蓝牙BLE实现方案,包含UI设计、权限处理、设备扫描、连接通信等完整功能。 完整实现方案 1. 添加依赖与权限配置 pubspec.yaml dependencies:flutter:sdk: flutterflutter_blue_plus: ^1.10.0permission_handler…

使用 Canvas 替代 <video> 标签加载并渲染视频

在部分浏览器环境或业务场景下&#xff0c;直接使用 <video> 标签加载视频会出现首帧延迟的情况。以下方法通过 WebGPU Canvas 2D 将视频帧绘制到自定义 Canvas 上&#xff0c;让 <video> 只做解码&#xff0c;WebGPU 接管渲染&#xff0c;通过最小化对象创建 精…

基于Flask的智能停车场管理系统开发实践

在现代城市中&#xff0c;停车难已成为一个普遍问题。为了解决这一问题&#xff0c;我开发了一个基于Python Flask框架的智能停车场管理系统。该系统集成了车牌识别、车位状态监控、收费管理等多项功能&#xff0c;为停车场的智能化管理提供了完整的解决方案。系统功能概述该停…

【C#获取高精度时间】

在C#中&#xff0c;有几种方法可以获取高精度时间&#xff08;高分辨率时间戳&#xff09;&#xff0c;适用于性能测量、计时等需要高精度的场景。以下是几种常用方法&#xff1a; 1. 使用 Stopwatch 类&#xff08;推荐&#xff09; Stopwatch 类提供了最高精度的时间测量&…

Spring Boot + React 打造现代化高校成绩管理系统实战记录

作者: 笙囧同学 发布时间: 2025年7月 技术栈: Spring Boot 3.2.3 React 18 TypeScript 华为云GaussDB 项目类型: 全栈Web应用 开发周期: 30天 代码量: 15000 行 &#x1f4d6; 前言 大家好&#xff0c;我是笙囧同学&#xff01;&#x1f64b;‍♂️ 作为一名计算机科学与技…

形参表不匹配(BUG)

在您的代码中&#xff0c;存在两个主要问题导致"形参表中不匹配"的错误&#xff1a;erase() 函数中的成员变量名错误iterator erase(iterator pos) {// ...size--; // ❌ 错误&#xff1a;成员变量名为 _size 而非 sizereturn iterator(next); }修正&#xff1a;ite…

Spring循环依赖以及三个级别缓存

Spring循环依赖以及三个级别缓存 什么是循环依赖&#xff1f; 循环依赖&#xff0c;顾名思义&#xff0c;就是指两个或多个 Spring Bean 之间相互依赖&#xff0c;形成一个闭环。 最常见也是 Spring 能够“解决”的循环依赖是构造器注入 和 setter 注入 混合或单独使用时&…

《零基础入门AI:OpenCV图像预处理进一步学习》

本文全面讲解OpenCV图像预处理的七大核心技术&#xff08;插值方法、边缘填充、图像矫正&#xff08;透视变换&#xff09;、图像掩膜、ROI切割、图像添加水印、图像噪点消除&#xff09;&#xff0c;每个知识点都配有详细解释和实用代码示例&#xff0c;帮助初学者建立系统的图…

MongoDB的内存和核心数对于运行效率的影响

在 MongoDB 线上生产环境中&#xff0c;CPU&#xff08;核心&#xff09; 和 内存 是两大关键硬件资源&#xff0c;它们在不同的操作场景下发挥着核心作用&#xff0c;共同影响着数据库的性能、稳定性和扩展性。理解它们的作用场景至关重要&#xff0c;是容量规划、性能优化和故…

自己的SAPGUI尝试

为满足用户需求&#xff0c;博主做了一个台账管理程序&#xff0c;尝试用自己的程序做GUI&#xff0c;用SAP 系统做数据库。 运行了半年&#xff0c;程序很nice,用户每天都在高效的使用&#xff0c;已经有十几万的数据。 总结一下这次自己的GUI尝试&#xff0c;好处是C# WINFOR…

高效处理 JSON 数据:JsonUtil 工具类全方位解析与实战

在现代软件开发中,JSON(JavaScript Object Notation)已成为数据交换的“通用语言”——从前后端接口通信到微服务数据交互,从配置文件解析到日志格式化,几乎所有场景都离不开JSON的处理。然而,原生JSON框架(如FastJSON、Jackson)的API往往需要大量重复代码,且空指针、…

Python 库手册:xmlrpc.client 与 xmlrpc.server 模块

xmlrpc.client 和 xmlrpc.server 是 Python 标准库中用于构建基于 XML-RPC 协议的远程过程调用&#xff08;RPC&#xff09;通信模块。xmlrpc.client 用于编写客户端程序&#xff0c;向远程服务器发起方法调用。xmlrpc.server 用于编写服务器端&#xff0c;暴露本地方法供远程客…

渲染篇(一):从零实现一个“微型React”:Virtual DOM的真面目

渲染篇(一)&#xff1a;从零实现一个“微型React”&#xff1a;Virtual DOM的真面目 引子&#xff1a;前端性能的“永恒之问” 在前面两章中&#xff0c;我们已经奠定了坚实的架构基础。我们用“任务调度器”建立了声明式和模块化的编程范式&#xff0c;并通过对比MVC等模式论…

SWC 深入全面讲解

一、核心功能与原理 1. 高性能编译 Rust 架构优势&#xff1a;SWC 基于 Rust 编写&#xff0c;利用 Rust 的性能和并发性优势&#xff0c;编译速度比 Babel 快约 20 倍&#xff0c;比 TypeScript 编译器更快。并行编译&#xff1a;支持多线程并行处理&#xff0c;在四核基准测试…

XML Expat Parser:深入解析与高效应用

XML Expat Parser:深入解析与高效应用 引言 XML(可扩展标记语言)作为一种广泛使用的标记语言,在数据交换、存储和表示中扮演着重要角色。XML Expat Parser 是一个高性能、可扩展的XML解析库,广泛应用于各种编程语言中。本文将深入探讨XML Expat Parser 的原理、特性以及…

【Python】自动化GIT提交

在日常开发中&#xff0c;我们经常需要频繁地向 Git 仓库提交代码。虽然 git add、git commit、git push 这几个命令并不复杂&#xff0c;但重复操作容易出错&#xff0c;也浪费时间。本文将介绍如何使用 Python 脚本自动化完成 Git 提交流程&#xff0c;让开发更高效&#xff…