您现在的位置是:首页 >学无止境 >好用的sql查询语句转java实体工具网站首页学无止境

好用的sql查询语句转java实体工具

上官虎虎 2023-05-29 08:00:02
简介好用的sql查询语句转java实体工具

功能:通过sql查询语句一键生成出java实体类可以自定义属性注解和属性类型
背景:相信大家在平时的工作中都离不开写大量的sql查询语句,为了代码的规范查询的字段太多时我们一般会用一个实体来接收查询的字段,但是为大量的字段创建实体工作量也就变得非常得大,所以我在工作之余写了这个sql查询语句转java实体的工具,废话不多说 I’m gonna show you guys my code

先给大家展示一下效果,下图为要转化的sql查询语句
查询的字段点击运行后控制台生成的实体代码
实体代码
####生成出来的实体展示如下######

package com.bdzk.base.lzbx_pe_v2.dto;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.bdzk.base.lzbx_pe_v2.po.PeEnterpriseGlories;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;

/**
* 
* @author mujinlong
* @since 2023-04-21 09:58:13
*/@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class EnterpriseDto {
	                               /****由于篇幅太长不利于展示这里我删除了几行属性***/
    /**
     * enterpriseId
     */
    private Long enterpriseId;
    /**
     * resume
     */
    private String resume;

    /**
     * ethnic
     */
    private String ethnic;
    /**
     * time
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime time;

}

1.创建一个名为EntityUtil的工具类来实现大部分的逻辑

package test.utils;

import java.io.*;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * sql查询字段转java实体
 * @author mujinlong
 * @email 885394406@qq.com
 * @微信 GTBB878
 * @since 2023-04-20 15:59:36
 */
public class EntityUtil {

    /**
     * sql查询字段转java实体
     * @param filePath sqlStr.text文件相对路径,也就是存放sql查询字段字符串的文件地址
     */
    public static void sqlFormatTransToEntity(String filePath){
        //读取文件
        BufferedReader reader = null;
        String lastStr = null;
        try {
//            InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("textfiles/sqlStr.text");
            InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
            InputStreamReader inputStreamReader = new InputStreamReader(is);
            reader = new BufferedReader(inputStreamReader);
            String baseStr = null;
            while ((baseStr = reader.readLine()) != null) {
                lastStr += baseStr;
            }
            reader.close();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(reader != null){
                try{
                    reader.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
        //开始转化
        char[] arry = lastStr.toCharArray();
        List<SubParamType> params = new ArrayList<>();
        List<Integer> findArray = new ArrayList<>();
        for (int i = 0; i <= arry.length - 1; i++){
            if(arry[i] == '_'){
                findArray.add(i);
            }
        }
        for(Integer location: findArray){
            //数组下标与长度统一
            if (location == 0 || location == arry.length - 1){
                continue;
            }
            arry[location+1] = (char)(arry[location+1] - 32);
        }
        String complete = String.valueOf(arry).replaceAll("_","");
        String[] finalArray = complete.split(",");
        for(String s : finalArray){
            String[] subStrArr = s.split("\.");
            if(subStrArr.length != 2){
                continue;
            }
            //字段默认为String类型
            String paramType = "String";
            String paramRemark = subStrArr[1];
            String paramName = subStrArr[1];
            String annotate  = null;
            //如果字段名称包含id那么该字段类型设为Long,也可以自定义成long
            //通过行业字段名称命名习惯捕获字段的类型
            if(paramName.contains("id")
                    || paramName.contains("Id")){
                paramType = "Long";
            }
            if(paramName.contains("type")
                    || paramName.contains("Type")
                    || paramName.contains("enabled")
                    || paramName.contains("Enabled")
                    || paramName.contains("Count")
                    || paramName.contains("count")
                    || paramName.contains("num")
                    || paramName.contains("Num")){
                paramType = "Integer";
            }
            if(paramName.contains("Time") || paramName.contains("time")){
                paramType = "LocalDateTime";
                annotate = "@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
" +
                        "    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")";
            }
            if((paramName.contains("id") || paramName.contains("Id"))
                    && paramName.contains("ame")){
                paramType = "String";
            }
            if(paramName.contains("amount") || paramName.contains("Amount")){
                paramType = "BigDecimal";
            }
            params.add(SubParamType.builder().paramType(paramType).paramName(paramName).remark(paramRemark).annotate(annotate).build());
        }
        //第二个参数为作者的名称,可以自定义
        String claasStr = EntityConstant.getEntity(params,"mujinlong");
        System.out.println("生成的实体:"+ claasStr);
    }

    public static void main(String[] ars){
        sqlFormatTransToEntity("textfiles/sqlStr.text");
    }
}

2.创建一个名为EntityConstant 的类来配置要生成的实体模板,如下

package test.utils;


import jdk.nashorn.internal.objects.annotations.Getter;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * 实体模板类
 * @author mujinlong
 * @email 885394406@qq.com
 * @微信 GTBB878
 * @since 2023-04-20 15:59:36
 */
public class EntityConstant {

    /**
     * 把属性插入模板并且获取java实体模板字符串
     * @param params 属性类的list
     * @param author 作者名称
     * @return
     */
    public static String getEntity(List<SubParamType> params,String author){
        StringBuilder builder = new StringBuilder();
        builder.append("package com.bdzk.base.lzbx_pe_v2.dto;
" +
                "
" +
                "import com.baomidou.mybatisplus.annotation.FieldFill;
" +
                "import com.baomidou.mybatisplus.annotation.TableField;
" +
                "import com.bdzk.base.lzbx_pe_v2.po.PeEnterpriseGlories;
" +
                "import com.fasterxml.jackson.annotation.JsonFormat;
" +
                "import lombok.AllArgsConstructor;
" +
                "import lombok.Builder;
" +
                "import lombok.Data;
" +
                "import lombok.NoArgsConstructor;
" +
                "import org.springframework.format.annotation.DateTimeFormat;
" +
                "
" +
                "import java.math.BigDecimal;
" +
                "import java.time.LocalDate;
" +
                "import java.time.LocalDateTime;
" +
                "import java.util.List;
" +
                "import org.springframework.format.annotation.DateTimeFormat;
"+
                "import com.fasterxml.jackson.annotation.JsonFormat;
"+
                "
" +
                "/**
" +
                "* 
" +
                "* @author "+author+"
" +
                "* @since "+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) +"
" +
                "*/" +
                "@Data
" +
                "@Builder
" +
                "@NoArgsConstructor
" +
                "@AllArgsConstructor
" +
                "public class EnterpriseDto {
" +
                "	
");
                for(SubParamType param : params){
                    String annotate = "";
                    if(param.getAnnotate() != null){
                        annotate = "    "+param.getAnnotate()+"
";
                    }
                    builder.append("    /**
" +
                            "     * "+param.getRemark()+"
" +
                            "     */
" +annotate+
                            "    private "+param.getParamType()+" "+param.getParamName()+";
");
                }
                builder.append("
}");
        return builder.toString();
        }
}

3.创建一个属性类用于记录java属性的类型、名称、备注,代码如下

package test.utils;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 属性类
 * @author mujinlong
 * @email 885394406@qq.com
 * @微信 GTBB878
 * @since 2023-04-20 15:59:36
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SubParamType {

    /**
     * 属性名称
     */
    private String paramName;

    /**
     * 属性类型
     */
    private String paramType;

    /**
     * 属性备注
     */
    private String remark;

    /**
     * 作者
     */
    private String author;

    /**
     * 属性的注解
     */
    private String annotate;
}

4.为了我们代码的整洁美观易用,我们需要在rerources目录下创建textfiles子目录和sqlStr.text文件用于存放复制过来的sql查询字段
sqlStr文件目录地址
################使用方法:
1.把sql查询语句SELECT和FROM中间的部分拷贝到sqlStr.text文件里(注意是select和from之间的内容可以看我的示例)
2.EntityUtil里的main方法里调用sqlFormatTransToEntity()方法参数为sqlStr.text文件的相对路径,比如我的文件在resource目录里的textfiles文件夹
3.运行main方法即可在控制台看到打印出来的java实体了,小伙伴只需复制使用就可以了
#######
通过以上的工具自动生成了java 实体,大大效率了我们的工作效率,不管是有50 还是100个字段,用该工具也就是1秒的事情,妈妈在也不用担心我敲代码太慢啦!!哦 不对应该是产品经理在也不用担心我敲代码太慢啦!
#######

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。