当前位置: 首页 > news >正文

自动生成JPA bean及repository生成简陋工具

因为工具不太灵活,手写了一个,没啥技术难度,纯堆代码量

import java.io.File;
import java.io.FileOutputStream;
import java.nio.charset.Charset;
import java.sql.*;
import java.util.*;/*** JPA dao自动生成工具*/
public class JpaGenerate {//bean所在位置,示例:com.jpa.beanstatic String entityPackage = "com.datasource.entity";static String entityPath = "";//repository,示例:com.jpa.repositorystatic String repositoryPackage = "com.datasource.dao";static String repositoryPath = "";//mysql配置final static String url = "jdbc:mysql://localhost:3306/test";final static String user = "root";final static String password = "123456";//需要自动生成的数据库final static String database = "operation_platform";public static void main(String[] args) throws SQLException {Driver driver = new com.mysql.cj.jdbc.Driver();Properties info = new Properties();info.setProperty("user", user);info.setProperty("password", password);Connection conn = driver.connect(url, info);Statement stat = conn.createStatement();String sql = """select table_name,column_name,column_type,column_key,extra,column_commentFROMinformation_schema. COLUMNSWHERE"""+ "table_schema = '" + database + "' ORDER BY table_name";ResultSet rs = stat.executeQuery(sql);Map<String, List<DatasourceTableField>> fieldMap = new HashMap<>();while (rs.next()) {String table = rs.getString("table_name");if (!fieldMap.containsKey(table)) {fieldMap.put(table, new ArrayList<>());}fieldMap.get(table).add(new DatasourceTableField(rs.getString("column_name"),rs.getString("column_type"),rs.getString("column_comment"),rs.getString("column_key"),rs.getString("extra")));}conn.close();String projectPath = System.getProperty("user.dir").replaceAll("\\\\", "/");entityPath = projectPath + "/src/main/java/" + entityPackage.replaceAll("\\.", "/");repositoryPath = projectPath + "/src/main/java/" + repositoryPackage.replaceAll("\\.", "/");fieldMap.keySet().stream().forEach(key -> {try {createJpaFiles(key, fieldMap.get(key));} catch (Exception e) {throw new RuntimeException(e);}});}static void createJpaFiles(String table, List<DatasourceTableField> list) throws Exception {String tableName = convertTableName(table);String entityFilePath = entityPath + "/" + tableName + ".java";File entity = new File(entityFilePath);if (!entity.exists()) {entity.createNewFile();FileOutputStream outputStream = new FileOutputStream(entity);String fileText = "package " + entityPackage + ";\n\n" + """import jakarta.persistence.*;import lombok.Data;""";boolean time = false;String body = "\n";for (DatasourceTableField field : list) {if (field.columnType.contains("("))field.columnType = field.columnType.split("\\(")[0];String columnName = convertFieldName(field.columnName);switch (field.columnType) {case "int", "smallint" -> {if ("PRI".equals(field.columnKey)) {if ("auto_increment".equals(field.extra)) {body += "    @GeneratedValue(strategy = GenerationType.IDENTITY)\n";}body += "    @Id\n";}body += "    private Integer " + columnName + ";\n";}case "varchar", "text" -> body += "    private String " + columnName + ";\n";case "datetime" -> {time = true;body += "    private LocalDateTime " + columnName + ";\n";}case "double" -> body += "    private Double " + columnName + ";\n";}}if (time) {fileText += "import java.time.LocalDateTime;\n\n";}fileText += """@Entity@Data@Table(name = \"""" + table +"\")\npublic class " + tableName + "{\n" + body + "}";outputStream.write(fileText.getBytes(Charset.forName("utf-8")));outputStream.close();}String repositoryFilePath = repositoryPath + "/" + tableName + "Repository.java";File repository = new File(repositoryFilePath);if (!repository.exists()) {repository.createNewFile();FileOutputStream outputStream = new FileOutputStream(repository);String fileText = "package " + repositoryPackage + ";\n\n" +"import " + entityPackage + "." + tableName + ";\n" +"""import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.stereotype.Repository;@Repository"""+ "public interface " + tableName + "Repository extends JpaRepository<" +tableName + ", Integer> {\n}";outputStream.write(fileText.getBytes(Charset.forName("utf-8")));outputStream.close();}}static String convertTableName(String table) {String tableName = "";if (table.contains("_")) {for (String str : table.split("_")) {tableName += Character.toUpperCase(str.charAt(0)) + str.substring(1);}} else {tableName = Character.toUpperCase(table.charAt(0)) + table.substring(1);}return tableName;}static String convertFieldName(String tableField) {String fieldName = "";if (tableField.contains("_")) {boolean head = true;for (String str : tableField.split("_")) {if (head) {fieldName += str;head = false;} elsefieldName += Character.toUpperCase(str.charAt(0)) + str.substring(1);}} else {fieldName = tableField;}return fieldName;}static class DatasourceTableField {String columnName;String columnType;String columnComment;String columnKey;String extra;public DatasourceTableField(String columnName, String columnType, String columnComment, String columnKey, String extra) {this.columnName = columnName;this.columnType = columnType;this.columnComment = columnComment;this.columnKey = columnKey;this.extra = extra;}}}

由于项目中使用了lombok,所以写死了引入,不需要的直接去掉第85行,那么就需要重新加get set函数,在111行后再遍历一下list对body中添加getset函数即可,这里有一些坑,这个只能用于mysql,我没写其他数据库的连接和查询,然后目录是根据spring boot的结构来的,如果不是spring boot 可以修改64、65行目录,由于偷懒,mysql的数据类型也没写完,有其他类型的可以在94行的switch中添加,最后,此代码需要jdk17,因为使用了多行字符串和17+的switch,低版本的话改下字符串和switch写法也能用

相关文章:

自动生成JPA bean及repository生成简陋工具

因为工具不太灵活&#xff0c;手写了一个&#xff0c;没啥技术难度&#xff0c;纯堆代码量 import java.io.File; import java.io.FileOutputStream; import java.nio.charset.Charset; import java.sql.*; import java.util.*;/*** JPA dao自动生成工具*/ public class JpaGe…...

vue3+vite+uniapp 封装一个省市区组件

一、预览图 二、使用前的一些注意事项 只支持在 uniapp vue3 项目中使用支持微信小程序和h5 (app端没有测试过)ui库用的 uview-plus省市区数据用的是 vant-ui 提供的一个赖库 vant/area-data 三、组件代码 <template><u-popup :show"show" type"botto…...

OpenCV报错:AttributeError: module ‘cv2.cv2‘ has no attribute ‘SIFT_create‘

报错位置&#xff1a; sift cv2.SIFT_create()报错原因&#xff1a;opencv将SIFT等算法整合到xfeatures2d集合里面了。 改为&#xff1a; sift cv2.xfeatures2d.SIFT_create()...

通用监控视频web播放方案

业务场景 对接监控视频&#xff0c;实现海康大华等监控摄像头的实时画面在web端播放 方案一&#xff0c;使用 RTSP2webnode.jsffmpeg 说明&#xff1a;需要node环境&#xff0c;原理就是RTSP2web实时调用ffmpeg解码。使用单独html页面部署到服务器后&#xff0c;在项目中需要播…...

C++基础知识3

1、为什么构造函数不能是虚构造&#xff1f; 虚函数对应一个虚表vtale&#xff0c;这个表的地址是存储在对象的内存空间的。如果将构造函数设置为虚函数&#xff0c;就需要到虚表中调用&#xff0c;但这时候对象没有实例化&#xff0c;没有内存分配&#xff0c;虚表就不存在&am…...

【配置vscode编写python代码并输出到外部控制台】

配置vscode编写python代码并输出到外部控制台 1、扩展中添加python插件 2、打开一个文件夹&#xff0c;在里面新建一个.py文件&#xff0c;粘贴print(‘你好啊&#xff01;’)并运行 运行结果如下: 3、点击调试点击如下图 生成launch.json&#xff0c;将console后面改成exte…...

RK3588开发笔记-MIPI-CSI接口视频解码芯片XS9922B调试

目录 前言 一、RK3588 MIPI接口介绍 二、xs9922B视频解码芯片介绍 三、原理图连接...

DVWA -xss

什么是XSS 跨站点脚本(Cross Site Scripting,XSS)是指客户端代码注入攻击&#xff0c;攻击者可以在合法网站或Web应用程序中执行恶意脚本。当wb应用程序在其生成的输出中使用未经验证或未编码的用户输入时&#xff0c;就会发生XSS。 跨站脚本攻击&#xff0c;XSS(Cross Site S…...

C语言编程实现只有一个未知数的两个多项式合并的程序

背景&#xff1a; 直接看题目把&#xff01;就是C语言写两个多项式多项式合并 题目要求&#xff1a; 1. 题目&#xff1a; 编程实现只有一个未知数的两个多项式合并的程序。如&#xff1a; 3x^26x7 和 5x^2-2x9合并结果为8x^24x16。 2. 设计要求 &#xff08;1&#xff09…...

C# .net创建一个MVC框架工程

二、C# .net创建一个MVC框架工程 1.步骤 首先打开VS &#xff0c;然后点击创建新项目 在三个选项框中输入我们需要的项目条件 最后一步创建完毕 创建会在资源解决方案生成如图&#xff1a;...

Deep learning of free boundary and Stefan problems论文阅读复现

Deep learning of free boundary and Stefan problems论文阅读复现 摘要1. 一维一相Stefan问题1.1 Direct Stefan problem1.2 Inverse Type I1.3 Inverse Type II 2. 一维二相Stefan问题2.1 Direct Stefan problem2.2 Inverse Type I2.3 Inverse Type II 3. 二维一相Stefan问题…...

LeetCode 1277. 统计全为 1 的正方形子矩阵【动态规划】1613

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

测试部门来了个00后卷王之王,老油条感叹真干不过,但是...

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…...

360 G800行车记录仪,不使用降压线如何开机,8芯插头的定义。

G800记录仪的插头是这样的&#xff0c;图中标出了线的颜色。其中红色为常电V&#xff0c;黑色为GND负极&#xff0c;黄色为ACC受车是否启动控制。 这个记录仪原装的电源线没有降压功能&#xff0c;所以这里的V是12V。 记录仪内部有电源板&#xff0c;负责将12V降压为5V。 如果…...

vue2踩坑之项目:Swiper轮播图使用

首先安装swiper插件 npm i swiper5 安装出现错误&#xff1a;npm ERR npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: vue/eslint-config-standard6.1.0 npm ERR! Found: eslint-plugin-vue8.7.1 npm ERR! node_modules/esl…...

python经典百题之分桃子

题目:海滩上有一堆桃子&#xff0c;五只猴子来分。第一只猴子把这堆桃子平均分为五份&#xff0c;多了一个&#xff0c;这只 猴子把多的一个扔入海中&#xff0c;拿走了一份。第二只猴子把剩下的桃子又平均分成五份&#xff0c;又多了 一个&#xff0c;它同样把多的一个扔入海中…...

vscode ssh linux C++ 程序调试

vscode调试c++程序相比vs2022要复杂很多,vs2022可以"一键运行调试",vscode则需要自己配置。 ​vscode调试程序时,会在当前工作目录产生.vscode 目录, 该目录有两个重要文件launch.json和tasks.json, 下面介绍两种调试方法: 手动调试和自动调试。 手动调试 不管…...

VUE和Angular有哪些区别?

Vue.js和Angular是两个流行的前端JavaScript框架&#xff0c;它们有一些明显的区别&#xff0c;包括以下几个方面&#xff1a; 1、语言和工具链的选择&#xff1a; Vue.js使用HTML、JavaScript和CSS来创建组件&#xff0c;使得它更容易学习&#xff0c;因为它使用了常见的Web…...

云原生边缘计算KubeEdge安装配置(二)

1. K8S集群部署&#xff0c;可以参考如下博客 请安装k8s集群&#xff0c;centos安装k8s集群 请安装k8s集群&#xff0c;ubuntu安装k8s集群 请安装kubeedge cloudcore centos安装K8S 2.安装kubEedge 2.1 编辑kube-proxy使用ipvs代理 kubectl edit configmaps kube-proxy -…...

SQL多表设计--一对多(外键)

-- 完成部门和员工的-- 选择当前db03 这个数据库use db03;-- 查看当前选中的数据库select database();-- 创建员工表create table tb_emp (id int unsigned primary key auto_increment comment ID,username varchar(20) not null unique comment 用户名,password varchar(32)…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...