package com.norteksoft.mms.form.jdbc.impl;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.util.Assert;
import com.norteksoft.product.api.entity.Department;
import com.norteksoft.acs.entity.organization.User;
import com.norteksoft.mms.base.CommonStaticConstant;
import com.norteksoft.mms.form.entity.FormControl;
import com.norteksoft.mms.form.entity.FormView;
import com.norteksoft.mms.form.entity.TableColumn;
import com.norteksoft.mms.form.enumeration.DataType;
import com.norteksoft.mms.form.jdbc.JdbcSupport;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.orm.Page;
import com.norteksoft.product.util.ContextUtils;
public class SqlServerJdbc extends JdbcDaoSupport implements JdbcSupport {
private Log log=LogFactory.getLog(MySqlJdbc.class);
/**
* 创建表
* @param tableName
* @param fields
*/
public void createTable(String tableName,List<TableColumn> columns){
StringBuilder str = new StringBuilder();
str.append("CREATE TABLE [dbo].[").append(tableName).append("](");
str.append("id bigint(20) NOT NULL AUTO_INCREMENT ,PRIMARY KEY ('id'),instance_id varchar(255)" );
str.append("[id] [numeric](19, 0) IDENTITY(1,1) NOT NULL,[instance_id] [varchar](255) NULL" );
str.append("," );
for(TableColumn tableColumn:columns){
str.append("[");
str.append(FORM_FIELD_PREFIX_STRING).append(tableColumn.getName());
str.append("]");
str.append(getSqlType(tableColumn)).append(",");
}
str.append("PRIMARY KEY CLUSTERED([id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]");
this.getJdbcTemplate().execute(str.toString());
}
/**
* 创建表
* @param tableName
* @param fields
*/
public void createDefaultTable(String tableName,List<FormControl> columns){
StringBuilder str = new StringBuilder();
str.append("CREATE TABLE [dbo].[").append(tableName).append("](");
str.append("[id] [numeric](19, 0) IDENTITY(1,1) NOT NULL,[instance_id] [varchar](255) NULL,[company_id] [numeric](19, 0) NULL" );
str.append(",[creator] [varchar](255) NULL,[creator_name] [varchar](255) NULL,[first_task_id] [numeric](19, 0) NULL" );
str.append(",[process_state] [int] NULL,[current_activity_name] [varchar](255) NULL,[workflow_definition_name] [varchar](255) NULL" );
str.append(",[workflow_definition_id] [varchar](255) NULL,[workflow_definition_code] [varchar](255) NULL" );
str.append(",[workflow_definition_version] [int] NULL,[form_id] [numeric](19, 0) NULL,[create_date] [datetime] NULL" );
str.append(",[creator_department] [varchar](255) NULL" );
str.append("," );
for(FormControl tableColumn:columns){
str.append("[");
str.append(FORM_FIELD_PREFIX_STRING).append(tableColumn.getName());
str.append("]");
str.append(getSqlType(tableColumn)).append(",");
}
str.append("PRIMARY KEY CLUSTERED([id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]");
this.getJdbcTemplate().execute(str.toString());
}
private String getSqlType(TableColumn tableColumn){
DataType type = tableColumn.getDataType();
Integer length = tableColumn.getMaxLength();
String dataType = "";
if(type.equals(DataType.TEXT)){
if(length != null){
dataType = " [varchar]("+ length +") NULL";
}else{
dataType = " [varchar](255) NULL";
}
}else if(type.equals(DataType.INTEGER)){
dataType = " [int] NULL";
}else if(type.equals(DataType.LONG)){
dataType = " [numeric](19, 0) NULL";
}else if(type.equals(DataType.BOOLEAN)){
dataType = " [tinyint] NULL";
}else if(type.equals(DataType.DOUBLE)||type.equals(DataType.FLOAT)){
dataType = " [float] NULL";
}else if(type.equals(DataType.TIME)){
dataType = " [datetime] NULL";
}else if(type.equals(DataType.DATE)){
dataType = " [datetime] NULL";
}else if(type.equals(DataType.CLOB)){
dataType = " [ntext] NULL";
}else if(type.equals(DataType.AMOUNT)){
dataType = " [float] NULL";
}else if(type.equals(DataType.NUMBER)){
dataType = " [numeric](19, 0) NULL";
}
return dataType;
}
private String getSqlType(FormControl tableColumn){
DataType type = tableColumn.getDataType();
Integer length = tableColumn.getMaxLength();
String dataType = "";
if(type.equals(DataType.TEXT)){
if(length != null){
dataType = " [varchar]("+ length +") NULL";
}else{
dataType = " [varchar](255) NULL";
}
}else if(type.equals(DataType.INTEGER)){
dataType = " [int] NULL";
}else if(type.equals(DataType.LONG)){
dataType = " [numeric](19, 0) NULL";
}else if(type.equals(DataType.BOOLEAN)){
dataType = " [tinyint] NULL";
}else if(type.equals(DataType.DOUBLE)||type.equals(DataType.FLOAT)){
dataType = " [float] NULL";
}else if(type.equals(DataType.TIME)){
dataType = " [datetime] NULL";
}else if(type.equals(DataType.DATE)){
dataType = " [datetime] NULL";
}else if(type.equals(DataType.CLOB)){
dataType = " [ntext] NULL";
}else if(type.equals(DataType.AMOUNT)){
dataType = " [float] NULLL";
}else if(type.equals(DataType.NUMBER)){
dataType = " [numeric](19, 0) NULL";
}
return dataType;
}
/**
* 创建外键
* @param sequenceId
*/
public void createFK(String majorTableName,String childTableName ){
StringBuilder sql = new StringBuilder();
sql.append("alter table ").append(childTableName).append(" add ").append(TABLE_FK_PREFIX_STRING).append(majorTableName).append(" bigint(20) ");
this.getJdbcTemplate().execute(sql.toString());
this.getJdbcTemplate().execute("alter table "+childTableName+" add foreign key("+TABLE_FK_PREFIX_STRING+majorTableName+") references "+majorTableName+"(id) on delete cascade");
}
/**
* 追加一列
* @param tableName
* @param field
*/
public void addTableColumn(String tableName,TableColumn column){
StringBuilder sql = new StringBuilder();
sql.append("alter table ").append(tableName).append(" add ").append(FORM_FIELD_PREFIX_STRING).append(column.getName()).append(getSqlType(column));
this.getJdbcTemplate().execute(sql.toString());
}
/**
* 修改一列的名称
* @param tableName
* @param column
*/
public void alterTableColumn(String tableName,TableColumn column, String newName){
StringBuilder sql = new StringBuilder();
sql.append("alter table ").append(tableName).append(" change ").append(FORM_FIELD_PREFIX_STRING).append(column.getName()).append(" ").append(FORM_FIELD_PREFIX_STRING).append(newName);
this.getJdbcTemplate().execute(sql.toString());
}
/**
* 根据表名和记录ID查询对应数据,返回Map
*/
public Map getDataMap(String tableName, Long id) {
String sql = "select * from " + tableName +" where id= ?" ;
return this.getJdbcTemplate().queryForMap(sql, new Long[] {id});
}
public Long updateTable(Map<String,String[]> parameterMap,FormView form,List<FormControl> fields,Long dataId){
try {
if(fields!=null && fields.size()>0){
final List<Object> obj = new ArrayList<Object>();
final List<String> dataTypes=new ArrayList<String>();
boolean canUpateTabel=false;
StringBuilder sql = new StringBuilder("UPDATE ").append(form.getDataTable().getName()).append(" SET ");
String[] firstTaskIds = parameterMap.get(FIRST_TASK_ID);
if(firstTaskIds!=null){
joinStandardSql(Long.parseLong(firstTaskIds[0]),FIRST_TASK_ID,sql,obj);
dataTypes.add(DataType.LONG.toString());
canUpateTabel=true;
}
String[] currentActivityNames = parameterMap.get(CURRENT_ACTIVITY_NAME);
if(currentActivityNames!=null){
joinStandardSql(currentActivityNames[0],CURRENT_ACTIVITY_NAME,sql,obj);
dataTypes.add(DataType.TEXT.toString());
canUpateTabel=true;
}
String[] workflowDefinitionNames = parameterMap.get(WORKFLOW_DEFINITION_NAME);
if(workflowDefinitionNames!=null){
joinStandardSql(workflowDefinitionNames[0],WORKFLOW_DEFINITION_NAME,sql,obj);
dataTypes.add(DataType.TEXT.toString());
canUpateTabel=true;
}
String[] WorkflowDefinitionIds = parameterMap.get(WORKFLOW_DEFINITION_ID);
if(WorkflowDefinitionIds!=null){
joinStandardSql(WorkflowDefinitionIds[0],WORKFLOW_DEFINITION_ID,sql,obj);
dataTypes.add(DataType.TEXT.toString());
canUpateTabel=true;
}
String[] WorkflowDefinitionCodes = parameterMap.get(WORKFLOW_DEFINITION_CODE);
if(WorkflowDefinitionCodes!=null){
joinStandardSql(WorkflowDefinitionCodes[0],WORKFLOW_DEFINITION_CODE,sql,obj);
dataTypes.add(DataType.TEXT.toString());
canUpateTabel=true;
}
String[] WorkflowDefinitionVersions = parameterMap.get(WORKFLOW_DEFINITION_VERSION);
if(WorkflowDefinitionVersions!=null){
joinStandardSql(Integer.parseInt(WorkflowDefinitionVersions[0]),WORKFLOW_DEFINITION_VERSION,sql,obj);
dataTypes.add(DataType.INTEGER.toString());
canUpateTabel=true;
}
String[] formIds = parameterMap.get(FORM_ID);
if(formIds!=null){
joinStandardSql(Long.parseLong(formIds[0]),FORM_ID,sql,obj);
dataTypes.add(DataType.LONG.toString());
canUpateTabel=true;
}
String[] processStates = parameterMap.get(PROCESS_STATE);
if(processStates!=null){
joinStandardSql(Integer.parseInt(processStates[0]),PROCESS_STATE,sql,obj);
dataTypes.add(DataType.INTEGER.toString());
canUpateTabel=true;
}
for (FormControl field:fields) {
String dbname=field.getName();
if(parameterMap.get(dbname)!=null){
String value ="";
Object myobj=parameterMap.get(dbname);
String str=myobj.getClass().getName();
if(str.indexOf("[")==0){
if(((String[])myobj).length>1){
String text = Arrays.toString(((String[])myobj));//获得的值为[value]
value=text.substring(1, text.length()-1);
}else{
value=((String[])myobj)[0];
}
}else{
value=myobj+"";
}
if(field.getDataType()==DataType.DATE){
dataTypes.add(field.getDataType().toString());
if(StringUtils.isEmpty(value)) { joinSql(null,field.getName(),sql,obj);continue;};
joinSql(value,field.getName(),sql,obj);
}else if(field.getDataType()==DataType.TIME){
dataTypes.add(field.getDataType().toString());
if(StringUtils.isEmpty(value)) { joinSql(null,field.getName(),sql,obj);continue;};
if(!value.contains(":")){//是否包含时和分,如果不包含则添加00:00。数据获取控件用于存放字段值的控件为时间类型时会出现该情况。
value = value+" 00:00";
}
joinSql(value,field.getName(),sql,obj);
}else if(field.getDataType()==DataType.BOOLEAN){
dataTypes.add(field.getDataType().toString());
if(StringUtils.isEmpty(value)) { joinSql(null,field.getName(),sql,obj);continue;};
if("false".equals(value)||"0".equals(value)){
joinSql(0x00,field.getName(),sql,obj);
}else if("true".equals(value)||"1".equals(value)){
joinSql(0x01,field.getName(),sql,obj);
}
}else if(field.getDataType()==DataType.DOUBLE){
dataTypes.add(field.getDataType().toString());
if(StringUtils.isEmpty(value)) { joinSql(null,field.getName(),sql,obj);continue;};
joinSql(Double.valueOf(value),field.getName(),sql,obj);
}else if(field.getDataType()==DataType.FLOAT){
dataTypes.add(field.getDataType().toString());
if(StringUtils.isEmpty(value)) { joinSql(null,field.getName(),sql,obj);continue;};
joinSql(Float.valueOf(value),field.getName(),sql,obj);
}else if(field.getDataType()==DataType.LONG){
dataTypes.add(field.getDataType().toString());
if(StringUtils.isEmpty(value)) { joinSql(null,field.getName(),sql,obj);continue;};
joinSql(Integer.valueOf(value),field.getName(),sql,obj);
}else if(field.getDataType()==DataType.AMOUNT){
dataTypes.add(field.getDataType().toString());
if(StringUtils.isEmpty(value)) { joinSql(null,field.getName(),sql,obj);continue;};
joinSql(Double.valueOf(value),field.getName(),sql,obj);
}else if(field.getDataType()==DataType.NUMBER){
dataTypes.add(field.getDataType().toString());
if(StringUtils.isEmpty(value)) { joinSql(null,field.getName(),sql,obj);continue;};
joinSql(Integer.valueOf(value),field.getName(),sql,obj);
}else if(field.getDataType()==DataType.INTEGER){
dataTypes.add(field.getDataType().toString());
if(StringUtils.isEmpty(value)){ joinSql(null,field.getName(),sql,obj);continue;}
joinSql(Integer.valueOf(value),field.getName(),sql,obj);
}else{
String[] values = parameterMap.get(field.getName());
String text = Arrays.toString(values);//获得的值为[value]
//text.substring(1, text.length()-1),去掉text的前后[]
joinSql(text.substring(1, text.length()-1),field.getName(),sql,obj);
dataTypes.add(field.getDataType().toString());
}
canUpateTabel=true;
}else{
joinSql(null,field.getName(),sql,obj);
dataTypes.add(field.getDataType().toString());
canUpateTabel=true;
}
}
sql.replace(sql.length()-1, sql.length(), " ");
sql.append(" where id=?");
obj.add(dataId);
if(canUpateTabel){
getJdbcTemplate().update(sql.toString(), new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
for(int i=0;i<obj.size();i++){
if(obj.get(i)==null){
ps.setNull(i+1, getSqlTypeByDataType(dataTypes.get(i)));
}else{
ps.setObject(i+1, obj.get(i));
}
}
}
});
}
}
} catch (NumberFormatException e) {
throw new RuntimeException("numberFormatException",e);
} catch (DataAccessException e) {
throw new RuntimeException("update Exception",e);
}
return dataId;
}
public Long autoUpdateTable(Map<String,String[]> parameterMap,FormView form,List<FormControl> fields,Long dataId){
try {
if(fields!=null && fields.size()>0){
List<Object> obj = new ArrayList<Object>();
boolean canUpateTabel=false;
StringBuilder sql = new StringBuilder("UPDATE ").append(form.getDataTable().getName()).append(" SET ");
for (FormControl field:fields) {
if(parameterMap.get(field.getName())!=null){
if(field.getDataType()==DataType.DATE){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(value,field.getName(),sql,obj);
}else if(field.getDataType()==DataType.TIME){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(value,field.getName(),sql,obj);
}else if(field.getDataType()==DataType.BOOLEAN){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
if("false".equals(value)||"0".equals(value)){
joinSql(0x00,field.getName(),sql,obj);
}else if("true".equals(value)||"1".equals(value)){
joinSql(0x01,field.getName(),sql,obj);
}
}else if(field.getDataType()==DataType.DOUBLE){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(Double.valueOf(value),field.getName(),sql,obj);
}else if(field.getDataType()==DataType.FLOAT){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(Float.valueOf(value),field.getName(),sql,obj);
}else if(field.getDataType()==DataType.LONG){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(Integer.valueOf(value),field.getName(),sql,obj);
}else if(field.getDataType()==DataType.AMOUNT){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(Double.valueOf(value),field.getName(),sql,obj);
}else if(field.getDataType()==DataType.NUMBER){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(Integer.valueOf(value),field.getName(),sql,obj);
}else if(field.getDataType()==DataType.INTEGER){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(Integer.valueOf(value),field.getName(),sql,obj);
}else{
String[] values = parameterMap.get(field.getName());
String text = Arrays.toString(values);//获得的值为[value]
//text.substring(1, text.length()-1),去掉text的前后[]
joinSql(text.substring(1, text.length()-1),field.getName(),sql,obj);
}
canUpateTabel=true;
}
}
sql.replace(sql.length()-1, sql.length(), " ");
sql.append(" where id=?");
obj.add(dataId);
if(canUpateTabel){
getJdbcTemplate().update(sql.toString(),obj.toArray());
}
}
} catch (NumberFormatException e) {
throw new RuntimeException("numberFormatException",e);
} catch (DataAccessException e) {
throw new RuntimeException("update Exception",e);
}
return dataId;
}
private int getSqlTypeByDataType(String dataType){
if(DataType.DATE.toString().equals(dataType)){
return java.sql.Types.DATE;
}else if(DataType.TIME.toString().equals(dataType)){
return java.sql.Types.TIME;
}else if(DataType.BOOLEAN.toString().equals(dataType)){
return java.sql.Types.BIT;
}else if(DataType.DOUBLE.toString().equals(dataType)){
return java.sql.Types.DOUBLE;
}else if(DataType.FLOAT.toString().equals(dataType)){
return java.sql.Types.FLOAT;
}else if(DataType.LONG.toString().equals(dataType)){
return java.sql.Types.BIGINT;
}else if(DataType.AMOUNT.toString().equals(dataType)){
return java.sql.Types.FLOAT;
}else if(DataType.NUMBER.toString().equals(dataType)){
return java.sql.Types.INTEGER;
}else if(DataType.INTEGER.toString().equals(dataType)){
return java.sql.Types.INTEGER;
}else{
return java.sql.Types.VARCHAR;
}
}
private void joinStandardSql(Object value,String enName,StringBuilder sql,List<Object> obj){
sql.append( enName+"=? ,");
obj.add(value);
}
private void joinSql(Object value,String enName,StringBuilder sql,List<Object> obj){
sql.append(FORM_FIELD_PREFIX_STRING + enName+"=? ,");
obj.add(value);
}
public Long insertTable(Map<String,String[]> parameterMap,FormView form,List<FormControl> fields){
StringBuilder sql = new StringBuilder("INSERT INTO ").append(form.getDataTable().getName()).append("(");
StringBuilder sql_values = new StringBuilder(" VALUES(");
List<Object> obj = new ArrayList<Object>();
String[] instanceIds = parameterMap.get(INSTANCE_ID);
if(instanceIds!=null){
sql.append(INSTANCE_ID).append(",");
sql_values.append("?");
obj.add(instanceIds[0]);
}
sql.append(COMPANY_ID).append(",");
sql_values.append(",?");
obj.add(ContextUtils.getCompanyId());
sql.append(CREATOR).append(",");
sql_values.append(",?");
obj.add(ContextUtils.getLoginName());
sql.append(CREATOR_NAME).append(",");
sql_values.append(",?");
obj.add(ContextUtils.getUserName());
//创建时间
sql.append(CREATE_DATE).append(",");
sql_values.append(",?");
obj.add(new Date());
//创建人部门
com.norteksoft.product.api.entity.User user = ApiFactory.getAcsService().getUserByLoginName(ContextUtils.getLoginName());
if(user!=null){
if(user.getMainDepartmentId()!=null){
Department dept = ApiFactory.getAcsService().getDepartmentById(user.getMainDepartmentId());
if(dept!=null){
sql.append(CREATOR_DEPARTMENT).append(",");
sql_values.append(",?");
obj.add(dept.getName());
}
}
}
try {
for (FormControl field:fields) {
if(parameterMap.get(field.getName())==null) continue;
if(field.getDataType()==DataType.DATE){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(value,field.getName(),sql,sql_values,obj);
}else if(field.getDataType()==DataType.TIME){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
if(!value.contains(":")){//是否包含时和分,如果不包含则添加00:00。数据获取控件用于存放字段值的控件为时间类型时会出现该情况。
value = value+" 00:00";
}
joinSql(value,field.getName(),sql,sql_values,obj);
}else if(field.getDataType()==DataType.BOOLEAN){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
if("0".equals(value)||"false".equals(value)){
joinSql(0x00,field.getName(),sql,sql_values,obj);
}else if("1".equals(value)||"true".equals(value)){
joinSql(0x01,field.getName(),sql,sql_values,obj);
}
}else if(field.getDataType()==DataType.DOUBLE){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(Double.valueOf(value),field.getName(),sql,sql_values,obj);
}else if(field.getDataType()==DataType.FLOAT){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(Float.valueOf(value),field.getName(),sql,sql_values,obj);
}else if(field.getDataType()==DataType.LONG){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(Integer.valueOf(value),field.getName(),sql,sql_values,obj);
}else if(field.getDataType()==DataType.AMOUNT){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(Double.valueOf(value),field.getName(),sql,sql_values,obj);
}else if(field.getDataType()==DataType.NUMBER){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(Integer.valueOf(value),field.getName(),sql,sql_values,obj);
}else if(field.getDataType()==DataType.INTEGER){
String value = parameterMap.get(field.getName())[0];
if(StringUtils.isEmpty(value)) continue;
joinSql(Integer.valueOf(value),field.getName(),sql,sql_values,obj);
}else{
String[] values = parameterMap.get(field.getName());
String text = Arrays.toString(values);
joinSql(text.substring(1, text.length()-1),field.getName(),sql,sql_values,obj);
}
}
sql.replace(sql.length()-1, sql.length(), ")");
sql_values.append(")");
sql.append(sql_values);
getJdbcTemplate().update(sql.toString(),obj.toArray());
Long id=getJdbcTemplate().queryForLong("select max(id) from "+form.getDataTable().getName());
return id;
} catch (NumberFormatException e) {
log.debug(e);
throw new RuntimeException("numberFormatException",e);
} catch (DataAccessException e) {
log.debug("excute sql failed .");
log.debug(e);
throw new RuntimeException("update Exception",e);
}
}
private void joinSql(Object value,String enName,StringBuilder sql,StringBuilder sql_values,List<Object> obj){
sql.append(FORM_FIELD_PREFIX_STRING + enName).append(",");
sql_values.append(",?");
obj.add(value);
}
//将表单对应的子表的数据保存到数据库中
public void insertChildTable(Map<String,Object> result,FormView parentForm,List<FormControl> parentFields,FormView childForm,Long parentRowId){
deleteData(childForm.getDataTable().getName(),TABLE_FK_PREFIX_STRING+parentForm.getDataTable().getName(),parentRowId);
Map childFields=(Map)result.get(CommonStaticConstant.DATA_SOURCE_FIELD);
Map fieldValues=(Map)(result.get(CommonStaticConstant.DATA_SOURCE_FIELD_VALUE));
if(childFields!=null && fieldValues!=null){
Set set=childFields.keySet();
Iterator childFieldIt=set.iterator();
String firstField=childFields.size()>0?(String)(childFieldIt.next()):"";
int rows=((String[])fieldValues.get(firstField)).length;
for(int i=0;i<rows;i++){
childFieldIt=set.iterator();
StringBuilder sql = new StringBuilder("INSERT INTO ").append(childForm.getDataTable().getName()).append("(");
StringBuilder sql_values = new StringBuilder(" VALUES(");
List<Object> obj = new ArrayList<Object>();
sql.append(TABLE_FK_PREFIX_STRING+parentForm.getDataTable().getName()+",");
sql_values.append("?");
obj.add(parentRowId);
try {
while(childFieldIt.hasNext()){
String field=(String)(childFieldIt.next());
joinSqlByDataType(DataType.valueOf((String)(childFields.get(field))),((String[])(fieldValues.get(field)))[i],field,sql,sql_values,obj);
}
sql.replace(sql.length()-1, sql.length(), ")");
sql_values.append(")");
sql.append(sql_values);
log.debug("begin to excute sql.");
log.debug("sql:" + sql.toString());
log.debug("value array:" + obj);
getJdbcTemplate().update(sql.toString(),obj.toArray());
log.debug("excute sql success .");
}catch (NumberFormatException e) {
log.debug(e);
throw new RuntimeException("numberFormatException",e);
} catch (DataAccessException e) {
log.debug("excute sql failed .");
log.debug(e);
throw new RuntimeException("update Exception",e);
}
}
}
}
private void joinSqlByDataType(DataType dataType,Object initValue,String enName,StringBuilder sql,StringBuilder sql_values,List<Object> obj){
if(dataType==DataType.DATE){
String value = initValue.toString();
if(StringUtils.isEmpty(value)) return;
joinSql(value,enName,sql,sql_values,obj);
}else if(dataType==DataType.TIME){
String value = initValue.toString();
if(StringUtils.isEmpty(value)) return;
joinSql(value,enName,sql,sql_values,obj);
}else if(dataType==DataType.BOOLEAN){
String value = initValue.toString();
if(StringUtils.isEmpty(value)) return;
if("0".equals(value)||"false".equals(value)){
joinSql(0x00,enName,sql,sql_values,obj);
}else if("1".equals(value)||"true".equals(value)){
joinSql(0x01,enName,sql,sql_values,obj);
}
}else if(dataType==DataType.DOUBLE){
String value = initValue.toString();
if(StringUtils.isEmpty(value)) return;
joinSql(Double.valueOf(value),enName,sql,sql_values,obj);
}else if(dataType==DataType.FLOAT){
String value = initValue.toString();
if(StringUtils.isEmpty(value)) return;
joinSql(Float.valueOf(value),enName,sql,sql_values,obj);
}else if(dataType==DataType.LONG){
String value =initValue.toString();
if(StringUtils.isEmpty(value)) return;
joinSql(Integer.valueOf(value),enName,sql,sql_values,obj);
}else if(dataType==DataType.AMOUNT){
String value = initValue.toString();
if(StringUtils.isEmpty(value)) return;
joinSql(Double.valueOf(value),enName,sql,sql_values,obj);
}else if(dataType==DataType.NUMBER){
String value = initValue.toString();
if(StringUtils.isEmpty(value)) return;
joinSql(Integer.valueOf(value),enName,sql,sql_values,obj);
}else if(dataType==DataType.INTEGER){
String value = initValue.toString();
if(StringUtils.isEmpty(value)) return;
joinSql(Integer.valueOf(value),enName,sql,sql_values,obj);
}else{
joinSql(initValue.toString(),enName,sql,sql_values,obj);
}
}
//DELETE FROM 表名称 WHERE 列名称 = 值
public void deleteData(String tableName, String column,Object value) {
this.getJdbcTemplate().execute("delete from " + tableName + " where "+column+"="+value );
}
/**
* 执行sql
* @param sql
* @return
*/
public List excutionSql(String sql) {
return this.getJdbcTemplate().queryForList(sql);
}
/**
* 执行sql
* @param sql
* @return
*/
public Page<Object> excutionSql(Page<Object> page,String sql,String conditionSql) {
sql = createConditionSql(sql,conditionSql);
if(page.isAutoCount()) page.setTotalCount(countHqlResult(sql));
sql = createHqlAddOrderBy(sql,page);
StringBuilder pageSql = new StringBuilder("select * from ( select sql.* ,rownum rownum_ from ( ")
.append(sql).append(") sql where rownum <= ").append(page.getPageNo()*page.getPageSize()).append(" ) where rownum_ > ").append(page.getFirst() - 1);
List<Object> list = getJdbcTemplate().queryForList(pageSql.toString());
page.setResult(list);
return page;
}
private String createConditionSql(String sql,String condition){
if(StringUtils.isEmpty(condition))return sql;
if(StringUtils.isEmpty(condition.trim()))return sql;
if(sql.contains("where")){
return sql + " and " + condition;
}else{
return sql + " where " + condition;
}
}
/**
* 向hql中设置orderBy条件
* @param hql hql语句
* @param page 分页和排序参数
* @return
*/
protected String createHqlAddOrderBy(final String sql, final Page<Object> page) {
String newSql = sql;
if (page.isOrderBySetted()) {
String[] orderByArray = StringUtils.split(page.getOrderBy(), ',');
String[] orderArray = StringUtils.split(page.getOrder(), ',');
Assert.isTrue(orderByArray.length == orderArray.length, "分页多重排序参数中,排序字段与排序方向的个数不相等");
String orderByStr = " order by ";
for (int i = 0; i < orderByArray.length; i++) {
if((i + 1) == orderByArray.length) {
orderByStr += orderByArray[i].trim() + " " + orderArray[i].trim();
} else {
orderByStr += orderByArray[i].trim() + " " + orderArray[i].trim() + ", ";
}
}
newSql += orderByStr;
}
return newSql;
}
protected long countHqlResult(final String sql) {
String fromSql = sql;
//select子句与order by子句会影响count查询,进行简单的排除.
fromSql = "from " + StringUtils.substringAfter(fromSql, "from");
fromSql = StringUtils.substringBefore(fromSql, "order by");
String countSql = "select count(*) " + fromSql;
return this.getJdbcTemplate().queryForLong(countSql);
}
//DELETE FROM 表名称 WHERE 列名称 = 值
public void deleteData(String tableName, Long id) {
this.getJdbcTemplate().execute("delete from " + tableName + " where id="+id );
}
public void deleteDatas(String tableName, List<Long> ids) {
StringBuilder sql = new StringBuilder();
sql.append("delete from ").append(tableName).append(" where");
boolean isFirst = true;
for(Long id : ids){
if(!isFirst) sql.append(" or ");
sql.append(" id=").append(id);
isFirst = false;
}
this.getJdbcTemplate().execute(sql.toString());
}
public void updateTable(String sql){
this.getJdbcTemplate().update(sql);
}
public void updateTable(String sql,Object[] values){
this.getJdbcTemplate().update(sql.toString(),values);
}
/**
* 得到sequenceValue
* @param sequenceName
*/
public Long getSequenceValue(String sequenceName){
return this.getJdbcTemplate().queryForLong("SELECT "+sequenceName+".nextval FROM DUAL");
}
/**
* 增加数据库表字段
* @param tableName
* @param fields
*/
public void addDataBaseColumn(String tableName, String columnName, TableColumn tableCo){
StringBuilder str = new StringBuilder();
str.append("ALTER TABLE ").append(tableName).append(" add ").append(FORM_FIELD_PREFIX_STRING + columnName+" ").append(getSqlType(tableCo));
this.getJdbcTemplate().execute(str.toString());
}
}