代码生成工具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;
    }

    @Override
    public 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;
    }

    @Override
    public 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 转 String
    public static String dateParseToString(String pattern, Date date){
        return new SimpleDateFormat(pattern).format(date);
    }

    //String 转 Date
    public static Date stringParseToDate(String date,String pattern) throws ParseException {
        return new SimpleDateFormat(pattern).parse(date);
    }
}

       

         

         

        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中的子查询

子查询,在一个查询语句中又出现了查询语句 子查询可以出现在from和where后面 from 表子查询(结果一般为多行多列)把查询结果继续当一张表对待 where 标量子查询(结果集只有一行一列)查询身高最高的学生,查询到一个最高身高 列子查询(结果集只有一行多列) 对上表进行如下操作 …

韩顺平0基础学Java——第10天

p202-233 类与对象&#xff08;第七章&#xff09; 成员方法 person类中的speak方法&#xff1a; 1.public表示方法是公开的 2.void表示方法没有返回值 3.speak&#xff08;&#xff09;中&#xff0c;speak表示方法名&#xff0c;括号是形参列表。 4.大括号为方法体&am…

SpringCloud2024最新版链路追踪教程micrometer+zipkin

本文基于B站尚硅谷2024版springcloud教学视频&#xff0c;主要用于自己学习记录以及分享技术&#xff0c;侵权私删 自己本机环境信息&#xff1a; jdk&#xff1a;17.0.10springboot&#xff1a;3.2.0springcloud&#xff1a;2023.0.0 micrometer 之前行业内使用的分布式链路…

机器学习案例:加州房产价格(一)

参考链接&#xff1a;https://hands1ml.apachecn.org/2/ 假设你是被一家地产公司雇佣的数据科学家&#xff0c;现在需要做一些工作。 公司所给的数据集是StatLib 的加州房产价格数据集。这个数据集是基于 1990 年加州普查的数据。数据已经有点老&#xff0c;但它有许多优点&…

HCIP的学习(15)

第六章&#xff0c;BGP—边界网关协议 自治系统—AS ​ 定义&#xff1a;由一个单一的机构或组织所管理的一系列IP网络及其设备所构成的集合。 ​ AS的来源&#xff1a; 整个网络规模过大&#xff0c;会导致路由信息收敛速度过慢&#xff0c;设备对相同目标认知不同。AS之间…

HCIP 6(BGP综合实验)

一、实验拓扑 二、实验要求 1.AS1中存在两个环回&#xff0c;一个地址为192.168.1.0/24&#xff0c;该地址不能在任何协议中宣告&#xff1b;AS3中存在两个环回&#xff0c;一个地址为192.168.2.0/24&#xff0c;该地址不能在任何协议中宣告&#xff0c;最终要求这两个环回可以…

批量文本高效编辑神器:轻松拆分每行内容,一键保存更高效!轻松实现批量拆分与保存

文本处理成为我们日常工作中的一项重要任务。然而&#xff0c;面对大量的文本内容&#xff0c;传统的逐行编辑方式往往显得繁琐且效率低下。那么&#xff0c;有没有一种更高效、更便捷的解决方案呢&#xff1f;答案是肯定的——批量文本高效编辑神器&#xff0c;让您的文本处理…

用命令运行Java程序

1、创建一个类 2、在类文件路径下执行命令(编译)&#xff0c;生成.class javac 类名.java 3、运行.class文件 java 类名

机器学习案例:加州房产价格(二)

参考链接&#xff1a;https://hands1ml.apachecn.org/2/ 设计好系统后&#xff0c;要开始在工作区编写代码来解决问题了。 下载数据 首先我们需要先得到数据集。 一般情况下&#xff0c;数据是存储于关系型数据库&#xff08;或其它常见数据库&#xff09;中的多个表、文档、…

WSL——Centos7.9安装

1. 下载cenos镜像包 centos7.9下载地址 下载CentOS7.zip 2. 安装 将下载的zip文件解压至安装目录(这个目录就是安装centos的目录&#xff0c;可以是c盘之外的盘) 双击CentOS.exe 安装完成后&#xff0c;在安装目录下会多出一个ext4.vhdx 3. 启动 使用 wsl --list 可以查…

linux学习:linux视频输出+FRAME BUFFER+jpeg库+lcd上显示

目录 概念 使用 struct fb_fix_screeninfo{ } struct fb_bitfield { } struct fb_var_screeninfo{ } 例子1 例子2 例子3 jpeg库 步骤 概念 framebuffer 是一种很底层的机制&#xff0c;在 Linux 系统中&#xff0c;为了能够屏蔽 各种不同的显示设备的具体细节&#…

使用 scrapyd 部署 scrapy

1.scrapyd 是什么&#xff1f; Scrapyd 是一个用于部署和运行 Scrapy 爬虫项目的服务器应用程序。它使得你可以通过 HTTP 命令来部署、管理和执行多个 Scrapy 爬虫&#xff0c;非常适合持续集成和生产环境中的爬虫部署。 2.安装scrapyd 并使用 2.1 安装 scrapyd F:\scrapydTes…

CSS之高级技巧

目录 CSS高级技巧精灵图&#xff08;精灵技术&#xff09;字体图标iconfontCSS三角CSS用户界面样式vertical-align属性应用溢出的文字省略号显示常见布局技巧 CSS高级技巧 精灵图&#xff08;精灵技术&#xff09; 为什么&#xff1f; 目的&#xff1a;有效减少服务器接受和…

vs code中如何使用git

由于本地代码有了一些储备&#xff0c;所以想通过网址托管形式&#xff0c;之前一直使用了github&#xff0c;但是鉴于一直被墙&#xff0c;无法登录账号&#xff0c;所以选择了国内的gitee来作为托管网站。 gitee的网址&#xff1a;Gitee - 基于 Git 的代码托管和研发协作平台…

【论文阅读笔记】MapReduce: Simplified Data Processing on Large Clusters

文章目录 1 概念2 编程模型3 实现3.1 MapReduce执行流程3.2 master数据结构3.3 容错机制3.3.1 worker故障3.3.2 master故障3.3.3 出现故障时的语义 3.4 存储位置3.5 任务粒度3.6 备用任务 4 扩展技巧4.1 分区函数4.2 顺序保证4.3 Combiner函数4.4 输入和输出的类型4.5 副作用4.…

如何自定义Linux命令

说明&#xff1a;本文介绍如何将自己常用的命令设置为自定义的命令&#xff0c;以下操作在阿里云服务器CentOS上进行。 修改配置文件 修改配置文件前&#xff0c;先敲下面的命令查看当前系统配置的shell版本 echo $SHELL或者 echo $0区别在于&#xff0c;$SHELL查看的是系统…

房屋出租管理系统需求分析及功能介绍

房屋租赁管理系统适用于写字楼、办公楼、厂区、园区、商城、公寓等商办商业不动产的租赁管理及租赁营销&#xff1b;提供资产管理&#xff0c;合同管理&#xff0c;租赁管理&#xff0c; 物业管理&#xff0c;门禁管理等一体化的运营管理平台&#xff0c;提高项目方管理运营效率…

Java继承学习笔记

Java的继承能保证子类拥有父类的方法的同时&#xff0c;还能有自己的方法&#xff0c;然后也是研究了一下super和this的用法&#xff1a; super的用法&#xff1a; &#xff08;1&#xff09;、super关键字有两个用法&#xff1a;super()和super. &#xff0c;super()这个用法…

C++string 类的常用方法

string (构造函数) (1) default 构造长度为零字符的空字符串。 (2) copy 构造 str 的副本。 (3) substring 复制从字符位置 pos 开始并跨越 len 字符的 str 部分&#xff08;如果任一 str 太短或 len 为 string&#xff1a;&#xff1a;npos&#xff0c;则复制 str 的末尾…

智慧粮库/粮仓视频监管系统:AI视频智能监测保障储粮安全

智慧粮库视频监管系统是一种基于物联网、AI技术和视频监控技术的先进管理系统&#xff0c;主要用于对粮食储存环境进行实时监测、数据分析和预警。TSINGSEE青犀智慧粮库/粮仓视频智能管理系统方案通过部署多区域温、湿度、空气成分等多类传感器以及视频监控等设施&#xff0c;对…