/* * Copyright 2008 biaoping.yin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.frameworkset.sqlparams; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.transaction.RollbackException; import org.junit.Test; import com.frameworkset.common.poolman.ConfigSQLExecutor; import com.frameworkset.common.poolman.DBUtil; import com.frameworkset.common.poolman.PreparedDBUtil; import com.frameworkset.common.poolman.SQLParams; import com.frameworkset.common.poolman.SetSQLParamException; import com.frameworkset.orm.transaction.TransactionException; import com.frameworkset.orm.transaction.TransactionManager; import com.frameworkset.util.VariableHandler; public class TestSQLParams { private static final StringBuilder listRepositorySql = new StringBuilder(); private static final StringBuilder insertRepositorySql = new StringBuilder(); private static final StringBuilder updateRepositorySql = new StringBuilder(); private static final StringBuilder deleteRepositorySql = new StringBuilder(); private static final StringBuilder getRepositoryByNameSql = new StringBuilder(); private static final StringBuilder listRepositoryDirctorySql = new StringBuilder(); private static final StringBuilder listRepositoryDirctoryByParentIdSql = new StringBuilder(); private static final StringBuilder deleteRepositoryTreeItemSql = new StringBuilder(); private static final StringBuilder deleteRepositoryTreeSql = new StringBuilder(); private static final StringBuilder insertRepositoryDirctorySql = new StringBuilder(); private static final StringBuilder insertJobMetaSql = new StringBuilder(); private static final StringBuilder insertTransMetaSql = new StringBuilder(); private static final StringBuilder updateJobMetaSql = new StringBuilder(); private static final StringBuilder updateTransMetaSql = new StringBuilder(); private static final StringBuilder deleteDatasoureMetaSql = new StringBuilder(); private static final StringBuilder insertDatasoureMetaSql = new StringBuilder(); private static final StringBuilder updateDatasoureMetaSql = new StringBuilder(); private static final StringBuilder getDatasoureMetaSql = new StringBuilder(); private static final String[] REPOSITORY_ORDER_COLUMNS = new String[] { "NAME", "OBJECT_TYPE", "MODIFIED_USER", "MODIFIED_DATE", "DESCRIPTION" }; static { listRepositorySql.append("select * ").append( " from CIM_ETL_REPOSITORY ").append(" where 1=1 ").append( " and ").append("HOST_ID = #[HOST_ID]").append(" and ").append( "PLUGIN_ID = #[PLUGIN_ID]").append(" and ").append( " CATEGORY_ID = #[CATEGORY_ID]").append(" and APP = #[APP]"); insertRepositorySql .append("insert into CIM_ETL_REPOSITORY") .append( "(ID,HOST_ID, APP, PLUGIN_ID,CATEGORY_ID,NAME,DESCRIPTION)") .append( " values (#[ID],#[HOST_ID], #[APP], #[PLUGIN_ID],#[CATEGORY_ID],#[NAME],#[DESCRIPTION])"); updateRepositorySql.append("update CIM_ETL_REPOSITORY").append( " set NAME=#[NAME],DESCRIPTION=#[DESCRIPTION]").append( " where ID=#[ID]"); deleteRepositorySql.append("delete from CIM_ETL_REPOSITORY ").append( " where ID=#[ID]"); getRepositoryByNameSql.append(" select * from CIM_ETL_REPOSITORY") .append(" where 1=1").append(" and ").append( "HOST_ID = #[HOST_ID]").append(" and ").append( "PLUGIN_ID = #[PLUGIN_ID]").append(" and ").append( " CATEGORY_ID = #[CATEGORY_ID]").append( " and NAME = #[NAME]"); listRepositoryDirctorySql .append( " select REPOSITORY_ID, ID, PARENT_ID, DIR_NAME, NAME, OBJECT_TYPE, DESCRIPTION, MODIFIED_USER, MODIFIED_DATE") .append(" from CIM_ETL_RESOURCE_ITEM ").append(" where 1=1") .append(" and OBJECT_TYPE=#[OBJECT_TYPE] ").append(//修改目录下同名job和转换同步冲突问题,增加OBJECT_TYPE为主键 " and REPOSITORY_ID = #[REPOSITORY_ID]"); listRepositoryDirctoryByParentIdSql .append( " select REPOSITORY_ID, ID, PARENT_ID, DIR_NAME, NAME, OBJECT_TYPE, DESCRIPTION, MODIFIED_USER, MODIFIED_DATE") .append(" from CIM_ETL_RESOURCE_ITEM ").append(" where 1=1") .append(" and OBJECT_TYPE=#[OBJECT_TYPE] ").append(//修改目录下同名job和转换同步冲突问题,增加OBJECT_TYPE为主键 " and REPOSITORY_ID = #[REPOSITORY_ID]").append( " and PARENT_ID = #[PARENT_ID]"); deleteRepositoryTreeItemSql .append("delete from CIM_ETL_RESOURCE_ITEM").append( " where 1=1") .append(" and OBJECT_TYPE=#[OBJECT_TYPE] ")//修改目录下同名job和转换同步冲突问题,增加OBJECT_TYPE为主键 .append( " and REPOSITORY_ID = #[REPOSITORY_ID]").append( " and PARENT_ID = #[PARENT_ID]").append( " and NAME = #[NAME]"); deleteRepositoryTreeSql.append("delete from CIM_ETL_RESOURCE_ITEM") .append(" where 1=1").append( " and REPOSITORY_ID = #[REPOSITORY_ID]"); insertTransMetaSql .append(" insert into CIM_ETL_RESOURCE_ITEM") .append( "(REPOSITORY_ID,ID,PARENT_ID,DIR_NAME,NAME,OBJECT_TYPE,DESCRIPTION,STATUS,MODIFIED_USER,MODIFIED_DATE,DATASOURCE_NAME,LOG_TABLE,FIELD_NAMES,STEP_PERFORMANCE_LOG_TABLE,STEP_PERFORMANCE_FIELD_NAMES,FLOW_IMGE)") .append( " values(#[REPOSITORY_ID],#[ID],#[PARENT_ID],#[DIR_NAME],#[NAME],#[OBJECT_TYPE],#[DESCRIPTION],#[STATUS],#[MODIFIED_USER],#[MODIFIED_DATE],#[DATASOURCE_NAME],#[LOG_TABLE],#[FIELD_NAMES],#[STEP_PERFORMANCE_LOG_TABLE],#[STEP_PERFORMANCE_FIELD_NAMES],#[FLOW_IMGE])"); insertJobMetaSql .append(" insert into CIM_ETL_RESOURCE_ITEM") .append( "(REPOSITORY_ID,ID,PARENT_ID,DIR_NAME,NAME,OBJECT_TYPE,DESCRIPTION,STATUS,MODIFIED_USER,MODIFIED_DATE,DATASOURCE_NAME,LOG_TABLE,FIELD_NAMES,FLOW_IMGE)") .append( " values(#[REPOSITORY_ID],#[ID],#[PARENT_ID],#[DIR_NAME],#[NAME],#[OBJECT_TYPE],#[DESCRIPTION],#[STATUS],#[MODIFIED_USER],#[MODIFIED_DATE],#[DATASOURCE_NAME],#[LOG_TABLE],#[FIELD_NAMES],#[FLOW_IMGE])"); insertRepositoryDirctorySql .append(" insert into CIM_ETL_RESOURCE_ITEM") .append( "(REPOSITORY_ID,ID,PARENT_ID,DIR_NAME,NAME,OBJECT_TYPE,DESCRIPTION,STATUS,MODIFIED_USER,MODIFIED_DATE)") .append( " values(#[REPOSITORY_ID],#[ID],#[PARENT_ID],#[DIR_NAME],#[NAME],#[OBJECT_TYPE],#[DESCRIPTION],#[STATUS],#[MODIFIED_USER],#[MODIFIED_DATE])"); updateTransMetaSql .append(" update CIM_ETL_RESOURCE_ITEM ") .append(" set ") // .append("REPOSITORY_ID=#[REPOSITORY_ID],ID=#[ID],PARENT_ID=#[PARENT_ID],DIR_NAME=#[DIR_NAME],NAME=#[NAME],") .append( "OBJECT_TYPE=#[OBJECT_TYPE],DESCRIPTION=#[DESCRIPTION],STATUS=#[STATUS],MODIFIED_USER=#[MODIFIED_USER],MODIFIED_DATE=#[MODIFIED_DATE],DATASOURCE_NAME=#[DATASOURCE_NAME],LOG_TABLE=#[LOG_TABLE],FIELD_NAMES=#[FIELD_NAMES],STEP_PERFORMANCE_LOG_TABLE=#[STEP_PERFORMANCE_LOG_TABLE],STEP_PERFORMANCE_FIELD_NAMES=#[STEP_PERFORMANCE_FIELD_NAMES],FLOW_IMGE=#[FLOW_IMGE]") .append(" where 1=1").append( " and REPOSITORY_ID = #[REPOSITORY_ID]").append( " and PARENT_ID = #[PARENT_ID]").append( " and OBJECT_TYPE = #[OBJECT_TYPE]").append(//修改目录下同名job和转换同步冲突问题,增加OBJECT_TYPE为主键 " and NAME = #[NAME]"); updateJobMetaSql .append(" update CIM_ETL_RESOURCE_ITEM ") .append(" set ") // .append("REPOSITORY_ID=#[REPOSITORY_ID],ID=#[ID],PARENT_ID=#[PARENT_ID],DIR_NAME=#[DIR_NAME],NAME=#[NAME],") .append( "OBJECT_TYPE=#[OBJECT_TYPE],DESCRIPTION=#[DESCRIPTION],STATUS=#[STATUS],MODIFIED_USER=#[MODIFIED_USER],MODIFIED_DATE=#[MODIFIED_DATE],DATASOURCE_NAME=#[DATASOURCE_NAME],LOG_TABLE=#[LOG_TABLE],FIELD_NAMES=#[FIELD_NAMES],FLOW_IMGE=#[FLOW_IMGE]") .append(" where 1=1").append( " and REPOSITORY_ID = #[REPOSITORY_ID]").append( " and PARENT_ID = #[PARENT_ID]").append( " and OBJECT_TYPE = #[OBJECT_TYPE]").append(//修改目录下同名job和转换同步冲突问题,在表CIM_ETL_RESOURCE_ITEM中增加OBJECT_TYPE为主键 " and NAME = #[NAME]"); deleteDatasoureMetaSql.append(" delete from CIM_ETL_DATASOURCE_META") .append(" where 1=1").append( " and REPOSITORY_ID = #[REPOSITORY_ID]"); insertDatasoureMetaSql .append(" insert into CIM_ETL_DATASOURCE_META") .append( "(REPOSITORY_ID,NAME,DRIVER,JDBC_URL,USERNAME,PASSWORD,VALIDATION_QUERY)") .append( " values (#[REPOSITORY_ID],#[NAME],#[DRIVER],#[JDBC_URL],#[USERNAME],#[PASSWORD],#[VALIDATION_QUERY])"); updateDatasoureMetaSql .append(" update CIM_ETL_DATASOURCE_META") .append( " set DRIVER=#[DRIVER],JDBC_URL=#[JDBC_URL],USERNAME=#[USERNAME],PASSWORD=#[PASSWORD],VALIDATION_QUERY=#[VALIDATION_QUERY]") .append(" where 1=1").append( " and REPOSITORY_ID=#[REPOSITORY_ID]").append( " and NAME=#[NAME]"); getDatasoureMetaSql.append(" select * from CIM_ETL_DATASOURCE_META") .append(" where 1=1").append( " and REPOSITORY_ID=#[REPOSITORY_ID]").append( " and NAME=#[NAME]"); } /** ******************************** 资源库 ************************** */ /** * 查询资源库列表 */ public List<RepositoryInfo> listRepository(AppParams appParams) { // TODO Auto-generated method stub List<RepositoryInfo> repositorys = new ArrayList<RepositoryInfo>(); PreparedDBUtil dbutil = new PreparedDBUtil(); String sql = listRepositorySql.toString(); try { // 查询参数 SQLParams params = new SQLParams(); params.addSQLParam("HOST_ID", appParams.getBusinessId(), SQLParams.STRING); params.addSQLParam("PLUGIN_ID", appParams.getPluginid(), SQLParams.STRING); params.addSQLParam("CATEGORY_ID", appParams.getCategory(), SQLParams.STRING); params.addSQLParam("APP", appParams.getApp(), SQLParams.STRING); dbutil .preparedSelect(params, "bspf", sql); // 执行查询 dbutil.executePrepared(); for (int i = 0; i < dbutil.size(); i++) { RepositoryInfo repositoryInfo = new RepositoryInfo(); repositoryInfo.setId(dbutil.getString(i, "ID")); repositoryInfo.setName(dbutil.getString(i, "NAME")); repositoryInfo.setDescription(dbutil .getString(i, "DESCRIPTION")); repositorys.add(repositoryInfo); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("后台数据库操作错误!", e); } return repositorys; } @Test public void testParser() { String pretoken = "#\\["; String endtoken = "\\]"; String sql = "insert into tb_user(userId,userName,userPassword) " + "values(#[userId],#[userName],#[userPassword])"; String[][] args = VariableHandler.parser2ndSubstitution(sql, pretoken,endtoken, "?"); System.out.println(args); } @Test public void testDynamicSql() throws SetSQLParamException { String listRepositorySql = "select * from CIM_ETL_REPOSITORY where 1=1 " + "#if($HOST_ID && !$HOST_ID.equals(\"\")) " + " and HOST_ID = #[HOST_ID]" + "#end " + " and PLUGIN_ID = #[PLUGIN_ID] " + " and CATEGORY_ID = #[CATEGORY_ID] and APP = #[APP]"; SQLParams params = new SQLParams(); params.addSQLParam("HOST_ID", null, SQLParams.STRING); params.addSQLParam("PLUGIN_ID", "pluginid", SQLParams.STRING); params.addSQLParam("CATEGORY_ID", "catogoryid", SQLParams.STRING); params.addSQLParam("APP", "app", SQLParams.STRING); params.buildParams(listRepositorySql,null); System.out.println(params.getNewsql()); // Template template = VelocityUtil.getTemplate(RSConstant.PUBLISHER_DATA_VM); // VelocityContext context = new VelocityContext(); // context.put("userAccuont", publisher_.getUserAccuont()); // context.put("publisherName", publisher_.getPublisherName()); } /** ******************************** 资源库 ************************** */ /** * 查询资源库列表 */ public List<RepositoryInfo> dynamicQuery() { // TODO Auto-generated method stub List<RepositoryInfo> repositorys = new ArrayList<RepositoryInfo>(); PreparedDBUtil dbutil = new PreparedDBUtil(); String listRepositorySql = "select * from CIM_ETL_REPOSITORY where 1=1 " + "#if($HOST_ID && !$HOST_ID.equals(\"\")) " + " and HOST_ID = #[HOST_ID]" + "#end " + " and PLUGIN_ID = #[PLUGIN_ID] " + " and CATEGORY_ID = #[CATEGORY_ID] and APP = #[APP]"; String sql = listRepositorySql.toString(); try { // 查询参数 SQLParams params = new SQLParams(); params.addSQLParam("HOST_ID", null, SQLParams.STRING); params.addSQLParam("PLUGIN_ID", "pluginid", SQLParams.STRING); params.addSQLParam("CATEGORY_ID", "catogoryid", SQLParams.STRING); params.addSQLParam("APP", "app", SQLParams.STRING); dbutil.preparedSelect(params, "bspf", sql); // 执行查询 dbutil.executePrepared(); for (int i = 0; i < dbutil.size(); i++) { RepositoryInfo repositoryInfo = new RepositoryInfo(); repositoryInfo.setId(dbutil.getString(i, "ID")); repositoryInfo.setName(dbutil.getString(i, "NAME")); repositoryInfo.setDescription(dbutil .getString(i, "DESCRIPTION")); repositorys.add(repositoryInfo); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("后台数据库操作错误!", e); } return repositorys; } /** * 通过名称取得资源库在数据库的ID * * @param businessId * @param pluginid * @param category * @param optionRepname * @return */ public RepositoryInfo getRepositoryByName(AppParams appParams, String optionRepname) { // TODO Auto-generated method stub RepositoryInfo repositoryInfo = null; PreparedDBUtil dbutil = new PreparedDBUtil(); String sql = getRepositoryByNameSql.toString(); try { // 查询参数 SQLParams params = new SQLParams(); params.addSQLParam("HOST_ID", appParams.getBusinessId(), SQLParams.STRING); params.addSQLParam("PLUGIN_ID", appParams.getPluginid(), SQLParams.STRING); params.addSQLParam("CATEGORY_ID", appParams.getCategory(), SQLParams.STRING); params.addSQLParam("APP", appParams.getApp(), SQLParams.STRING); params.addSQLParam("NAME", optionRepname, SQLParams.STRING); dbutil .preparedSelect(params, "bspf", sql); // 执行查询 dbutil.executePrepared(); if (dbutil.size() > 0) { repositoryInfo = new RepositoryInfo(); repositoryInfo.setId(dbutil.getString(0, "ID")); repositoryInfo.setName(dbutil.getString(0, "NAME")); repositoryInfo.setDescription(dbutil .getString(0, "DESCRIPTION")); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("后台数据库操作错误!", e); } return repositoryInfo; } /** * 将数据同步到数据库 * * @param deleteList * @param insertList * @param updateList */ public void synRepositoryToDb(AppParams appParams, List<RepositoryInfo> deleteList, List<RepositoryInfo> insertList, List<RepositoryInfo> updateList) { if (deleteList.size() > 0 || insertList.size() > 0 || updateList.size() > 0) { TransactionManager transactionManager = new TransactionManager(); PreparedDBUtil preparedDBUtil = new PreparedDBUtil(); try { transactionManager.begin(); for (Iterator iterator = deleteList.iterator(); iterator .hasNext();) { RepositoryInfo repositoryInfo = (RepositoryInfo) iterator .next(); deleteRepository(preparedDBUtil, repositoryInfo); } for (Iterator iterator = insertList.iterator(); iterator .hasNext();) { RepositoryInfo repositoryInfo = (RepositoryInfo) iterator .next(); insertRepository(preparedDBUtil, repositoryInfo, appParams); } for (Iterator iterator = updateList.iterator(); iterator .hasNext();) { RepositoryInfo repositoryInfo = (RepositoryInfo) iterator .next(); updateRepository(preparedDBUtil, repositoryInfo); } preparedDBUtil.executePreparedBatch(); transactionManager.commit(); } catch (SQLException e) { e.printStackTrace(); try { transactionManager.rollback(); } catch (RollbackException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } throw new RuntimeException("后台数据库操作错误!", e); } catch (RollbackException e) { e.printStackTrace(); try { transactionManager.rollback(); } catch (RollbackException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } throw new RuntimeException("后台数据库操作错误!", e); } catch (TransactionException e) { try { transactionManager.rollback(); } catch (RollbackException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } e.printStackTrace(); throw new RuntimeException("后台数据库操作错误!", e); } } } private void deleteRepository(PreparedDBUtil preparedDBUtil, RepositoryInfo repositoryInfo) throws SQLException { SQLParams params = new SQLParams(); params.addSQLParam("ID", repositoryInfo.getId(), SQLParams.STRING); String sql = deleteRepositorySql.toString(); preparedDBUtil.preparedDelete(params, "bspf", sql); preparedDBUtil.addPreparedBatch(); } private void insertRepository(PreparedDBUtil preparedDBUtil, RepositoryInfo repositoryInfo, AppParams appParams) throws SQLException { SQLParams params = new SQLParams(); params.addSQLParam("ID", getSEQ_CIM_ETL_REPOSITORY(), SQLParams.STRING); // ID,HOST_ID,PLUGIN_ID,CATEGORY_ID,NAME,DESCRIPTION,DATASOURCE_NAME,DRIVER,JDBC_URL,USERNAME,PASSWORD,VALIDATION_QUERY params.addSQLParam("HOST_ID", appParams.getBusinessId(), SQLParams.STRING); params.addSQLParam("PLUGIN_ID", appParams.getPluginid(), SQLParams.STRING); params.addSQLParam("CATEGORY_ID", appParams.getCategory(), SQLParams.STRING); params.addSQLParam("APP", appParams.getApp(), SQLParams.STRING); params.addSQLParam("NAME", repositoryInfo.getName(), SQLParams.STRING); params.addSQLParam("DESCRIPTION", repositoryInfo.getDescription(), SQLParams.STRING); String sql = insertRepositorySql.toString(); preparedDBUtil.preparedInsert(params, "bspf", sql); preparedDBUtil.addPreparedBatch(); } private synchronized String getSEQ_CIM_ETL_REPOSITORY() { String primaryKey = null; try { primaryKey = DBUtil.getNextStringPrimaryKey( "bspf", "CIM_ETL_REPOSITORY"); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("后台数据库操作错误!", e); } return primaryKey; } private void updateRepository(PreparedDBUtil preparedDBUtil, RepositoryInfo repositoryInfo) throws SQLException { SQLParams params = new SQLParams(); params.addSQLParam("ID", repositoryInfo.getId(), SQLParams.STRING); // ID,HOST_ID,PLUGIN_ID,CATEGORY_ID,NAME,DESCRIPTION,DATASOURCE_NAME,DRIVER,JDBC_URL,USERNAME,PASSWORD,VALIDATION_QUERY params.addSQLParam("NAME", repositoryInfo.getName(), SQLParams.STRING); params.addSQLParam("DESCRIPTION", repositoryInfo.getDescription(), SQLParams.STRING); String sql = updateRepositorySql.toString(); preparedDBUtil.preparedUpdate(params, "bspf", sql); preparedDBUtil.addPreparedBatch(); } @Test public void test() { ConfigSQLExecutor executor = new ConfigSQLExecutor("com/frameworkset/sqlparams/testsql.xml"); try { RedYjChuZhiTongJiDto dto = new RedYjChuZhiTongJiDto(); dto.setEndDate("2011-08-11"); dto.setStartDate("2011-08-11"); executor.queryListBean(RedYjChuZhiTongJiDto.class, "queryFieldWithSQLParams", dto); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }