好用的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\")\n" +
                        "    @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;\n" +
                "\n" +
                "import com.baomidou.mybatisplus.annotation.FieldFill;\n" +
                "import com.baomidou.mybatisplus.annotation.TableField;\n" +
                "import com.bdzk.base.lzbx_pe_v2.po.PeEnterpriseGlories;\n" +
                "import com.fasterxml.jackson.annotation.JsonFormat;\n" +
                "import lombok.AllArgsConstructor;\n" +
                "import lombok.Builder;\n" +
                "import lombok.Data;\n" +
                "import lombok.NoArgsConstructor;\n" +
                "import org.springframework.format.annotation.DateTimeFormat;\n" +
                "\n" +
                "import java.math.BigDecimal;\n" +
                "import java.time.LocalDate;\n" +
                "import java.time.LocalDateTime;\n" +
                "import java.util.List;\n" +
                "import org.springframework.format.annotation.DateTimeFormat;\n"+
                "import com.fasterxml.jackson.annotation.JsonFormat;\n"+
                "\n" +
                "/**\n" +
                "* \n" +
                "* @author "+author+"\n" +
                "* @since "+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) +"\n" +
                "*/" +
                "@Data\n" +
                "@Builder\n" +
                "@NoArgsConstructor\n" +
                "@AllArgsConstructor\n" +
                "public class EnterpriseDto {\n" +
                "\t\n");
                for(SubParamType param : params){
                    String annotate = "";
                    if(param.getAnnotate() != null){
                        annotate = "    "+param.getAnnotate()+"\n";
                    }
                    builder.append("    /**\n" +
                            "     * "+param.getRemark()+"\n" +
                            "     */\n" +annotate+
                            "    private "+param.getParamType()+" "+param.getParamName()+";\n");
                }
                builder.append("\n}");
        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秒的事情,妈妈在也不用担心我敲代码太慢啦!!哦 不对应该是产品经理在也不用担心我敲代码太慢啦!
#######

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
### 回答1: 如果你想使用 Java 读取 Oracle 数据库中的表并自动生成实体类,有以下几种方法可以实现: 1. 使用 MyBatis Generator 插件:MyBatis Generator 是一个代码生成器,可以自动生成实体类、Mapper 接口和 XML 文件。 2. 使用 jOOQ:jOOQ 是一个强大的 SQL 工具,可以帮助你自动生成实体类。 3. 使用 Hibernate:Hibernate 是一个强大的 ORM 框架,可以帮助你自动生成实体类。 这三种方法都需要你先配置好 Oracle 数据库连接,并确保你对这些工具和框架有一定的了解。 ### 回答2: Java可以使用Java Database Connectivity(JDBC)技术来读取Oracle数据库的表,并自动生成实体类。 首先,我们需要使用JDBC连接到Oracle数据库。可以通过引入相关的JDBC驱动程序来实现。然后,通过使用数据库连接字符串、用户名和密码来创建数据库连接。 接下来,我们可以使用JDBC的Statement对象来执行SQL查询语句。我们可以编写一个查询,读取数据库中的表结构信息,例如表名、字段名、数据类型等。 通过执行查询语句,我们可以获取到数据库表的元数据信息。对于每个字段,我们可以获取到其名称和数据类型。可以使用这些信息来生成实体类的属性。 在生成实体类时,我们可以根据表的名称来命名实体类。对于每个字段,我们可以根据数据类型选择合适的Java数据类型,例如String、int、float等。 除了属性名称和数据类型,我们还可以为每个属性生成get和set方法。 最后,我们可以将生成的实体类保存到指定的目录中,以便在项目中使用。 需要注意的是,自动生成的实体类可能需要手动进行进一步的优化和修改,例如添加注解、调整字段命名风格等。此外,自动生成的实体类可能只是一个初步的版本,需要根据具体需求进行进一步的定制和修改。 ### 回答3: Java可以使用JDBC连接Oracle数据库,并通过执行SQL语句读取表的结构信息,从而生成对应的实体类。 首先,需要引入Java连接Oracle数据库的依赖,如ojdbc.jar。 接下来,可以使用Java代码连接到Oracle数据库,通过JDBC的`Connection`对象与数据库建立连接。 然后,可以通过执行SQL查询语句,如`SELECT * FROM user_tables WHERE table_name='表名'`,查询指定表的结构信息。 使用`ResultSet`对象获取查询结果集,从中读取表的列名、数据类型、长度等字段信息。 根据读取到的表结构信息,可以使用Java的字符串拼接或StringBuilder等工具类,动态生成实体类的代码。 生成的实体类可以包含与表的列对应的私有字段、公共的setter和getter方法,以及toString()方法等。 接下来,可以通过Java的IO操作将生成的实体类代码写入到指定文件中,以便后续使用。 在生成的实体类中,可以根据需要使用Java的注解来标注表名、列名等信息,方便之后的ORM操作。 最后,通过Oracle数据库中的连接关闭JDBC连接,释放资源。 需要注意的是,生成的实体类只是根据表结构自动生成的模板,需要根据具体业务需求进行进一步的修改和完善。 以上是一种基本的方法,实际应用中还可结合代码模板、反射等技术,以提高开发效率和代码质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上官虎虎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值