手撸hibernate工具生成pojo类

    技术2022-07-11  99

    前言

    最近更换了新项目组,持久层框架用的hibernate,项目中用的是基于hibernate封装JPA,JPA对于单表的增删改查真的好用。不愧是持久层框架,根本不用写SQL。但是pojo类需要手写真的太烦了,昨天一个表50个字段,快把手写废了,网上有好多Idea插件可以生产,还需要配置数据源,太麻烦了,直接手撸一个。

    思路

    pojo类无非就是把表名转换成类名,表里字段转成类中的属性(驼峰命名),根据数据库类型java类型转换,属性上添加相关注解,从数据库读取字段,写入在文件中。

    代码段

    import java.io.FileWriter; import java.io.IOException; import java.util.List; @CrossOrigin @RestController @RequestMapping("api/PojoCreate") public class PojoCreate { @Autowired private OrgRepository repository; @GetMapping public Object getAllByIsHrmw(String tableName) throws IOException { //获取表的名称,变大写,去除_,当做类的名称 String str = tableName.toUpperCase(); String[] s = str.split("_"); //查询表中所有字段 List<Object[]> t_bc_orgextension = repository.getTableColumns(str); //将文件写如D盘 File file = new File("d://"+s[s.length - 1]+".java"); if(!file.exists()){ file.createNewFile(); } //构建字符缓冲输出流 BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file)); //写入数据 bufferedWriter.write("import org.hibernate.annotations.DynamicUpdate;\n" + "import javax.persistence.*;\n" + "import java.math.BigDecimal;\n" + "import java.util.Date;"); bufferedWriter.newLine();//换行 bufferedWriter.write("@Entity"); bufferedWriter.newLine(); bufferedWriter.write("@DynamicUpdate"); bufferedWriter.newLine(); bufferedWriter.write("@Table(name = \""+str+"\")");//表名 bufferedWriter.newLine(); bufferedWriter.write("public class " + s[s.length - 1]+"{"); bufferedWriter.newLine(); bufferedWriter.newLine(); for(int i = 0;i < t_bc_orgextension.size();i ++){ //写备注 bufferedWriter.write(" /**\n" + " * "+t_bc_orgextension.get(i)[3]+"\n" + " */"); //数据第一个ID if(i==0){ bufferedWriter.write(" @Id"); bufferedWriter.newLine(); bufferedWriter.write(" @GeneratedValue(strategy = GenerationType.IDENTITY)"); bufferedWriter.newLine(); } bufferedWriter.write(" @Column(name = \""+t_bc_orgextension.get(i)[0]+"\")"); bufferedWriter.newLine(); //根据表中字段名称,拼成属性名称,驼峰命名 String s1 = t_bc_orgextension.get(i)[0].toString(); String[] s2 = s1.split("_"); StringBuilder stringBuilder = new StringBuilder(); for(int k = 0;k < s2.length; k++){ s2[k] = s2[k].toLowerCase(); if(k==0){ stringBuilder.append(s2[k]); }else{ stringBuilder.append(toUpp(s2[k])); } } //数据库类型java类型转换 String type = type(t_bc_orgextension.get(i)[1].toString()); if(type.equals("Date")){ bufferedWriter.write(" @Temporal(TemporalType.TIMESTAMP)"); bufferedWriter.newLine(); } bufferedWriter.write(" private "+type+" "+stringBuilder.toString()+";"); bufferedWriter.newLine(); bufferedWriter.newLine(); } bufferedWriter.write("}"); bufferedWriter.close(); return "执行完毕"; } //把字符串首字母变大写 private String toUpp(String name){ String s = name.toLowerCase(); return s.substring(0, 1).toUpperCase() + s.substring(1); } //类型转换 private String type(String name){ String[] split = name.split("\\("); if(split[0].equals("bigint")){ return "Long"; } if(split[0].equals("varchar")){ return "String"; } if(split[0].equals("decimal")){ return "BigDecimal"; } if(split[0].equals("smallint")){ return "Integer"; } if(split[0].equals("datetime")){ return "Date"; } if(split[0].equals("int")){ return "Integer"; }else{ return "String"; } } }

    查询表中所有字段方法

    @Query(value = "SELECT COLUMN_NAME AS 字段名称, COLUMN_TYPE AS 数据类型, IS_NULLABLE = 'NO', COLUMN_COMMENT AS 注释 FROM information_schema.`COLUMNS` WHERE table_name = ?1",nativeQuery = true) List<Object[]> getTableColumns(String tableName);

    我把文件目录写在了D盘,类型对应只写了部分,有需要的可以添加,有兴趣的程序猿们,可以试试。

    结束语

    引用 约翰生一句话 “成大事不在于力量的大小,而在于能坚持多久”!

    Processed: 0.013, SQL: 12