前言
最近更换了新项目组,持久层框架用的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盘,类型对应只写了部分,有需要的可以添加,有兴趣的程序猿们,可以试试。
结束语
引用 约翰生一句话 “成大事不在于力量的大小,而在于能坚持多久”!