代码生成工具1 ——项目简介和基础开发

1 项目简介

        需要提前在数据库建好表,然后执行代码生成工具,会生成简单的Java文件,避免重复编写增删改查代码。类似的工具网上有很多,本人开发这个工具属于自娱自乐。这个专栏会记录开发的过程。

2 项目搭建

        数据库使用MySQL :8.1.0

        JDK使用1.8

        1、新建一个普通的Java项目。GeneraJava项目是实际开发工具。GeneraJavaDemo是生成之后的模块。目录结构如下:

        2、新建GeneraJava模块(普通的maven项目)。pom.xml内容如下:

<?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:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.sourceJava</groupId><artifactId>GeneraJava</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><mysql.version>8.0.17</mysql.version><apache.commons.version>3.4</apache.commons.version><lombok.version>1.16.18</lombok.version></properties><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>${apache.commons.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.11.2</version></dependency></dependencies>
</project>

         3、application.properties 内容如下:

db.driver.name=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/generatejava?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT&allowMultiQueries=true
db.username=数据库账号
db.password=数据库密码
#忽略表前缀
ignore.table.prefix=true
#参数bean后缀
suffix.bean.param=query
#文件输出路径
path.base=xxx/MyGeneraJava/GeneraJavaDemo/src/main/
#包名
package.base=com.generajava
package.pojo=entity.pojo
package.param=entity.query#需要忽略的属性
ignore.bean.tojson.field=companyId,status
ignore.bean.tojson.expression=@JsonIgnore
ignore.bean.tojson.class=import com.fasterxml.jackson.annotation.JsonIgnore;#日期格式序列化
bean.date.format.expresson=@JsonFormat(pattern="%s",timezone = "GMT+8")
bean.date.format.class=import com.fasterxml.jackson.annotation.JsonFormat;#日期格式反序列化
bean.date.unformat.expresson=@DateTimeFormat(pattern = "%s")
bean.date.unformat.class=import org.springframework.format.annotation.DateTimeFormat;

3 开发(基础模块)

3.1 PropertiesUtils.java 读取配置文件application.properties

package com.sourceJava.utils;import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;public class PropertiesUtils {private static Properties properties = new Properties();private static Map<String,String> PROPER_MAP = new HashMap<>();static {InputStream is = null;try {is = PropertiesUtils.class.getClassLoader().getResourceAsStream("application.properties");properties.load(is);Iterator<Object> it = properties.keySet().iterator();while(it.hasNext()){String key = (String) it.next();PROPER_MAP.put(key,properties.getProperty(key));}}catch (Exception e){e.printStackTrace();}finally {if(is != null){try {is.close();}catch (Exception e1){e1.printStackTrace();}}}}public static String getValue(String key){return PROPER_MAP.get(key);}public static void main(String[] args) {System.out.println(getValue("db.driver.name"));}
}

3.2  Constants.java 项目启动加载默认配置

package com.sourceJava.bean;import com.sourceJava.utils.PropertiesUtils;public class Constants {public static Boolean IGNORE_TABLE_PERFIX;public static String SUFFIX_BEAN_PARAM;public final static String[] SQL_DATE_TIME_TYPE = new String[]{"datetime","timestamp"};public final static String[] SQL_DATE_TYPE = new String[]{"date"};public final static String[] SQL_DECIMAL_TYPE = new String[]{"decimal","double","float"};public final static String[] SQL_STRING_TYPE = new String[]{"char","varchar","text","mediumtext","longtext"};public final static String[] SQL_INTEGER_TYPE = new String[]{"int","tinyint"};public final static String[] SQL_LONG_TYPE = new String[]{"bigint"};private static String PATH_JAVA = "java";private static String PATH_RESOURCE = "resource";public static String PATH_BASE;public static String PACKAGE_BASE;public static String PATH_POJO;public static String PACKAGE_POJO;//需要忽略的属性public static String IGNORE_BEAN_TOJSON_FIELD;public static String IGNORE_BEAN_TOJSON_EXPRESSION;public static String IGNORE_BEAN_TOJSON_CLASS;//日期序列化public static String BEAN_DATE_FORMAT_EXPRESSON;public static String BEAN_DATE_FORMAT_CLASS;//日期反序列化public static String BEAN_DATE_UNFORMAT_EXPRESSON;public static String BEAN_DATE_UNFORMAT_CLASS;static {IGNORE_BEAN_TOJSON_FIELD = PropertiesUtils.getValue("ignore.bean.tojson.field");IGNORE_BEAN_TOJSON_EXPRESSION = PropertiesUtils.getValue("ignore.bean.tojson.expression");IGNORE_BEAN_TOJSON_CLASS = PropertiesUtils.getValue("ignore.bean.tojson.class");//日期序列化BEAN_DATE_FORMAT_EXPRESSON = PropertiesUtils.getValue("bean.date.format.expresson");BEAN_DATE_FORMAT_CLASS = PropertiesUtils.getValue("bean.date.format.class");//日期反序列化BEAN_DATE_UNFORMAT_EXPRESSON = PropertiesUtils.getValue("bean.date.unformat.expresson");BEAN_DATE_UNFORMAT_CLASS = PropertiesUtils.getValue("bean.date.unformat.class");IGNORE_TABLE_PERFIX = Boolean.valueOf(PropertiesUtils.getValue("ignore.table.prefix"));SUFFIX_BEAN_PARAM = PropertiesUtils.getValue("suffix.bean.param");PACKAGE_BASE = PropertiesUtils.getValue("package.base");PACKAGE_POJO = PACKAGE_BASE + "." + PropertiesUtils.getValue("package.pojo");PATH_BASE = PropertiesUtils.getValue("path.base");PATH_BASE = PATH_BASE + PATH_JAVA;PATH_BASE = PATH_BASE.replace(".","/");PATH_POJO = PATH_BASE + "/" + PACKAGE_POJO.replace(".","/");}public static void main(String[] args) {System.out.println(PACKAGE_POJO);System.out.println(PATH_POJO);}
}

3.3 tb_product_info.sql 数据脚本

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for tb_product_info
-- ----------------------------
DROP TABLE IF EXISTS `tb_product_info`;
CREATE TABLE `tb_product_info`  (`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',`company_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '公司ID',`code` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '公司编码',`product_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品名称',`price` decimal(15, 2) NULL DEFAULT NULL COMMENT '商品价格',`sku_type` tinyint NULL DEFAULT NULL COMMENT 'sku类型',`color_type` tinyint NULL DEFAULT NULL COMMENT '颜色类型',`craete_time` datetime NULL DEFAULT NULL COMMENT '创建时间',`crate_date` date NULL DEFAULT NULL COMMENT '创建日期',`stock` bigint NULL DEFAULT NULL COMMENT '库存',`status` tinyint NULL DEFAULT NULL COMMENT '状态',PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `idx_code`(`code`) USING BTREE,INDEX `idx_sku_type`(`sku_type`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品信息表' ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

3.4   TableInfo.java 定义表通用属性

public class TableInfo {private String tableName;//表名private String beanName;//bean名称private String beanParamName;//参数名称private String comment;//注释private Map<String, List<FieldInfo>> keyIndexMap = new LinkedHashMap<>();//唯一索引集合private Boolean haveDate = false;//是否有date类型private Boolean haveDateTime = false;//是否有时间类型private Boolean haveBigDecimal = false;//是否有bigdecimal类型private List<FieldInfo> fieldInfoList = new ArrayList();public List<FieldInfo> getFieldInfoList() {return fieldInfoList;}public void setFieldInfoList(List<FieldInfo> fieldInfoList) {this.fieldInfoList = fieldInfoList;}public String getTableName() {return tableName;}public void setTableName(String tableName) {this.tableName = tableName;}public String getBeanName() {return beanName;}public void setBeanName(String beanName) {this.beanName = beanName;}public String getBeanParamName() {return beanParamName;}public void setBeanParamName(String beanParamName) {this.beanParamName = beanParamName;}public String getComment() {return comment;}public void setComment(String comment) {this.comment = comment;}public Map<String, List<FieldInfo>> getKeyIndexMap() {return keyIndexMap;}public void setKeyIndexMap(Map<String, List<FieldInfo>> keyIndexMap) {this.keyIndexMap = keyIndexMap;}public Boolean getHaveDate() {return haveDate;}public void setHaveDate(Boolean haveDate) {this.haveDate = haveDate;}public Boolean getHaveDateTime() {return haveDateTime;}public void setHaveDateTime(Boolean haveDateTime) {this.haveDateTime = haveDateTime;}public Boolean getHaveBigDecimal() {return haveBigDecimal;}public void setHaveBigDecimal(Boolean haveBigDecimal) {this.haveBigDecimal = haveBigDecimal;}@Overridepublic String toString() {return "TableInfo{" +"tableName='" + tableName + '\'' +", beanName='" + beanName + '\'' +", beanParamName='" + beanParamName + '\'' +", comment='" + comment + '\'' +", keyIndexMap=" + keyIndexMap +", haveDate=" + haveDate +", haveDateTime=" + haveDateTime +", haveBigDecimal=" + haveBigDecimal +", fieldInfoList=" + fieldInfoList +'}';}
}

3.5  FieldInfo.java定义字段通用属性

public class FieldInfo {private String fieldName;//字段名称private String propertyName;//属性名称private String sqlType;// 数据库字段类型private String javaType;// Java字段类型private String comment; //数据库字段备注private Boolean isAutoIncrement;//是否自增public String getFieldName() {return fieldName;}public void setFieldName(String fieldName) {this.fieldName = fieldName;}public String getPropertyName() {return propertyName;}public void setPropertyName(String propertyName) {this.propertyName = propertyName;}public String getSqlType() {return sqlType;}public void setSqlType(String sqlType) {this.sqlType = sqlType;}public String getJavaType() {return javaType;}public void setJavaType(String javaType) {this.javaType = javaType;}public String getComment() {return comment;}public void setComment(String comment) {this.comment = comment;}public Boolean getAutoIncrement() {return isAutoIncrement;}public void setAutoIncrement(Boolean autoIncrement) {isAutoIncrement = autoIncrement;}@Overridepublic String toString() {return "FieldInfo{" +"fieldName='" + fieldName + '\'' +", propertyName='" + propertyName + '\'' +", sqlType='" + sqlType + '\'' +", javaType='" + javaType + '\'' +", comment='" + comment + '\'' +", isAutoIncrement=" + isAutoIncrement +'}';}
}

3.6  MyStringUtils.java字符串工具类

public class MyStringUtils {//第一个字母转换为大写public static String upCaseFirstLetter(String field){if(org.apache.commons.lang3.StringUtils.isEmpty(field)){return field;}return field.substring(0,1).toUpperCase() + field.substring(1);}//第一个字母转换成小写public static String lowerCaseFirstLetter(String field){if(org.apache.commons.lang3.StringUtils.isEmpty(field)){return field;}return field.substring(0,1).toLowerCase() + field.substring(1);}}

 3.7  DateUtils.java 日期工具类

public class DateUtils {public static final String YYYY_MM_DD = "yyyy-MM-dd";public static final String _YYYY_MM_DD = "yyyy/MM/dd";public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";//Date 转 Stringpublic static String dateParseToString(String pattern, Date date){return new SimpleDateFormat(pattern).format(date);}//String 转 Datepublic static Date stringParseToDate(String date,String pattern) throws ParseException {return new SimpleDateFormat(pattern).parse(date);}
}

       

         

         

        

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

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

相关文章

js图片回显的方法

直接上代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body>// HTML部分<input type"file" id"fileInput"><button onclick"show…

深度学习技术之加宽前馈全连接神经网络

深度学习技术 加宽前馈全连接神经网络1. Functional API 搭建神经网络模型1.1 利用Functional API编写宽深神经网络模型进行手写数字识别1.1.1 导入需要的库1.1.2 加载虹膜&#xff08;Iris&#xff09;数据集1.1.3 分割训练集和测试集1.1.4 定义模型输入层1.1.5 添加隐藏层1.1…

栈结构(详解)

1.栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&am…

省级生活垃圾无害化处理率面板数据(2004-2022年)

01、数据简介 生活垃圾无害化处理率是指经过处理的生活垃圾中&#xff0c;达到无害化标准的垃圾所占的比例。这一指标是衡量城市垃圾处理水平的重要标准&#xff0c;反映了城市对垃圾进行有效管理和处理的能力。 生活垃圾无害化处理的主要方式包括生活垃圾焚烧、生活垃圾卫生…

react18【系列实用教程】moxb —— 集中状态管理 (2024最新版)

官方文档 https://www.mobxjs.com/ moxb 和 redux 都能用于 react 的状态管理&#xff0c;但 moxb 更简单&#xff0c;适合规模不大的应用 &#xff08;规模大的应用若合理组织代码结构&#xff0c;也能用 moxb&#xff09; 安装 moxb npm i mobx npm i mobx-react-lite此处安…

C语言洛谷题目分享(11)回文质数

目录 1.前言 2.题目&#xff1a;回文质数 1.题目描述 2.输入格式 3.输出格式 4.输入输出样例 5.题解 3.小结 1.前言 哈喽大家好&#xff0c;今儿继续为大家分享一道蛮有价值的一道题&#xff0c;希望大家多多支持喔~ 2.题目&#xff1a;回文质数 1.题目描述 因为 151 …

【Oracle直播课】5月19日Oracle 19c OCM认证大师课 (附课件预览)

Oracle 19c OCM认证大师培训 - 课程体系 - 云贝教育 (yunbee.net) 部分课件预览 OCM部分课件预览 Oracle Database 19c Certified Master Exam (OCM) 认证大师 25 天 / 150课时 什么是Oracle 19c OCM&#xff1f; Oracle Certified Master (OCM)是Oracle认证大师&#xff0c;…

【51】Camunda8-Zeebe核心引擎-Zeebe Gateway

概述 Zeebe网关是Zeebe集群的一个组件,它可以被视为Zeebe集群的联系点,它允许Zeebe客户端与Zeebe集群内的Zeebe代理进行通信。有关Zeebe broker的更多信息,请访问我们的附加文档。 总而言之,Zeebe broker是Zeebe集群的主要部分,它完成所有繁重的工作,如处理、复制、导出…

软件工程期末复习(2)

软件工程 软件危机与软件工程的提出&#xff1a; 面对软件危机&#xff0c;1968年德国召开的一次NATO会议上首次签署声明“软件工程”这一说法&#xff0c;认为软件工程应当使用业已建立的工程学科的基本原理和范型。 背后驱使的观念是&#xff1a;软件设计、实现和维护应当与…

网络编程套接字详解

目录 1. 预备介绍 2.网络字节序 3.udp网络程序 4.地址转换函数 5.udp网络编程 1.预备介绍 1.1源IP地址和目标IP地址 举个例子: 从北京出发到上海旅游, 那么源IP地址就是北京, 目标IP地址就是上海. 1.2 端口号 作用: 标识一个进程, 告诉OS这个数据交给那个进程来处理; (1)…

Redis详解(二)

事务 什么是事务&#xff1f; 事务是一个单独的隔离操作&#xff1a;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。 事务是一个原子操作&#xff1a;事务中的命令要么全部被执行&#xff0c;要么全部都…

JVM内存结构

文章目录 JVM的内存结构程序计数器虚拟机栈&#xff08;栈&#xff09;本地方法栈Native关键字 堆元空间&#xff08;JDK1.8之前为永久代&#xff09; 实例对象实例化的过程 JVM的内存结构 先看下图 内存结构分为以下的两种&#xff1a;线程私有以及线程共享 线程私有&#x…

1070: 邻接矩阵存储简单路径

解法&#xff1a; #include<iostream> #include<vector> using namespace std; int arr[100][100]; int n; int sta, des; vector<int> path; vector<vector<int>> res; void dfs(vector<int> &a,int i) {a[i] 1;path.push_back(i);…

【数据分析面试】42.用户流失预测模型搭建(资料数据分享)

题目 保持高的客户留存率可以稳定和提到企业的收入。因此&#xff0c;预测和防止客户流失是在业务中常见的一项数据分析任务。这次分享的数据集包括了电信行业、银行、人力资源和电商行业&#xff0c;涵盖了不同业务背景下的流失预测数据。 后台回复暗号&#xff08;在本文末…

【Ubuntu永久授权串口设备读取权限“/dev/ttyUSB0”】

Ubuntu永久授权串口设备读取权限 1 问题描述2 解决方案2.1 查看ttyUSB0权限&#xff0c;拥有者是root&#xff0c;所属用户组为dialout2.2 查看dialout用户组成员&#xff0c;如图所示&#xff0c;普通用户y不在dialout组中2.3 将普通用户y加入dialout组中2.4 再次查看dialout用…

Python 求高斯误差函数 erf 和 erfc

文章目录 Part.I IntroductionPart.II 概念定义Chap.I 误差函数 erfChap.II 误差函数补 erfc Part.II 求值与绘图Chap.I 求取方式Chap.II 绘图 Reference Part.I Introduction 本文将对误差函数&#xff08;ERror Function, ERF&#xff09;进行简单的介绍&#xff0c;并探索如…

Linux网站服务

1.概念:HTML:超级文本编辑语言 网页:使用HTML,PHP,JAVA语言格式书写的文件。 主页:网页中呈现用户的第一个界面。 网站:多个网页组合而成的一台网站服务器。 URL:统一资源定位符&#xff0c;访问网站的地址。 网站架构:LAMP: LinuxApacheMYSQLPHP(系统服务器程序数据管理…

Multitouch for Mac:手势自定义,提升工作效率

Multitouch for Mac作为一款触控板手势增强软件&#xff0c;其核心功能在于手势的自定义和与Mac系统的深度整合。通过Multitouch&#xff0c;用户可以轻松设置各种手势&#xff0c;如三指轻点、四指左右滑动等&#xff0c;来执行常见的任务&#xff0c;如打开应用、切换窗口、滚…

爬虫工作量由小到大的思维转变---<第七十三章 > Scrapy爬虫详解一下HTTPERROE的问题

前言&#xff1a; 在我们的日常工作中&#xff0c;有时会忽略一些工具或组件的重要性&#xff0c;直到它们引起一连串的问题&#xff0c;我们才意识到它们的价值。正如在Scrapy框架中的HttpErrorMiddleware&#xff08;HTTP错误中间件&#xff09;一样&#xff0c;在开始时&…

MATLAB R2017b安装的关键一步

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 MATLAB R2017b的安装文件比较庞大&#xff0c;由两个iso文件组成&#xff1a;R2017b_win64_dvd1.iso和R2017b_win64_dvd2.iso。安装时需要注意的是&#xff0c;首先使用DAEMON Tools Lite打开R2017b_win64_dvd1.iso&am…