JavaWeb自动生成PO文件
在做javaweb中,需要建立与数据库中的表相映射的java对象也就是PO。在一个项目中往往一个数据有上百张的表,如果需要PO都要一个一个手动建立PO,这样操作起来非常麻烦也很浪费时间。
对与这种简单的重复操作就应该想办法进行封装,于是我就直接通过Java代码去自动生成项目所需的PO文件。
项目地址:https://github.com/xutaoqq/JAVA_mypackage
封装
主方法
private static Connection con = null;
private static ResultSet rs = null;
private static ResultSet bs = null;
private static DatabaseMetaData dma = null;
//传入 Connection 与要生成PO的存放包名
public static void FoundPo(Connection conts,String Paurl) {
try {
con = conts;
dma = con.getMetaData();//获取数据库的元数据
//将包名.转换为路径\\
String Paurlnj=Paurl.replace(".", "\\");
//放入src目录
String path = ".\\src\\"+Paurlnj;
//判断目录是否存在,不存在则创建
File directory = new File(path);
if(!directory.exists()){
directory.mkdirs(); //创建目录
}
//读取数据库的表
rs = dma.getTables(null, null, null, new String[]{"TABLE"});
while(rs.next()){
//获取表名
String bname = (String) rs.getObject("TABLE_NAME");
bname=capital(bname);//将表名首字母大写,适应命名规范
String filenameTemp = path + "\\"+bname+"Po.java";
String vostr = "package "+Paurl+";\nimport java.io.Serializable;\n\npublic class "+bname+"Po implements Serializable{ \n\n\tprivate static final long serialVersionUID = 1L;";
String toubu = "";
String read = "";
String write = "";
//读取表的每一列
bs = dma.getColumns(null, "%",bname, "%");
while(bs.next()){
String columnName = bs.getString("COLUMN_NAME");//列名
String typeName = bs.getString("TYPE_NAME");//列的数据类型
String remarks = bs.getString("REMARKS");//列的备注
String ltype = typepd(typeName);//MySQL类型与java类型进行转换
//拼接po代码
toubu+="\n\t//-- "+remarks+" --\n\tprivate " + ltype+" "+columnName+";";
read += "\n\n\tpublic" + " " + ltype + " get" + columnName+ "() {\n\t\treturn " + columnName + ";\n\t}";
write += "\n\n\tpublic" + " void " + "set" + columnName + "("+ ltype + " " + columnName + ")" + "{\n\t\tthis." + columnName+ " = " + columnName + ";\n\t}";
}
vostr+=toubu+read+write+"\n}";
//调用封装方法,生成最终po文件
File file = new File(filenameTemp);
try {
if (!file.exists()) {
file.createNewFile();
writeFileContent(filenameTemp, vostr);
} else {
autoReplace(filenameTemp, vostr);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("✔ "+bname+"表 PO创建成功 :"+filenameTemp);
}
System.out.println("\n✔ 数据库PO创建完成! ------- SetPo_XT");
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭流
try {
if (rs != null) {
rs.close();
}
if (con != null) {
con.close();
}
if (bs != null) {
bs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
MySQL数据类型与java数据类型转换
//常用类型,还有很多类型没判断
public static String typepd(String sqltype){
String jatype="";
if(sqltype.equals("INT"){
jatype="int";
}else if(sqltype.equals("INTEGER")){
jatype="long";
}else if(sqltype.equals("FLOAT")){
jatype="float";
}else if(sqltype.equals("DOUBLE")){
jatype="double";
}else if(sqltype.equals("BIT")){
jatype="boolean";
}else{
jatype="String";
}
return jatype;
}
首字母大写
表名首字母大写,适应java命名规范
public static String capital(String ostr){
String nestr=ostr.toUpperCase();
String sd=nestr.substring(0,1);
String newstr=sd+ostr.substring(1);
return newstr;
}
使用实例
//引入封装好的SetPo_XT包
import com.xt.jdbc.SetPo_XT;
//链接数据库
conn= DriverManager.getConnection(url, user, password);
//调用SetPo_XT的FoundPo()
SetPo_XT.FoundPo(conn, "com.xt.po");
控制器实时输出状态
执行完成后刷新项目目录
PO自动生成成功
这是自动生成的PO代码