由於長期寫代碼, 所以在很多工具之前, 就寫了自己的代碼生成器.
前面的文章講了生成 java bean 這個更直接 一把全部生成5個文件
比如 INTERFACE_ID_MAPPING 表生成:
InterfaceIdMapping.java 文件
IInterfaceIdMappingService.java 服務層接口
InterfaceIdMappingServicePojoImpl 服務層接口實現
IInterfaceIdMappingDao.java 層接口
InterfaceIdMappingDaoJdbcImpl 層接口實現
有些人問爲什麼要生成這麼多層? Service層主要是用來發布微服務,與dao層隔離, dao層有些內容不方便公開.
所以 Service層與 dao層是有必要的 (現在很多開源工具也能做到這點, 但是有些事件還是自己做行靠譜)
先來看工具代碼
TableToSerivceByArchUtils.java:
package com.test;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DataSourceUtils;
import com.test.ServiceLocator;
/**
* 根據數據庫表生成[檔案服務代碼].
* 1錶轉換成Bean, 2生成Serivce層接口,3生成Serivce層實現, 4生成Dao層接口, 5生成Dao層實現.
* 說明:可以按表結構生成原來的大寫字段bean, 也可以轉成按java規則要求的bean.
* 是否需要轉換,設置isConvertColName參數.
* @author guishuanglin 2013-11-26
* update 2015-06-24
*/
public class TableToSerivceByArchUtils {
//BYTE,SHORT對象用INTEGE,不再區別處理.
//FLOAT,DOUBLE對象用BIGDECIMAL,不再區別處理.
private final int jINTEGER = 1;
private final int jLONG = 2;
private final int jDATE = 3;
private final int jSTRING = 4;
private final int jBIGDECIMAL = 5;
private final int jOBJECT = 6;
private final String sINTEGER ="Integer";
private final String sLONG = "Long";
private final String sDATE = "Date";
private final String sSTRING = "String";
private final String sBIGDECIMAL = "BigDecimal";
private final String sOBJECT = "Object";
//資料
private int dataBaseType =-1;
private String tablename = "";
private String beanName = "";
private int colCount;//列數
private String[] benFieldName;
private String[] benClassName;
private int[] benClassType;
private String[] colnames;
private String[] colTypes;//列類型名字.
private int[] colSizes; // 列字符大小
private int[] colScale; // 列小數精度
//引用包
private boolean importUtil = false; // 導入包java.util.*
private boolean importSql = false; // 包java.sql.*
private boolean importMath = false; // 包java.math.*
//控制變量
private boolean isConvertColName =true;//是否把列名轉成java規範的名字.
private boolean onlyCreateBean =true; //只生成Bean.
private boolean isCreateBatchMethod =false;//是否創建批處理方法.
//類附加註釋
private SimpleDateFormat DateFormat = new SimpleDateFormat("yyyy-MM-dd");
private String strDate=null;
private String author="table tool";
/** 入口 */
public void execute(String dbTableName) {
if(dbTableName ==null) return;
if(strDate ==null)
strDate = DateFormat.format(new Date());
tablename = dbTableName;
beanName = this.firstUpperCase(this.toJavaName(dbTableName.toLowerCase()));
boolean b = processTableMetaData(dbTableName);
if(b){
//初始 bean字段數組.
benFieldName = new String[colCount];
benClassName = new String[colCount];
benClassType = new int[colCount];
//處理每列對應的bean屬性與java類型
this.processClassnames();
//生成實體 bean
b =tableToEntity(beanName);
if(b && !onlyCreateBean){
this.builderServiceCode();
this.builderDaoCode();
}
}
}
/** 處理數表媒體數據, spring數據源名稱: dataSource0,dataSource1,dataSource3,dataSource4,dataSource5. */
private boolean processTableMetaData(String tName) {
boolean b =false;
DataSource ds = (DataSource) ServiceLocator.getService("dataSource0");
Connection conn = DataSourceUtils.getConnection(ds); // 得到數據庫連接
String strsql = "SELECT * FROM " + tablename;//+" WHERE ROWNUM=1";
try {
System.out.println("================ "+tName+" ================");
System.out.println(strsql);
this.dataBaseType =this.getDbType(conn);
PreparedStatement pstmt = conn.prepareStatement(strsql);
pstmt.executeQuery();
ResultSetMetaData rsmd = pstmt.getMetaData();
int size = rsmd.getColumnCount(); // 共有多少列
colCount = size;
colnames = new String[size];
colTypes = new String[size];
colSizes = new int[size];
colScale = new int[size];
for (int i = 0; i < rsmd.getColumnCount(); i++) {
colnames[i] = rsmd.getColumnName(i + 1).toLowerCase();
colTypes[i] = rsmd.getColumnTypeName(i + 1).toLowerCase();
colSizes[i] = rsmd.getPrecision(i + 1);
colScale[i] = rsmd.getScale(i + 1);
System.out.println(i+",DBType: "+rsmd.getColumnTypeName(i + 1)+", javaType: "+rsmd.getColumnClassName(i + 1));
}
b =true;
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DataSourceUtils.releaseConnection(conn, ds);
}
return b;
}
/**
* 獲取主流數據庫類型.
* -1-未知,0-ORACLE,1-SYBASE,2-SQLSERVER,3-DB2,4-MYSQL
* @throws SQLException
*/
private int getDbType(Connection conn) throws SQLException{
if(conn==null) return -1;
int dbType =-1;
DatabaseMetaData dbMeta =conn.getMetaData();
String dbProductName =dbMeta.getDatabaseProductName();
String url = dbMeta.getURL().toLowerCase();
if (url != null){
if(url.indexOf("oracle") >=0 ){
dbType = 0;
}else if(url.indexOf("sybase") >=0){
dbType = 1;
}else if(url.indexOf("sqlserver") >=0 ){
dbType = 2;
}else if(url.indexOf("ibm") >=0 ){
dbType = 3;
}else if(url.indexOf("mysql") >=0 ){
dbType = 4;
}else{
System.out.println("警告: [不確定的數據庫類型]: "+url+","+dbProductName);
}
}else{
System.out.println("警告: [不確定的數據庫類型]: "+url+","+dbProductName);
}
dbMeta =null;
return dbType;
}
//================================生成實體部分======================================
/**
* 根據文件名,代碼內容生成java代碼;
*/
private boolean fileWriter(String name, String javaCodeContent) {
boolean b =false;
try {//編碼根據項目本身要求的字符編碼修改.
FileOutputStream out = new FileOutputStream(name + ".java");
byte[] bytes = new byte[20480];//20k
byte[] inbytes = javaCodeContent.getBytes("utf-8");
ByteArrayInputStream in = new ByteArrayInputStream(inbytes);
int c;
while ((c = in.read(bytes)) != -1) {
out.write(bytes, 0, c);
}
in.close();
in = null;
bytes =null;
inbytes =null;
b =true;
System.out.println("生成================ "+name+" ================完成");
} catch (IOException e) {
e.printStackTrace();
System.out.println("生成================ "+name+" ================異常");
} finally {
javaCodeContent =null;
}
return b;
}
/**
* 生成實體類文件
* @param args
*/
private boolean tableToEntity(String tName) {
boolean b =false;
String content = buildEntityCode();
b=fileWriter(tName, content);
return b;
}
/**
* 1, 處理列名,把空格下劃線'_'去掉,同時把下劃線後的首字母大寫
* 要是整個列在3個字符及以內,則去掉'_'後,不把"_"後首字母大寫.
* 同時把數據庫列名,列類型寫到註釋中以便查看,
* 2, 處理bean字段的java類型
* -1-未知,0-ORACLE,1-SYBASE,2-SQLSERVER,3-DB2,4-MYSQL
* 3, java類型對應的數字常量.
*/
private void processClassnames() {
for (int i = 0; i < colnames.length; i++) {
//1
if(this.isConvertColName){
benFieldName[i] = this.toJavaName(colnames[i]);
}else{
benFieldName[i] = colnames[i].toUpperCase();
}
//2
if(this.dataBaseType ==0){
benClassName[i] = this.oracleTypeToJavaType(colTypes[i], colSizes[i], colScale[i]);
}else if(this.dataBaseType ==1){
benClassName[i] = this.sybaseTypeToJavaType(colTypes[i], colSizes[i], colScale[i]);
}else if(this.dataBaseType ==2){//暫用oralce類型
benClassName[i] = this.oracleTypeToJavaType(colTypes[i], colSizes[i], colScale[i]);
}else if(this.dataBaseType ==3){//暫用oralce類型
benClassName[i] = this.oracleTypeToJavaType(colTypes[i], colSizes[i], colScale[i]);
}else if(this.dataBaseType ==4){//暫用oralce類型
benClassName[i] = this.oracleTypeToJavaType(colTypes[i], colSizes[i], colScale[i]);
}else{//暫用oralce類型
benClassName[i] = this.oracleTypeToJavaType(colTypes[i], colSizes[i], colScale[i]);
}
//3 轉換類型對應的常量值,方便以後判斷處理.
if(benClassName[i].equals(this.sINTEGER)){
benClassType[i]=this.jINTEGER;
}else if(benClassName[i].equals(this.sLONG)){
benClassType[i]=this.jLONG;
}else if(benClassName[i].equals(this.sBIGDECIMAL)){
//bean是否用到Bigdecimal類型的包
importMath = true;
benClassType[i]=this.jBIGDECIMAL;
}else if(benClassName[i].equals(this.sSTRING)){
benClassType[i]=this.jSTRING;
}else if(benClassName[i].equals(this.sDATE)){
//bean是否用到Date類型的包
importUtil = true;
benClassType[i]=this.jDATE;
}else if(benClassName[i].equals(this.sOBJECT)){
benClassType[i]=this.jOBJECT;
}else{
benClassType[i]=this.jOBJECT;
}
}
}
/**
* 解析處理(生成實體類主體代碼)
*/
private String buildEntityCode() {
StringBuffer sb = new StringBuffer();
sb.append("\r\nimport java.io.Serializable;\r\n");
if (importUtil) {
sb.append("import java.util.Date;\r\n");
}
if (importSql) {
sb.append("import java.sql.*;\r\n\r\n");
}
if(importMath){
sb.append("import java.math.*;\r\n\r\n");
}
//表註釋
processNote(sb);
sb.append("public class " + this.beanName + " implements Serializable {\r\n");
processAllAttrs(sb);
processAllMethod(sb);
sb.append("}\r\n");
System.out.println(sb.toString());
return sb.toString();
}
/**
* 把數據庫列名,列類型,長度,精度寫到註釋中以便查看.
* (目前字段文本註釋暫不能處理)
* @param sb
*/
private void processNote(StringBuffer sb) {
//可增加類說明
sb.append("\r\n/** \r\n");
sb.append(" * "+tablename+":\r\n");
String colsiz="";
String colsca="";
for (int i = 0; i < colnames.length; i++) {
colsiz = colSizes[i]<=0? "" : (colScale[i]<=0? "("+colSizes[i]+")" : "("+colSizes[i]+","+colScale[i]+")");
sb.append("\t" + colnames[i].toUpperCase() +" "+colTypes[i].toUpperCase()+ colsiz+"\r\n");
}
//增加日期
sb.append(" * @author "+author+" "+this.strDate+"\r\n");
sb.append(" */\r\n");
}
/**
* 生成所有的方法
* @param sb
*/
private void processAllMethod(StringBuffer sb) {
for (int i = 0; i < colnames.length; i++) {
sb.append("\tpublic void set" + firstUpperCase(benFieldName[i]) + "("
+ benClassName[i] + " " + benFieldName[i]
+ "){\r\n");
sb.append("\t\tthis." + benFieldName[i] + "=" + benFieldName[i] + ";\r\n");
sb.append("\t}\r\n");
//
sb.append("\tpublic " + benClassName[i] + " get"
+ firstUpperCase(benFieldName[i]) + "(){\r\n");
sb.append("\t\treturn " + benFieldName[i] + ";\r\n");
sb.append("\t}\r\n");
}
}
/**
* 解析輸出屬性
*
* @return
*/
private void processAllAttrs(StringBuffer sb) {
sb.append("\tprivate static final long serialVersionUID = 1L;\r\n");
for (int i = 0; i < colnames.length; i++) {
sb.append("\tprivate " + benClassName[i] + " "
+ benFieldName[i] + ";\r\n");
}
sb.append("\r\n");
}
/**
* 把輸入字符串的首字母改成大寫,用作Bean的類名,方法名等.
*/
private String firstUpperCase(String name) {
char[] ch = name.toCharArray();
if (ch[0] >= 'a' && ch[0] <= 'z') {
ch[0] = (char) (ch[0] - 32);
}
return new String(ch);
}
/**
* 數據庫列名轉換成java規範的名字(當然也可以不轉).
* 處理列名,把空格下劃線'_'去掉,同時把下劃線後的首字母大寫
* 要是整個列在3個字符及以內,則去掉'_'後,不把"_"後首字母大寫.
*/
private String toJavaName(String name) {
char[] ch = name.toCharArray();
char c ='a';
if(ch.length>3){
for(int j=0;j <ch.length; j++){
c = ch[j];
if(c == '_'){
if (ch[j+1]>= 'a' && ch[j+1] <= 'z') {
ch[j+1]=(char) (ch[j+1]-32);
}
}
}
}
String str = new String(ch);
str = str.replaceAll("_", "");
return str;
}
/**
* Sybase
*/
private String sybaseTypeToJavaType(String sqlType, int size, int scale) {
if (sqlType.equals("int")
|| sqlType.equals("bit")
|| sqlType.equals("tinyint")
|| sqlType.equals("smallint")
) {
return this.sINTEGER;
} else if (sqlType.equals("bigint")) {
return this.sLONG;
} else if (sqlType.equals("float")
|| sqlType.equals("float precision")
|| sqlType.equals("double")
|| sqlType.equals("double precision")
|| sqlType.equals("money")
|| sqlType.equals("smallmoney")) {
return this.sBIGDECIMAL;
}else if (sqlType.equals("number")
||sqlType.equals("decimal")
|| sqlType.equals("numeric")
|| sqlType.equals("real")) {
return scale==0? (size<10? this.sINTEGER : this.sLONG) : this.sBIGDECIMAL;
}else if (sqlType.equals("varchar")
|| sqlType.equals("varchar2")
|| sqlType.equals("char")
|| sqlType.equals("nvarchar")
|| sqlType.equals("nchar")) {
return this.sSTRING;
} else if (sqlType.equals("datetime")
|| sqlType.equals("date")) {
return this.sDATE;
}else {
return this.sOBJECT;
}
}
/**
* Oracle
*/
private String oracleTypeToJavaType(String sqlType, int size, int scale) {
if (sqlType.equals("integer")) {
return this.sINTEGER;
} else if (sqlType.equals("long")) {
return this.sLONG;
} else if (sqlType.equals("float")
|| sqlType.equals("float precision")
|| sqlType.equals("double")
|| sqlType.equals("double precision")) {
return this.sBIGDECIMAL;
}else if (sqlType.equals("number")
||sqlType.equals("decimal")
|| sqlType.equals("numeric")
|| sqlType.equals("real")) {
return scale==0? (size<10? this.sINTEGER : this.sLONG) : this.sBIGDECIMAL;
}else if (sqlType.equals("varchar")
|| sqlType.equals("varchar2")
|| sqlType.equals("char")
|| sqlType.equals("nvarchar")
|| sqlType.equals("nchar")) {
return this.sSTRING;
} else if (sqlType.equals("datetime")
|| sqlType.equals("date")
|| sqlType.startsWith("timestamp")) {
return this.sDATE;
}else {
return this.sOBJECT;
}
}
//================================生成Serivce部分======================================
/**
* 解析處理(生成Service接口代碼)
*/
private void builderServiceCode() {
String faceName = "I"+this.beanName+"Service";
String implName = this.beanName+"ServicePojoImpl";
String content = builderServiceInterface(faceName, implName);
this.fileWriter(faceName, content);
//
content = builderServicePojoImpl(faceName, implName);
this.fileWriter(implName, content);
}
/**
* 生成Service接口代碼)
*/
private String builderServiceInterface(String interfaceName, String implName) {
StringBuffer sb = new StringBuffer();
sb.append("\r\nimport java.io.Serializable;\r\n");
sb.append("import java.util.*;\r\n");
sb.append("\r\nimport com.wasion.commons.dto.SupDto;\r\n");
sb.append("import com.wasion.framework.service.IBaseService;\r\n");
if(this.isCreateBatchMethod){
sb.append("import com.wasion.framework.service.IBatchService;\r\n");
}
//增加類說明
sb.append("\r\n/** \r\n");
sb.append(" * "+tablename+"\r\n");
sb.append(" * @author "+author+" "+this.strDate+"\r\n");
sb.append(" */\r\n");
//類聲明
if(this.isCreateBatchMethod){
sb.append("public interface " + interfaceName + " extends IBaseService<"+this.beanName+", SupDto>"+ ", IBatchService<"+this.beanName+", SupDto> {\r\n");
}else{
sb.append("public interface " + interfaceName + " extends IBaseService<"+this.beanName+", SupDto> {\r\n");
}
sb.append("\r\n");
sb.append("\t//demo: public abstract List<"+this.beanName+"> findAll(String sqlExpression, SupDto p);");
sb.append("\r\n");
sb.append("}\r\n");
//System.out.println(sb.toString());
return sb.toString();
}
/**
* 生成Service的Pojo實現代碼)
*/
private String builderServicePojoImpl(String interfaceName, String implName) {
StringBuffer sb = new StringBuffer();
sb.append("\r\nimport java.io.Serializable;\r\n");
sb.append("import java.util.*;\r\n");
sb.append("\r\nimport com.wasion.commons.dto.SupDto;\r\n");
sb.append("\r\n");
//增加類說明
sb.append("\r\n/** \r\n");
sb.append(" * "+tablename+"\r\n");
sb.append(" * @author "+author+" "+this.strDate+"\r\n");
sb.append(" */\r\n");
//類聲明
sb.append("public class " + implName + " implements "+interfaceName+" {\r\n");
builderServicePojoFieldAndMethod(sb);
//
sb.append("}\r\n");
//System.out.println(sb.toString());
return sb.toString();
}
/**
* 組裝Service接口Pojo實現類屬性與方法代碼
* @return
*/
private void builderServicePojoFieldAndMethod(StringBuffer sb) {
String faceName = "I"+this.beanName+"Dao";
sb.append("\r\n");
sb.append("\tprivate "+faceName+" dao;\r\n");
sb.append("\r\n");
sb.append("\t/** spring in */\r\n");
sb.append("\tpublic "+faceName+" getDao() {\r\n\t\treturn dao;\r\n\t}\r\n");
sb.append("\tpublic void setDao("+faceName+" dao) {\r\n\t\tthis.dao = dao;\r\n\t}\r\n");
sb.append("\r\n");
//方法,基本操作方法 create,delete,update,isExist,findAll(條件)
sb.append("\tpublic "+beanName+" create("+beanName+" entity, SupDto p) {\r\n\t\treturn this.dao.create(entity, p);\r\n\t}\r\n");
sb.append("\tpublic boolean delete("+beanName+" entity, SupDto p) {\r\n\t\treturn this.dao.delete(entity, p);\r\n\t}\r\n");
sb.append("\tpublic "+beanName+" read("+beanName+" entity, SupDto p) {\r\n\t\treturn this.dao.read(entity, p);\r\n\t}\r\n");
sb.append("\tpublic boolean update("+beanName+" entity, SupDto p) {\r\n\t\treturn this.dao.update(entity, p);\r\n\t}\r\n");
sb.append("\tpublic List<"+beanName+"> findAll(String sqlExpression, SupDto p) {\r\n\t\treturn this.dao.findAll(sqlExpression, p);\r\n\t}\r\n");
if(this.isCreateBatchMethod){
sb.append("\r\n");
sb.append("\tpublic boolean createBatch(List<"+beanName+"> entities, SupDto p) {\r\n\t\treturn this.dao.createBatch(entities, p);\r\n\t}\r\n");
sb.append("\tpublic boolean deleteBatch(List<"+beanName+"> entities, SupDto p) {\r\n\t\treturn this.dao.deleteBatch(entities, p);\r\n\t}\r\n");
sb.append("\tpublic boolean updateBatch(List<"+beanName+"> entities, SupDto p) {\r\n\t\treturn this.dao.updateBatch(entities, p);\r\n\t}\r\n");
sb.append("\tpublic boolean updateOrInsertBatch(List<"+beanName+"> entities, SupDto p) {\r\n\t\treturn this.dao.updateOrInsertBatch(entities, p);\r\n\t}\r\n");
}
}
//================================生成 Dao 部分======================================
/**
* 解析處理(生成 Dao代碼)
*/
private void builderDaoCode() {
String faceName = "I"+this.beanName+"Dao";
String implName = this.beanName+"DaoJdbcImpl";
String content = builderDaoInterface(faceName, implName);
this.fileWriter(faceName, content);
//
content = builderDaoPojoImpl(faceName, implName);
this.fileWriter(implName, content);
}
/**
* 生成Dao接口代碼)
*/
private String builderDaoInterface(String interfaceName, String implName) {
StringBuffer sb = new StringBuffer();
sb.append("\r\nimport java.io.Serializable;\r\n");
sb.append("import java.util.*;\r\n");
sb.append("\r\nimport com.wasion.commons.dto.SupDto;\r\n");
sb.append("import com.wasion.framework.dao.IBaseDao;\r\n");
if(this.isCreateBatchMethod){
sb.append("import com.wasion.framework.dao.IBatchDao;\r\n");
}
//增加類說明
sb.append("\r\n/** \r\n");
sb.append(" * "+tablename+"\r\n");
sb.append(" * @author "+author+" "+this.strDate+"\r\n");
sb.append(" */\r\n");
//類聲明
if(this.isCreateBatchMethod){
sb.append("public interface " + interfaceName + " extends IBaseDao<"+this.beanName+", SupDto>" + ", IBatchDao<"+this.beanName+", SupDto> {\r\n");
}else{
sb.append("public interface " + interfaceName + " extends IBaseDao<"+this.beanName+", SupDto> {\r\n");
}
sb.append("\r\n");
sb.append("\t//demo: public abstract List<"+this.beanName+"> findAll(String sqlExpression, SupDto p);");
sb.append("\r\n");
sb.append("}\r\n");
//System.out.println(sb.toString());
return sb.toString();
}
/**
* 生成Dao的Jdbc實現代碼)
*/
private String builderDaoPojoImpl(String interfaceName, String implName) {
StringBuffer sb = new StringBuffer();
//增加引用
sb.append("\r\nimport java.util.*;\r\n");
sb.append("import java.math.*;\r\n");
sb.append("\r\n");
sb.append("import org.apache.commons.logging.Log;\r\n");
sb.append("import org.apache.commons.logging.LogFactory;\r\n");
sb.append("\r\n");
sb.append("import com.wasion.commons.dto.SupDto;\r\n");
sb.append("import com.wasion.commons.util.JdbcDataUtils;\r\n");
sb.append("import com.wasion.commons.util.SqlCacheUnits;\r\n");
sb.append("import com.wasion.commons.util.SqlStringUnits;\r\n");
sb.append("\r\n");
sb.append("import com.wasion.framework.dao.BaseMdbDaoSupport;\r\n");
sb.append("\r\n");
//增加類說明
sb.append("\r\n/** \r\n");
sb.append(" * "+tablename+"\r\n");
sb.append(" * @author "+author+" "+this.strDate+"\r\n");
sb.append(" */\r\n");
//類聲明
sb.append("public class " + implName + " extends BaseMdbDaoSupport implements "+interfaceName+" {\r\n");
sb.append("\tprivate Log logger = LogFactory.getLog(this.getClass());\r\n");
sb.append("\tprivate SqlStringUnits stool = new SqlStringUnits();\r\n");
sb.append("\tprivate JdbcDataUtils jtool = new JdbcDataUtils();\r\n");
sb.append("\tprivate String table = \""+tablename+"\";\r\n");
sb.append("\tprivate String name = \""+tablename+"\";\r\n");
sb.append("\tprivate final int BATCH_SIZE=500;\r\n");
daoMethodFindAll_1(sb);
daoMethodRead(sb);
daoMethodInsert(sb);
daoMethodDelete_1(sb);
daoMethodUpdate(sb);
if(isCreateBatchMethod){
this.daoMethodInsertBatch(sb);
this.daoMethodDeleteBatch(sb);
this.daoMethodUpdateBatch(sb);
this.daoMethodUpdateOrInsertBatch(sb);
}
sb.append("\r\n\r\n\t//-------------------------Parameters CODE------------------------- \r\n\r\n");
daoMethodProcessInsertParm(sb);
daoMethodProcessDeleteParm(sb);
daoMethodProcessUpdateParm(sb);
daoMethodProcessUpdateOrInsertParm(sb);
daoMethodGetColumnString(sb);
sb.append("\r\n");
sb.append("}\r\n");
return sb.toString();
}
//----------生成 Dao Template 部分----------
/**
* 生成Dao的Jdbc實現: findAll 1對象.
*/
private void daoMethodFindAll_1(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** findAll row */\r\n");
sb.append("\tpublic List<"+beanName+"> findAll(String sqlExpression, SupDto p) {\r\n");
//e2->>
sb.append("\t\tif(sqlExpression == null) return null;\r\n");
sb.append("\t\tString tablename = this.getTableName(p, this.table);\r\n");
sb.append("\t\tString sqlNote = this.getSqlNote(p, this.name);\r\n");
sb.append("\t\tString strSql = null;\r\n");
sb.append("\t\tstrSql =\" SELECT \"+this.getColumnString()+\" FROM \"+ tablename+\" \"+sqlExpression;\r\n");
//e1->>
sb.append("\t\treturn this.getJdbcDaoSupport(p).query(strSql, "+beanName+".class, sqlNote);\r\n\t}\r\n");
}
/**
* 生成Dao的Jdbc實現: Read 對象.
*/
private void daoMethodRead(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** read row */\r\n");
sb.append("\tpublic "+beanName+" read("+beanName+" entity, SupDto p) {\r\n");
//e2->>
sb.append("\t\tif(entity == null) return null;\r\n");
sb.append("\t\tString tablename = this.getTableName(p, this.table);\r\n");
sb.append("\t\tString sqlNote = this.getSqlNote(p, this.name);\r\n");
sb.append("\t\tString strSql = null;\r\n");
sb.append("\t\tstrSql =\" SELECT \"+this.getColumnString()+\" FROM \"+tablename+\" WHERE ID =1.....\";\r\n");
sb.append("\t\t//TODO ADD WHERE CODE......\r\n");
//e1->>
sb.append("\t\treturn this.getJdbcDaoSupport(p).querySingle(strSql, "+beanName+".class, sqlNote);\r\n\t}\r\n");
}
/**
* 生成Dao的Jdbc實現: insertEntity 插入對象.
*/
private void daoMethodInsert(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** create row */\r\n");
sb.append("\tpublic "+beanName+" create("+beanName+" entity, SupDto p) {\r\n");
//e2->>
sb.append("\t\tif(entity == null) return null;\r\n");
sb.append("\t\tString tablename = this.getTableName(p, this.table);\r\n");
sb.append("\t\tString sqlNote = this.getSqlNote(p, this.name);\r\n");
sb.append("\t\tString strSql = null;\r\n");
sb.append("\t\tstrSql =\" INSERT INTO \"+ tablename +\" (\"+this.getColumnString()+\") \"+\r\n");
//e3->>
sb.append("\t\t\t\" VALUES(");
String s="";
for (int i = 0; i < colnames.length; i++) {
if(i<colnames.length-1){
if((i+1)%20==0){
s=s+"?,\"+\r\n\t\t\t\"";
}else{
s=s+"?,";
}
}else{
s=s+"?";
}
}
sb.append(s+")\";\r\n");
//e2->>
sb.append("\t\tint rs = this.getJdbcDaoSupport(p).update(strSql, this.processInsertParm(entity), sqlNote);\r\n");
//e1->>
sb.append("\t\treturn rs >0 ? entity : null;\r\n\t}\r\n");
}
/**
* 生成Dao的Jdbc實現: deleteEntityTemplate 刪除對象模板.
*/
private void daoMethodDelete_1(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** delete row */\r\n");
sb.append("\tpublic boolean delete("+beanName+" entity, SupDto p) {\r\n");
//e2->>
sb.append("\t\tif(entity == null) return false;\r\n");
sb.append("\t\tString tablename = this.getTableName(p, this.table);\r\n");
sb.append("\t\tString sqlNote = this.getSqlNote(p, this.name);\r\n");
sb.append("\t\tString strSql = null;\r\n");
sb.append("\t\tstrSql =\" DELETE \"+ tablename +\r\n");
//e3->>
sb.append("\t\t\t\" WHERE ID =1..... \";\r\n");
sb.append("\t\t//TODO ADD WHERE CODE......\r\n");
//e2->>
sb.append("\t\tint rs = this.getJdbcDaoSupport(p).update(strSql, sqlNote);\r\n");
//e1->>
sb.append("\t\treturn rs >= 0 ? true : false;\r\n\t}\r\n");
}
/**
* 生成Dao的Jdbc實現: updateEntityTemplate 修改對象模板.
*/
private void daoMethodUpdate(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** update row */\r\n");
sb.append("\tpublic boolean update("+beanName+" entity, SupDto p) {\r\n");
//e2->>
sb.append("\t\tif(entity == null) return false;\r\n");
sb.append("\t\tString tablename = this.getTableName(p, this.table);\r\n");
sb.append("\t\tString sqlNote = this.getSqlNote(p, this.name);\r\n");
sb.append("\t\tString strSql = null;\r\n");
sb.append("\t\tstrSql =\" UPDATE \"+ tablename +\" SET\"+\r\n");
//e3->>
sb.append("\t\t\t\" ");
String s="";
for (int i = 0; i < colnames.length; i++) {
if(i<colnames.length-1){
if((i+1)%10==0){
s=s+colnames[i]+"=?,\"+\r\n\t\t\t\" ";
}else{
s=s+colnames[i]+"=?,";
}
}else{
s=s+colnames[i]+"=?";
}
}
sb.append(s.toUpperCase()+"\"+\r\n");
sb.append("\t\t\t\" WHERE ID =?..... \";\r\n");
//e2->>
sb.append("\t\t//TODO ADD WHERE CODE......\r\n");
sb.append("\t\tint rs = this.getJdbcDaoSupport(p).update(strSql, this.processUpdateParm(entity), sqlNote);\r\n");
//e1->>
sb.append("\t\treturn rs >= 0 ? true : false;\r\n\t}\r\n");
}
/**
* 生成Dao的Jdbc實現: insertBatch 插入對象.
*/
private void daoMethodInsertBatch(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** createBatch row */\r\n");
sb.append("\tpublic boolean createBatch(List<"+beanName+"> entities, SupDto p) {\r\n");
//e2->>
sb.append("\t\tif(entities == null || entities.size()==0) return true;\r\n");
sb.append("\t\tString tablename = this.getTableName(p, this.table);\r\n");
sb.append("\t\tString sqlNote = this.getSqlNote(p, this.name);\r\n");
sb.append("\t\tString strSql = null;\r\n");
sb.append("\t\tstrSql =\" INSERT INTO \"+ tablename +\" (\"+this.getColumnString()+\") \"+\r\n");
//e3->>
sb.append("\t\t\t\" VALUES(");
String s="";
for (int i = 0; i < colnames.length; i++) {
if(i<colnames.length-1){
if((i+1)%20==0){
s=s+"?,\"+\r\n\t\t\t\"";
}else{
s=s+"?,";
}
}else{
s=s+"?";
}
}
sb.append(s+")\";\r\n");
//e2->>batch
sb.append("\t\tboolean bResult = false;\r\n");
sb.append("\t\tList<Object[]> args = new ArrayList<Object[]>();\r\n");
sb.append("\t\tint len = entities.size();\r\n");
sb.append("\t\tint i = 0;\r\n");
sb.append("\t\tfor("+beanName+" e : entities){\r\n");
//e3->>
sb.append("\t\t\targs.add( processInsertParm(e) );\r\n");
sb.append("\t\t\ti++;\r\n");
sb.append("\t\t\tif ((i % BATCH_SIZE == 0) || i == len) {\r\n");
//e4->>
sb.append("\t\t\t\tint[] rs = this.getJdbcDaoSupport(p).batchUpdate(strSql, args, sqlNote);\r\n");
sb.append("\t\t\t\targs.clear();\r\n");
sb.append("\t\t\t\tif(logger.isDebugEnabled()){\r\n");
//e5->>
sb.append("\t\t\t\t\tlogger.debug(\"[正在批量提交數據]: \"+i+\"/\"+len+\", BY \"+name);\r\n");
//e4
sb.append("\t\t\t\t}\r\n");
sb.append("\t\t\t\tif(rs == null){ bResult = false; break; }\r\n");
sb.append("\t\t\t\telse{ bResult = true; }\r\n");
//e3
sb.append("\t\t\t}\r\n");
//e2 batch
sb.append("\t\t}\r\n");
sb.append("\t\tlogger.info(\"[完成批量提交數據]: \"+i+\"/\"+len+\", BY \"+name);\r\n");
//e2,e1->>
sb.append("\t\treturn bResult;\r\n\t}\r\n");
}
/**
* 生成Dao的Jdbc實現: deleteBatch 插入對象.
*/
private void daoMethodDeleteBatch(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** deleteBatch row */\r\n");
sb.append("\tpublic boolean deleteBatch(List<"+beanName+"> entities, SupDto p) {\r\n");
//e2->>
sb.append("\t\tif(entities == null || entities.size()==0) return true;\r\n");
sb.append("\t\tString tablename = this.getTableName(p, this.table);\r\n");
sb.append("\t\tString sqlNote = this.getSqlNote(p, this.name);\r\n");
sb.append("\t\tString strSql = null;\r\n");
sb.append("\t\tstrSql =\" DELETE \"+ tablename +\" WHERE ID =?..... \";\r\n");
//e2->>
sb.append("\t\t//TODO ADD WHERE CODE......\r\n");
//e2->>batch
sb.append("\t\tboolean bResult = false;\r\n");
sb.append("\t\tList<Object[]> args = new ArrayList<Object[]>();\r\n");
sb.append("\t\tint len = entities.size();\r\n");
sb.append("\t\tint i = 0;\r\n");
sb.append("\t\tfor("+beanName+" e : entities){\r\n");
//e3->>
sb.append("\t\t\targs.add( processDeleteParm(e) );\r\n");
sb.append("\t\t\ti++;\r\n");
sb.append("\t\t\tif ((i % BATCH_SIZE == 0) || i == len) {\r\n");
//e4->>
sb.append("\t\t\t\tint[] rs = this.getJdbcDaoSupport(p).batchUpdate(strSql, args, sqlNote);\r\n");
sb.append("\t\t\t\targs.clear();\r\n");
sb.append("\t\t\t\tif(logger.isDebugEnabled()){\r\n");
//e5->>
sb.append("\t\t\t\t\tlogger.debug(\"[正在批量提交數據]: \"+i+\"/\"+len+\", BY \"+name);\r\n");
//e4
sb.append("\t\t\t\t}\r\n");
sb.append("\t\t\t\tif(rs == null){ bResult = false; break; }\r\n");
sb.append("\t\t\t\telse{ bResult = true; }\r\n");
//e3
sb.append("\t\t\t}\r\n");
//e2 batch
sb.append("\t\t}\r\n");
sb.append("\t\tlogger.info(\"[完成批量提交數據]: \"+i+\"/\"+len+\", BY \"+name);\r\n");
//e2,e1->>
sb.append("\t\treturn bResult;\r\n\t}\r\n");
}
/**
* 生成Dao的Jdbc實現: updateBatch 插入對象.
*/
private void daoMethodUpdateBatch(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** updateBatch row */\r\n");
sb.append("\tpublic boolean updateBatch(List<"+beanName+"> entities, SupDto p) {\r\n");
//e2->>
sb.append("\t\tif(entities == null || entities.size()==0) return true;\r\n");
sb.append("\t\tString tablename = this.getTableName(p, this.table);\r\n");
sb.append("\t\tString sqlNote = this.getSqlNote(p, this.name);\r\n");
sb.append("\t\tString strSql = null;\r\n");
sb.append("\t\tstrSql =\" UPDATE \"+ tablename +\" SET\"+\r\n");
//e3->>
sb.append("\t\t\t\" ");
String s="";
for (int i = 0; i < colnames.length; i++) {
if(i<colnames.length-1){
if((i+1)%10==0){
s=s+colnames[i]+"=?,\"+\r\n\t\t\t\" ";
}else{
s=s+colnames[i]+"=?,";
}
}else{
s=s+colnames[i]+"=?";
}
}
sb.append(s.toUpperCase()+"\"+\r\n");
sb.append("\t\t\t\" WHERE ID =?..... \";\r\n");
//e2->>
sb.append("\t\t//TODO ADD WHERE CODE......\r\n");
//e2->>batch
sb.append("\t\tboolean bResult = false;\r\n");
sb.append("\t\tList<Object[]> args = new ArrayList<Object[]>();\r\n");
sb.append("\t\tint len = entities.size();\r\n");
sb.append("\t\tint i = 0;\r\n");
sb.append("\t\tfor("+beanName+" e : entities){\r\n");
//e3->>
sb.append("\t\t\targs.add( processUpdateParm(e) );\r\n");
sb.append("\t\t\ti++;\r\n");
sb.append("\t\t\tif ((i % BATCH_SIZE == 0) || i == len) {\r\n");
//e4->>
sb.append("\t\t\t\tint[] rs = this.getJdbcDaoSupport(p).batchUpdate(strSql, args, sqlNote);\r\n");
sb.append("\t\t\t\targs.clear();\r\n");
sb.append("\t\t\t\tif(logger.isDebugEnabled()){\r\n");
//e5->>
sb.append("\t\t\t\t\tlogger.debug(\"[正在批量提交數據]: \"+i+\"/\"+len+\", BY \"+name);\r\n");
//e4
sb.append("\t\t\t\t}\r\n");
sb.append("\t\t\t\tif(rs == null){ bResult = false; break; }\r\n");
sb.append("\t\t\t\telse{ bResult = true; }\r\n");
//e3
sb.append("\t\t\t}\r\n");
//e2 batch
sb.append("\t\t}\r\n");
sb.append("\t\tlogger.info(\"[完成批量提交數據]: \"+i+\"/\"+len+\", BY \"+name);\r\n");
//e2,e1->>
sb.append("\t\treturn bResult;\r\n\t}\r\n");
}
/**
* 生成Dao的Jdbc實現: updateOrInsert 插入對象.
*/
private void daoMethodUpdateOrInsertBatch(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** updateOrInsertBatch row */\r\n");
sb.append("\tpublic boolean updateOrInsertBatch(List<"+beanName+"> entities, SupDto p) {\r\n");
//e2->>
sb.append("\t\tif(entities==null || entities.size()==0) return true;\r\n");
sb.append("\t\tString tablename = this.getTableName(p, this.table);\r\n");
sb.append("\t\tString sqlNote = this.getSqlNote(p, this.name);\r\n");
sb.append("\t\tString sqlUp = null;\r\n");
sb.append("\t\tString sqlIn = null;\r\n");
//
// insert sql
String s="";
for (int i = 0; i < colnames.length; i++) {
if(i<colnames.length-1){
if((i+1)%10==0){
s=s+colnames[i]+",\"+\r\n\t\t\t\" ";
}else{
s=s+colnames[i]+",";
}
}else{
s=s+colnames[i];
}
}
sb.append("\t\tsqlIn =\" INSERT INTO \"+ tablename +\" (\"+\r\n");
//e3->>
sb.append("\t\t\t\" "+s.toUpperCase()+") \"+\r\n");
sb.append("\t\t\t\" VALUES(");
s="";
for (int i = 0; i < colnames.length; i++) {
if(i<colnames.length-1){
if((i+1)%20==0){
s=s+"?,\"+\r\n\t\t\t\"";
}else{
s=s+"?,";
}
}else{
s=s+"?";
}
}
sb.append(s+")\";\r\n");
// update sql
sb.append("\t\tsqlUp =\" UPDATE \"+ tablename +\" SET\"+\r\n");
//e3->>
sb.append("\t\t\t\" ");
s="";
for (int i = 0; i < colnames.length; i++) {
if(i<colnames.length-1){
if((i+1)%10==0){
s=s+colnames[i]+"=?,\"+\r\n\t\t\t\" ";
}else{
s=s+colnames[i]+"=?,";
}
}else{
s=s+colnames[i]+"=?";
}
}
sb.append(s.toUpperCase()+"\"+\r\n");
sb.append("\t\t\t\" WHERE ID =?..... \";\r\n");
//e2->>
sb.append("\t\t//TODO ADD WHERE CODE......\r\n");
//e2->>batch
sb.append("\t\tboolean bResult = false;\r\n");
sb.append("\t\tList<Object[]> args = new ArrayList<Object[]>();\r\n");
sb.append("\t\tint len = entities.size();\r\n");
sb.append("\t\tint i = 0;\r\n");
sb.append("\t\tfor("+beanName+" e : entities){\r\n");
//e3->>
sb.append("\t\t\targs.add( processUpdateOrInsertParm(e) );\r\n");
sb.append("\t\t\ti++;\r\n");
sb.append("\t\t\tif ((i % BATCH_SIZE == 0) || i == len) {\r\n");
//e4->>
sb.append("\t\t\t\tbResult = this.getJdbcDaoSupport(p).batchUpdateOrInsert(sqlUp, sqlIn, args, sqlNote);\r\n");
sb.append("\t\t\t\targs.clear();\r\n");
sb.append("\t\t\t\tif(logger.isDebugEnabled()){\r\n");
//e5->>
sb.append("\t\t\t\t\tlogger.debug(\"[正在批量提交數據]: \"+i+\"/\"+len+\", BY \"+name);\r\n");
//e4
sb.append("\t\t\t\t}\r\n");
sb.append("\t\t\t\tif(! bResult){ break; }\r\n");
//e3
sb.append("\t\t\t}\r\n");
//e2 batch
sb.append("\t\t}\r\n");
sb.append("\t\tlogger.info(\"[完成批量提交數據]: \"+i+\"/\"+len+\", BY \"+name);\r\n");
//e2,e1->>
sb.append("\t\treturn bResult;\r\n\t}\r\n");
}
//------------------------生成 Dao Process 實體處理部分---------------------------
/**
* 生成Dao的Jdbc實現: processInsertParm 插入對象參數處理的方法
*/
private void daoMethodProcessInsertParm(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** Insert parameters */\r\n");
sb.append("\tprotected Object[] processInsertParm("+beanName+" e) {\r\n");
//e2->>
sb.append("\t\tObject[] parameters = new Object[]{\r\n");
//e3->>
sb.append("\t\t\t");
String s="";
for (int i = 0; i < colnames.length; i++) {
if(i<colnames.length-1){
if((i+1) % 5 == 0){
s=s+"e.get"+firstUpperCase(benFieldName[i])+"(), \r\n\t\t\t";
}else{
s=s+"e.get"+firstUpperCase(benFieldName[i])+"(), ";
}
}else{
s=s+"e.get"+firstUpperCase(benFieldName[i])+"()";
}
}
sb.append(s+" };\r\n");
//e2->>
sb.append("\t\treturn parameters;\r\n");
//e1->>
sb.append("\t}\r\n");
}
/**
* 生成Dao的Jdbc實現: processDeleteParm 修改對象參數處理的方法
*/
private void daoMethodProcessDeleteParm(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** Insert parameters */\r\n");
sb.append("\tprotected Object[] processDeleteParm("+beanName+" e) {\r\n");
//e2->>
sb.append("\t\tObject[] parameters = new Object[]{\r\n");
//e3->>
sb.append("\t\t\t//TODO ADD WHERE CODE......\r\n");
sb.append("\t\t\t};\r\n");
//e2->>
sb.append("\t\treturn parameters;\r\n");
//e1->>
sb.append("\t}\r\n");
}
/**
* 生成Dao的Jdbc實現: processUpdateParm 修改對象參數處理的方法
*/
private void daoMethodProcessUpdateParm(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** Insert parameters */\r\n");
sb.append("\tprotected Object[] processUpdateParm("+beanName+" e) {\r\n");
//e2->>
sb.append("\t\tObject[] parameters = new Object[]{\r\n");
//e3->>
sb.append("\t\t\t");
String s="";
for (int i = 0; i < colnames.length; i++) {
if(i<colnames.length-1){
if((i+1) % 5 == 0){
s=s+"e.get"+firstUpperCase(benFieldName[i])+"(), \r\n\t\t\t";
}else{
s=s+"e.get"+firstUpperCase(benFieldName[i])+"(), ";
}
}else{
s=s+"e.get"+firstUpperCase(benFieldName[i])+"()";
}
}
sb.append(s+"\r\n");
sb.append("\t\t\t//TODO ADD WHERE CODE......\r\n");
sb.append("\t\t\t};\r\n");
//e2->>
sb.append("\t\treturn parameters;\r\n");
//e1->>
sb.append("\t}\r\n");
}
/**
* 生成Dao的Jdbc實現: processUpdateOrInsertParm 修改對象參數處理的方法
*/
private void daoMethodProcessUpdateOrInsertParm(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** Insert parameters */\r\n");
sb.append("\tprotected Object[] processUpdateOrInsertParm("+beanName+" e) {\r\n");
//e2->>
sb.append("\t\tObject[] parameters = new Object[]{\r\n");
//e3->>
sb.append("\t\t\t");
String s="";
for (int i = 0; i < colnames.length; i++) {
if(i<colnames.length-1){
if((i+1) % 5 == 0){
s=s+"e.get"+firstUpperCase(benFieldName[i])+"(), \r\n\t\t\t";
}else{
s=s+"e.get"+firstUpperCase(benFieldName[i])+"(), ";
}
}else{
s=s+"e.get"+firstUpperCase(benFieldName[i])+"()";
}
}
sb.append(s+"\r\n");
sb.append("\t\t\t//TODO ADD WHERE CODE......\r\n");
sb.append("\t\t\t};\r\n");
//e2->>
sb.append("\t\treturn parameters;\r\n");
//e1->>
sb.append("\t}\r\n");
}
/**
* 生成Dao的Jdbc實現: getColumnString 方法
*/
private void daoMethodGetColumnString(StringBuffer sb) {
sb.append("\r\n");
sb.append("\t/** "+colnames.length+" Column */\r\n");
sb.append("\tprotected String getColumnString() {\r\n");
String s="";
for (int i = 0; i < colnames.length; i++) {
if(i<colnames.length-1){
if((i+1)%10==0){
s=s+colnames[i]+",\"+\r\n\t\t\t\"";
}else{
s=s+colnames[i]+",";
}
}else{
s=s+colnames[i];
}
}
sb.append("\t\tString sqlSql =\" "+s.toUpperCase()+" \";\r\n");
//e1->>
sb.append("\t\treturn sqlSql;\r\n\t}\r\n");
}
public boolean isConvertColName() {
return isConvertColName;
}
public void setConvertColName(boolean isConvertColName) {
this.isConvertColName = isConvertColName;
}
public boolean isOnlyCreateBean() {
return onlyCreateBean;
}
public void setOnlyCreateBean(boolean onlyCreateBean) {
this.onlyCreateBean = onlyCreateBean;
}
public boolean isCreateBatchMethod() {
return isCreateBatchMethod;
}
public void setCreateBatchMethod(boolean isCreateBatchMethod) {
this.isCreateBatchMethod = isCreateBatchMethod;
}
/**
* @param args
*/
public static void main(String[] args) {
//HD_ELEC_D,M_DEPT,M_TRANS_STATION,ALARM_EVENTS,SMSC_RD_ALARM_EVENT
TableToSerivceByArchUtils t = new TableToSerivceByArchUtils();
t.setConvertColName(false);
t.setCreateBatchMethod(true);
t.setOnlyCreateBean(false);
//
t.execute("INTERFACE_ID_MAPPING");
}
}
代碼太長了, 生成的類由看下一節
關於數據源的問題, 請自己處理, 這個不是核心代碼.