每次根据数据表写实体类和form类都觉得好麻烦,也没有装相应的工具,闲来无事就自己写了个工具类。具体代码如下:
package com.hnjz.app.common;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import com.hnjz.base.db.MetaDataUtil;
/**
* 根据传入的数据库表名,生成po属性
* 以_结尾的会去掉_ 例如:数据库字段名称 id_,实体类属性名称:id
* 以_分割的,会以_分割,分割后的字符串数组从第二个字符串开始首字母大写,然后再组成最终的属性名称
* 例 :数据库字段名称unit_name,实体类属性名称:unitName
* @param tableName
*/
public class BuildPoByTable {
public static void buildPoByTable(String tableName){
Connection con = getJdbcConn();
Statement st = null;
ResultSet rs = null;
String sql = "select * from "+tableName;
try {
st = con.createStatement();
rs = st.executeQuery(sql);
ResultSetMetaData md = rs.getMetaData();
for(int i = 1;i<=md.getColumnCount();i++){
String columnName = md.getColumnName(i);
String columnType = md.getColumnTypeName(i);
columnName = lowerCaseChar(columnName);
int xsws = md.getScale(i);//小数点右边的位数
//改造字段名称
if(columnName.endsWith("_")){
columnName = columnName.replace('_', ' ');
}else if(columnName.contains("_")){
String[] tempName = columnName.split("_");
String tempstr = "";
for(int j=1;j<tempName.length;j++){
tempName[j] = PoFormConverseUtil.upCaseFirstChar(tempName[j]);
tempstr = tempstr+tempName[j];
}
columnName = tempName[0]+tempstr;
}
if("VERSION_".equals(columnName)){
continue;
}else{
if("VARCHAR2".equals(columnType)||"NVARCHAR2".equals(columnType)){
System.out.println("private String "+columnName+";");
}else if("NUMBER".equals(columnType)){
if(xsws==0){
System.out.println("private Integer "+columnName+";");
}else if(xsws>0){
System.out.println("private Double "+columnName+";");
}
}else if("DATE".equals(columnType)){
System.out.println("private Date "+columnName+";");
}else if("CLOB".equals(columnType)){
System.out.println("private String "+columnName+";");
}
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static Connection getJdbcConn(){
Connection con = null;
try {
String name = "/jdbc.properties";
Properties p = new Properties();
InputStream in = MetaDataUtil.class.getResourceAsStream(name);
p.load(in);
String url = p.getProperty("jdbc.url");
String username = p.getProperty("jdbc.username");
String password = p.getProperty("jdbc.password");
String driverName = p.getProperty("jdbc.driverClassName");
Class.forName(driverName);
//System.out.println("加载驱动成功!");
//获取数据库连接
con = DriverManager.getConnection(url, username, password);
//System.out.println("获取数据库连接成功!");
//System.out.println("进行数据库操作!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
//字符串大写换小写
public static String lowerCaseChar(String str){
char[] chars = str.toCharArray();
for(int i=0;i<chars.length;i++){
if (chars[i] >= 'A' && chars[i] <= 'Z') {
chars[i] = (char)(chars[i] + 32);
}
}
return new String(chars);
}
}
控制台打印如下:
private String id ;
private String unitName;
private String unitCode;
private String unitAddr;
private Double unitCapital;
private Double unitInvestment;
字段已经有了,用myEclipse生成get,set方法即可。
注意:循环ResultSetMetaData下标从1开始,不是从0开始。
2、第二种方法(可以查出来注释):
利用下面的sql查出指定数据库表的字段信息,生成实体类
SELECT C.COLUMN_NAME, C.DATA_TYPE, C.DATA_SCALE, D.COMMENTS
FROM all_tab_columns C, all_col_comments D
WHERE C.TABLE_NAME = D.TABLE_NAME
AND C.OWNER = D.OWNER
AND C.TABLE_NAME = 'tabname'
AND D.TABLE_NAME = 'tabname'
AND C.COLUMN_NAME = D.COLUMN_NAME
AND C.OWNER = 'dbusername';