Browse Source

1.工具类修改。2.新增动态数据源切换。3.增加拦截器

will.chen 7 years ago
parent
commit
273022db45

+ 33 - 3
pom.xml

@@ -14,7 +14,7 @@
 	<parent>
 		<groupId>org.springframework.boot</groupId>
 		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>2.0.0.RELEASE</version>
+		<version>1.5.10.RELEASE</version>
 		<relativePath /> <!-- lookup parent from repository -->
 	</parent>
 
@@ -42,9 +42,14 @@
 		</dependency>
 
 		<dependency>
-			<groupId>mysql</groupId>
-			<artifactId>mysql-connector-java</artifactId>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-devtools</artifactId>
 		</dependency>
+
+		<dependency>  
+            <groupId>org.springframework.boot</groupId>  
+            <artifactId>spring-boot-starter-data-jpa</artifactId>  
+        </dependency>
 	
 		<dependency>
 		    <groupId>log4j</groupId>
@@ -52,6 +57,13 @@
 		    <version>1.2.17</version>
 		</dependency>
 		
+		<dependency>
+			<groupId>net.sf.json-lib</groupId>
+			<artifactId>json-lib</artifactId>
+			<version>2.4</version>
+			<classifier>jdk15</classifier>
+		</dependency>
+		
 		<dependency>
 			<groupId>com.alibaba</groupId>
 			<artifactId>fastjson</artifactId>
@@ -64,6 +76,24 @@
 		    <version>0.6.0</version>
 		</dependency>
 		
+		<dependency>
+		    <groupId>org.codehaus.jackson</groupId>
+		    <artifactId>jackson-core-asl</artifactId>
+		    <version>1.9.13</version>
+		</dependency>
+		
+		<dependency>
+		    <groupId>org.codehaus.jackson</groupId>
+		    <artifactId>jackson-mapper-asl</artifactId>
+		    <version>1.9.13</version>
+		</dependency>
+		
+		<dependency>
+		    <groupId>net.sf.flexjson</groupId>
+		    <artifactId>flexjson</artifactId>
+		    <version>2.1</version>
+		</dependency>
+		
 	</dependencies>
 
 	<build>

+ 4 - 0
src/main/java/com/uas/eis/UasEisApplication.java

@@ -2,8 +2,12 @@ package com.uas.eis;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Import;
+
+import com.uas.eis.core.config.DynamicDataSourceRegister;
 
 @SpringBootApplication
+@Import({DynamicDataSourceRegister.class})
 public class UasEisApplication {
 
 	public static void main(String[] args) {

+ 4 - 1
src/main/java/com/uas/eis/core/WebAppConfig.java

@@ -4,13 +4,16 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
 
+import com.uas.eis.core.support.DataSourceInterceptor;
 import com.uas.eis.core.support.InterceptorConfig;
 
 @Configuration
 public class WebAppConfig extends WebMvcConfigurationSupport{
 
 	public void addInterceptors(InterceptorRegistry registry){
-		registry.addInterceptor(new InterceptorConfig()).addPathPatterns("/*").excludePathPatterns("/login");
+		registry.addInterceptor(new InterceptorConfig()).addPathPatterns("/hello");
+//		registry.addInterceptor(new InterceptorConfig()).addPathPatterns("/*").excludePathPatterns("/login");
+		registry.addInterceptor(new DataSourceInterceptor()).addPathPatterns("/*/**");
 	}
 	
 }

+ 25 - 0
src/main/java/com/uas/eis/core/config/DynamicDataSource.java

@@ -0,0 +1,25 @@
+package com.uas.eis.core.config;
+
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+
+/**
+ * 动态数据源
+ *
+ */
+public class DynamicDataSource extends AbstractRoutingDataSource{
+	/**
+     * 代码中的determineCurrentLookupKey方法取得一个字符串,
+     * 该字符串将与配置文件中的相应字符串进行匹配以定位数据源,配置文件,即applicationContext.xml文件中需要要如下代码:(non-Javadoc)
+     * @see org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource#determineCurrentLookupKey()
+     */
+	@Override
+	protected Object determineCurrentLookupKey() {
+		 /*
+	      * DynamicDataSourceManage代码中使用setDataSourceType
+	      * 设置当前的数据源,在路由类中使用getDataSourceType进行获取,
+	      *  交给AbstractRoutingDataSource进行注入使用。
+	      */
+		return SpObserver.getSp();
+	}
+
+}

+ 183 - 0
src/main/java/com/uas/eis/core/config/DynamicDataSourceRegister.java

@@ -0,0 +1,183 @@
+package com.uas.eis.core.config;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+ 
+import java.util.UUID;
+
+import javax.sql.DataSource;
+ 
+
+
+
+
+
+import org.springframework.beans.MutablePropertyValues;
+import org.springframework.beans.PropertyValues;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+import org.springframework.beans.factory.support.GenericBeanDefinition;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
+import org.springframework.boot.bind.RelaxedDataBinder;
+import org.springframework.boot.bind.RelaxedPropertyResolver;
+import org.springframework.context.EnvironmentAware;
+import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
+import org.springframework.core.convert.ConversionService;
+import org.springframework.core.convert.support.DefaultConversionService;
+import org.springframework.core.env.Environment;
+import org.springframework.core.type.AnnotationMetadata;
+import org.springframework.jdbc.core.JdbcTemplate;
+ 
+/**
+ * 动态数据源注册;
+ */
+public class DynamicDataSourceRegister  implements ImportBeanDefinitionRegistrar, EnvironmentAware {
+   
+	@Autowired
+	JdbcTemplate jdbcTemplate;
+	
+    //如配置文件中未指定数据源类型,使用该默认值
+    private static final Object DATASOURCE_TYPE_DEFAULT = "com.alibaba.druid.pool.DruidDataSource";
+    private ConversionService conversionService = new DefaultConversionService();
+    private PropertyValues dataSourcePropertyValues;
+   
+    // 默认数据源
+    private DataSource defaultDataSource;
+   
+    private Map<String, DataSource> customDataSources = new HashMap<String, DataSource>();
+   
+    /**
+     * 加载多数据源配置
+     */
+    @Override
+    public void setEnvironment(Environment environment) {
+    	initDefaultDataSource(environment);
+    	initCustomDataSources(environment);
+    }
+   
+    /**
+     * 加载主数据源配置.
+     * @param env
+     */
+    private void initDefaultDataSource(Environment env){
+    	// 读取主数据源
+    	RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver(env, "spring.datasource.");
+       
+        Map<String, Object> dsMap = new HashMap<String, Object>();
+        dsMap.put("type", propertyResolver.getProperty("type"));
+        dsMap.put("driverClassName", propertyResolver.getProperty("driverClassName"));
+        dsMap.put("url", propertyResolver.getProperty("url"));
+        dsMap.put("username", propertyResolver.getProperty("username"));
+        dsMap.put("password", propertyResolver.getProperty("password"));
+        
+        //创建数据源;
+        defaultDataSource = buildDataSource(dsMap);
+        dataBinder(defaultDataSource, env);
+        customDataSources.put(propertyResolver.getProperty("name"), defaultDataSource);
+    }
+   
+    /**
+     * 初始化更多数据源
+     *
+     */
+    private void initCustomDataSources(Environment env) {
+        // 读取配置文件获取更多数据源,也可以通过defaultDataSource读取数据库获取更多数据源
+    	/*DynamicDataSourceManage.setDataSourceType("UAS_DEV");
+    	List<Map<String , Object>> master = jdbcTemplate.queryForList("select MA_USER,MA_PWD from master");
+    	System.out.println(master);*/
+    	JdbcTemplate jdbcTemplate = new JdbcTemplate(defaultDataSource);  
+    	List<Map<String , Object>> master = jdbcTemplate.queryForList("select MA_USER,MA_PWD from master");
+    	// 读取主数据源
+        RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver(env, "spring.datasource.");
+    	for(Map<String , Object> map : master){
+    		String ma_user = (String)map.get("MA_USER");
+    		Map<String, Object> dsMap = new HashMap<>();
+    		dsMap.put("type", propertyResolver.getProperty("type"));
+            dsMap.put("driverClassName", propertyResolver.getProperty("driverClassName"));
+            dsMap.put("url", propertyResolver.getProperty("url"));
+            dsMap.put("password", propertyResolver.getProperty("password"));
+            dsMap.put("username", ma_user);
+            DataSource ds = buildDataSource(dsMap);
+            customDataSources.put(ma_user, ds);
+            dataBinder(ds, env);
+    	}
+        /*RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver(env, "custom.datasource.");
+        String dsPrefixs = propertyResolver.getProperty("names");
+        for (String dsPrefix : dsPrefixs.split(",")) {// 多个数据源
+            Map<String, Object> dsMap = propertyResolver.getSubProperties(dsPrefix + ".");
+            DataSource ds = buildDataSource(dsMap);
+            customDataSources.put(dsPrefix, ds);
+            dataBinder(ds, env);
+        }*/
+    }
+   
+    /**
+     * 创建datasource.
+     * @param dsMap
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public DataSource buildDataSource(Map<String, Object> dsMap) {
+    	Object type = dsMap.get("type");
+        if (type == null){
+            type = DATASOURCE_TYPE_DEFAULT;// 默认DataSource
+        }
+        Class<? extends DataSource> dataSourceType;
+       
+       try {
+           	dataSourceType = (Class<? extends DataSource>) Class.forName((String) type);
+           	String driverClassName = dsMap.get("driverClassName").toString();
+            String url = dsMap.get("url").toString();
+            String username = dsMap.get("username").toString();
+            String password = dsMap.get("password").toString();
+            DataSourceBuilder factory =   DataSourceBuilder.create().driverClassName(driverClassName).url(url).username(username).password(password).type(dataSourceType);
+            return factory.build();
+       } catch (ClassNotFoundException e) {
+           e.printStackTrace();
+       }
+       return null;
+    }
+   
+    /**
+     * 为DataSource绑定更多数据
+     * @param dataSource
+     * @param env
+     */
+    private void dataBinder(DataSource dataSource, Environment env){
+    	RelaxedDataBinder dataBinder = new RelaxedDataBinder(dataSource);
+    	dataBinder.setConversionService(conversionService);
+    	dataBinder.setIgnoreNestedProperties(false);//false
+        dataBinder.setIgnoreInvalidFields(false);//false
+        dataBinder.setIgnoreUnknownFields(true);//true
+       
+        if(dataSourcePropertyValues == null){
+            Map<String, Object> values = new HashMap<>();
+            dataSourcePropertyValues = new MutablePropertyValues(values);
+        }
+        dataBinder.bind(dataSourcePropertyValues);
+       
+    }
+   
+ 
+    @Override
+    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
+       	Map<Object, Object> targetDataSources = new HashMap<Object, Object>();
+       	// 将主数据源添加到更多数据源中
+        /*targetDataSources.put("dataSource", defaultDataSource);
+        DynamicDataSourceManage.dataSourceIds.add("dataSource");*/
+        // 添加更多数据源
+        targetDataSources.putAll(customDataSources);
+        // 创建DynamicDataSource
+        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
+        beanDefinition.setBeanClass(DynamicDataSource.class);
+       
+        beanDefinition.setSynthetic(true);
+        MutablePropertyValues mpv = beanDefinition.getPropertyValues();
+        //添加属性:AbstractRoutingDataSource.defaultTargetDataSource
+        mpv.addPropertyValue("defaultTargetDataSource", defaultDataSource);
+        mpv.addPropertyValue("targetDataSources", targetDataSources);
+        registry.registerBeanDefinition("dataSource", beanDefinition);
+    }
+ 
+}

+ 38 - 0
src/main/java/com/uas/eis/core/config/SpObserver.java

@@ -0,0 +1,38 @@
+package com.uas.eis.core.config;
+
+/**
+ * 
+ */
+public class SpObserver {
+
+	private static ThreadLocal<String> prev = new InheritableThreadLocal<String>();
+	private static ThreadLocal<String> local = new InheritableThreadLocal<String>();
+
+	/**
+	 * 切换数据源
+	 * 
+	 * @param sp
+	 *            dbsource name
+	 */
+	public static void putSp(String sp) {
+		prev.set(getSp());
+		local.set(sp);
+	}
+
+	public static String getSp() {
+		return (String) local.get();
+	}
+
+	public static void clear() {
+		prev.set(null);
+		local.set(null);
+	}
+
+	/**
+	 * 切换回之前数据源
+	 */
+	public static void back() {
+		local.set(prev.get());
+		prev.set(null);
+	}
+}

+ 29 - 0
src/main/java/com/uas/eis/core/support/DataSourceInterceptor.java

@@ -0,0 +1,29 @@
+package com.uas.eis.core.support;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.uas.eis.core.config.SpObserver;
+
+public class DataSourceInterceptor implements HandlerInterceptor{
+	
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+		String master = request.getParameter("master");
+		if(master != null)
+			SpObserver.putSp(master);
+		return true;
+	}
+	
+	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
+			ModelAndView modelAndView) throws Exception {
+	}
+	
+	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
+			Exception ex) throws Exception {
+		SpObserver.clear();
+	}
+
+}

+ 2 - 5
src/main/java/com/uas/eis/core/support/InterceptorConfig.java

@@ -1,11 +1,8 @@
 package com.uas.eis.core.support;
 
-import java.util.Enumeration;
-
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.springframework.lang.Nullable;
 import org.springframework.web.servlet.HandlerInterceptor;
 import org.springframework.web.servlet.ModelAndView;
 
@@ -30,11 +27,11 @@ public class InterceptorConfig implements HandlerInterceptor{
 	}
 	
 	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
-			@Nullable ModelAndView modelAndView) throws Exception {
+			ModelAndView modelAndView) throws Exception {
 	}
 	
 	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
-			@Nullable Exception ex) throws Exception {
+			Exception ex) throws Exception {
 	}
 	
 }

+ 57 - 22
src/main/java/com/uas/eis/dao/BaseDao.java

@@ -10,23 +10,32 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataAccessException;
 import org.springframework.dao.EmptyResultDataAccessException;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.CallableStatementCallback;
 import org.springframework.jdbc.core.CallableStatementCreator;
-import org.springframework.jdbc.core.support.JdbcDaoSupport;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Repository;
 
 import com.uas.eis.utils.BaseUtil;
 import com.uas.eis.utils.Constant;
 import com.uas.eis.utils.DateUtil;
 
-public class BaseDao extends JdbcDaoSupport{
-
+@Repository
+public class BaseDao{
+	
+	@Autowired
+	private JdbcTemplate jdbcTemplate;
 	
+	public JdbcTemplate getJdbcTemplate() {
+		return jdbcTemplate;
+	}
+
 	public List<Map<String, Object>> queryForList(String sql) {
 		try {
-			return this.getJdbcTemplate().queryForList(sql);
+			return jdbcTemplate.queryForList(sql);
 		} catch (EmptyResultDataAccessException e) {
 			return null;
 		}
@@ -34,7 +43,7 @@ public class BaseDao extends JdbcDaoSupport{
 
 	public <T> List<T> queryForList(String sql, Class<T> elementType) {
 		try {
-			return this.getJdbcTemplate().queryForList(sql, elementType);
+			return jdbcTemplate.queryForList(sql, elementType);
 		} catch (EmptyResultDataAccessException e) {
 			return null;
 		}
@@ -42,7 +51,7 @@ public class BaseDao extends JdbcDaoSupport{
 	
 	public List<Map<String, Object>> queryForList(String sql, Object... args) {
 		try {
-			return this.getJdbcTemplate().queryForList(sql, args);
+			return jdbcTemplate.queryForList(sql, args);
 		} catch (EmptyResultDataAccessException e) {
 			return null;
 		}
@@ -50,7 +59,7 @@ public class BaseDao extends JdbcDaoSupport{
 
 	public <T> List<T> queryForList(String sql, Object[] args, Class<T> elementType) {
 		try {
-			return this.getJdbcTemplate().queryForList(sql, args, elementType);
+			return jdbcTemplate.queryForList(sql, args, elementType);
 		} catch (EmptyResultDataAccessException e) {
 			return null;
 		}
@@ -58,7 +67,7 @@ public class BaseDao extends JdbcDaoSupport{
 
 	public <T> List<T> queryForList(String sql, Class<T> elementType, Object... args) {
 		try {
-			return this.getJdbcTemplate().queryForList(sql, elementType, args);
+			return jdbcTemplate.queryForList(sql, elementType, args);
 		} catch (EmptyResultDataAccessException e) {
 			return null;
 		}
@@ -66,7 +75,7 @@ public class BaseDao extends JdbcDaoSupport{
 	
 	public <T> List<T> query(String sql, Object[] args, Class<T> elementType) {
 		try {
-			return this.getJdbcTemplate().query(sql, args, new BeanPropertyRowMapper<T>(elementType));
+			return jdbcTemplate.query(sql, args, new BeanPropertyRowMapper<T>(elementType));
 		} catch (EmptyResultDataAccessException e) {
 			return null;
 		}
@@ -74,7 +83,7 @@ public class BaseDao extends JdbcDaoSupport{
 
 	public <T> List<T> query(String sql, Class<T> elementType) {
 		try {
-			return this.getJdbcTemplate().query(sql, new BeanPropertyRowMapper<T>(elementType));
+			return jdbcTemplate.query(sql, new BeanPropertyRowMapper<T>(elementType));
 		} catch (EmptyResultDataAccessException e) {
 			return null;
 		}
@@ -82,7 +91,7 @@ public class BaseDao extends JdbcDaoSupport{
 
 	public <T> List<T> query(String sql, Class<T> elementType, Object... args) {
 		try {
-			return this.getJdbcTemplate().query(sql, new BeanPropertyRowMapper<T>(elementType), args);
+			return jdbcTemplate.query(sql, new BeanPropertyRowMapper<T>(elementType), args);
 		} catch (EmptyResultDataAccessException e) {
 			return null;
 		}
@@ -90,19 +99,19 @@ public class BaseDao extends JdbcDaoSupport{
 
 	public <T> T queryForObject(String sql, Class<T> elementType, Object... args) {
 		try {
-			return this.getJdbcTemplate().queryForObject(sql, elementType, args);
+			return jdbcTemplate.queryForObject(sql, elementType, args);
 		} catch (EmptyResultDataAccessException e) {
 			return null;
 		}
 	}
 	
 	public void execute(String sql) {
-		getJdbcTemplate().execute(sql);
+		jdbcTemplate.execute(sql);
 	}
 
 	public synchronized boolean execute(String sql, Object... objs) {
 		try {
-			getJdbcTemplate().update(sql, objs);
+			jdbcTemplate.update(sql, objs);
 			return true;
 		} catch (Exception e) {
 			return false;
@@ -116,7 +125,7 @@ public class BaseDao extends JdbcDaoSupport{
 				sb.append("execute immediate '").append(sql.replace("'", "''")).append("';");
 			}
 			sb.append("end;");
-			getJdbcTemplate().execute(sb.toString());
+			jdbcTemplate.execute(sb.toString());
 		}
 	}
 	
@@ -136,7 +145,7 @@ public class BaseDao extends JdbcDaoSupport{
 				sb.append("execute immediate '").append(sql.replace("'", "''")).append("';");
 			}
 			sb.append("end;");
-			getJdbcTemplate().execute(sb.toString());
+			jdbcTemplate.execute(sb.toString());
 		}
 	}
 	
@@ -153,6 +162,32 @@ public class BaseDao extends JdbcDaoSupport{
 		execute(sb.toString(), params);
 	}
 	
+	/**
+	 * 一个字段,一条结果
+	 * 
+	 * @param tableName
+	 *            对应要查询的表
+	 * @param field
+	 *            要查询的字段
+	 * @param condition
+	 *            查询条件
+	 * @return field对应的数据
+	 */
+	public Object getFieldDataByCondition(String tableName, String field, String condition) {
+		StringBuffer sql = new StringBuffer("SELECT ");
+		sql.append(field);
+		sql.append(" FROM ");
+		sql.append(tableName);
+		sql.append(" WHERE ");
+		sql.append(condition);
+		SqlRowList srs = queryForRowSet(sql.toString());
+		if (srs.next()) {
+			return srs.getObject(1);
+		} else {
+			return null;
+		}
+	}
+	
 	/**
 	 * 一个字段,多条结果
 	 * 
@@ -198,7 +233,7 @@ public class BaseDao extends JdbcDaoSupport{
 		sql.append(condition);
 		String[] strs = fields.split(",");
 		int length = strs.length;
-		List<Map<String, Object>> list = getJdbcTemplate().queryForList(sql.toString());
+		List<Map<String, Object>> list = jdbcTemplate.queryForList(sql.toString());
 		Iterator<Map<String, Object>> iter = list.iterator();
 		Object[] results = new Object[length];
 		Object value = null;
@@ -280,7 +315,7 @@ public class BaseDao extends JdbcDaoSupport{
 			sql.append("?");
 		}
 		sql.append(")}");
-		getJdbcTemplate().update(sql.toString(), args);
+		jdbcTemplate.update(sql.toString(), args);
 	}
 
 	/**
@@ -306,7 +341,7 @@ public class BaseDao extends JdbcDaoSupport{
 		}
 		sql.append(")}");
 
-		List<String> listR = getJdbcTemplate().execute(sql.toString(), new CallableStatementCallback<List<String>>() {
+		List<String> listR = jdbcTemplate.execute(sql.toString(), new CallableStatementCallback<List<String>>() {
 
 			@Override
 			public List<String> doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
@@ -343,7 +378,7 @@ public class BaseDao extends JdbcDaoSupport{
 	 */
 	public String callProcedure(final String procedureName, final Object... args) {
 		try {
-			return getJdbcTemplate().execute(new CallableStatementCreator() {
+			return jdbcTemplate.execute(new CallableStatementCreator() {
 				@Override
 				public CallableStatement createCallableStatement(Connection conn) throws SQLException {
 					StringBuffer storedProcName = new StringBuffer("{call ");
@@ -396,7 +431,7 @@ public class BaseDao extends JdbcDaoSupport{
 	 */
 	public <T> T callbackProcedure(final String procedureName, final Class<T> cls, final int sqlType, final Object... args) {
 		try {
-			return getJdbcTemplate().execute(new CallableStatementCreator() {
+			return jdbcTemplate.execute(new CallableStatementCreator() {
 				@Override
 				public CallableStatement createCallableStatement(Connection conn) throws SQLException {
 					StringBuffer storedProcName = new StringBuffer("{call ");
@@ -445,7 +480,7 @@ public class BaseDao extends JdbcDaoSupport{
 	 */
 	public SqlRowList queryForRowSet(String sql) {
 		SqlRowList rs = new SqlRowList();
-		rs.setResultList(getJdbcTemplate().queryForList(sql));
+		rs.setResultList(jdbcTemplate.queryForList(sql));
 		return rs;
 	}
 	

+ 2 - 1
src/main/java/com/uas/eis/exception/ExceptionHandlerAdvice.java

@@ -26,7 +26,8 @@ public class ExceptionHandlerAdvice {
 	@ResponseBody
 	public ModelMap handleUnexpectedServerError(RuntimeException ex, HttpServletRequest request) {
 		ModelMap map = new ModelMap();
-		logger.error(ex);
+		//logger.error(ex);
+		ex.printStackTrace();
 		map.put("exceptionInfo", ex.getMessage());
 		return map;
 	}

+ 5 - 3
src/main/java/com/uas/eis/serviceImpl/UserServiceImpl.java

@@ -3,20 +3,22 @@ package com.uas.eis.serviceImpl;
 import java.util.Map;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 
+import com.uas.eis.core.config.SpObserver;
+import com.uas.eis.dao.BaseDao;
 import com.uas.eis.service.UserService;
 
 @Service
 public class UserServiceImpl implements UserService {
 
 	@Autowired
-	private JdbcTemplate jdbcTemplate; 
+	private BaseDao baseDao;
 	
 	@Override
 	public Map<String, Object> getUser(String username){
-		return jdbcTemplate.queryForMap("select * from employee where em_name = ?",username);
+		//SpObserver.putSp("UAS_TEST");
+		return baseDao.getJdbcTemplate().queryForMap("select em_auditman from employee where em_name = ?",username);
 	}
 	
 }

+ 25 - 0
src/main/java/com/uas/eis/utils/BaseUtil.java

@@ -1,5 +1,6 @@
 package com.uas.eis.utils;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -57,6 +58,30 @@ public class BaseUtil {
 		return sb.toString();
 	}
 	
+	/**
+	 * 将gridStore解析成maps
+	 * 
+	 * @param gridStore
+	 *            字符串形式的grid数据
+	 * @return map形式的grid数据
+	 */
+	public static List<Map<Object, Object>> parseGridStoreToMaps(String gridStore) {
+		List<Map<Object, Object>> list = new ArrayList<Map<Object, Object>>();
+		try {
+			if (!gridStore.startsWith("[")) {
+				gridStore = "[" + gridStore + "]";
+			}
+			if (gridStore.length() > 409600) {
+				list = JacksonUtil.fromJsonArray(gridStore);
+			} else {
+				list = FlexJsonUtil.fromJsonArray(gridStore, HashMap.class);
+			}
+		} catch (Exception e) {
+			list = JSONUtil.toMapList(gridStore);
+		}
+		return list;
+	}
+	
 	
 	/**
 	 * 数据转换,将传入的数据转成需要调用接口规定的数据格式

+ 335 - 0
src/main/java/com/uas/eis/utils/CollectionUtil.java

@@ -0,0 +1,335 @@
+package com.uas.eis.utils;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+
+import org.springframework.util.StringUtils;
+
+public class CollectionUtil {
+
+	public static final int EXCLUDE = 0;
+	public static final int INCLUDE = 1;
+
+	/**
+	 * 取List里面的field的值
+	 */
+	public static Object[] pluck(List<Map<Object, Object>> list, String field) {
+		Object[] d = new Object[list.size()];
+		int index = 0;
+		for (Map<Object, Object> m : list) {
+			if (m.containsKey(field)) {
+				d[index++] = m.get(field);
+			}
+		}
+		return d;
+	}
+
+	public static Object[] pluck(ArrayList<HashMap<Object, Object>> list, String field) {
+		Object[] d = new Object[list.size()];
+		int index = 0;
+		for (Map<Object, Object> m : list) {
+			if (m.containsKey(field)) {
+				d[index++] = m.get(field);
+			}
+		}
+		return d;
+	}
+
+	/**
+	 * 过滤List
+	 */
+	public static List<Map<Object, Object>> filter(List<Map<Object, Object>> list, int type, Object... field) {
+		int i = 1, len = field.length;
+		if (len % 2 != 0) {
+			try {
+				throw new Exception("参数个数有误!");
+			} catch (Exception e) {
+
+			}
+		}
+		List<Map<Object, Object>> d = new ArrayList<Map<Object, Object>>();
+		if (type == CollectionUtil.INCLUDE) {
+			for (Map<Object, Object> m : list) {
+				i = 0;
+				for (Object f : field) {
+					if (i % 2 == 0) {
+						if (field[i + 1] != m.get(f) && !(field[i + 1]).equals(m.get(f))) {
+							break;
+						}
+					}
+					i++;
+					if (i == len) {
+						d.add(m);
+					}
+				}
+			}
+		} else {
+			for (Map<Object, Object> m : list) {
+				i = 0;
+				for (Object f : field) {
+					if (i % 2 == 0) {
+						if (field[i + 1] == m.get(f) || (field[i + 1]).equals(m.get(f))) {
+							break;
+						}
+					}
+					i++;
+					if (i == len) {
+						d.add(m);
+					}
+				}
+			}
+		}
+		return d;
+	}
+
+	public static Map<String, Object> findRecord(List<Map<String, Object>> list, String field, Object value) {
+		if (value != null) {
+			for (Map<String, Object> m : list) {
+				if (value.equals(m.get(field))) {
+					return m;
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * 字段{field}的值是否重复
+	 * 
+	 * @param list
+	 * @param field
+	 * @return
+	 */
+	public static boolean isUnique(Collection<? extends Map<?, Object>> list, String field) {
+		if (list != null) {
+			Set<Object> objects = new HashSet<Object>();
+			Object object = null;
+			for (Map<?, Object> m : list) {
+				object = m.get(field);
+				if (object != null) {
+					if (objects.contains(object))
+						return false;
+					objects.add(object);
+				}
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 取字段{field}的重复项
+	 * 
+	 * @param list
+	 * @param field
+	 * @return
+	 */
+	public static String getRepeats(Collection<? extends Map<?, Object>> list, String field) {
+		if (list != null) {
+			Set<Object> objects = new HashSet<Object>();
+			Object object = null;
+			StringBuffer sb = new StringBuffer();
+			for (Map<?, Object> m : list) {
+				object = m.get(field);
+				if (object != null) {
+					if (objects.contains(object))
+						sb.append(object).append(" ");
+					objects.add(object);
+				}
+			}
+			if (sb.length() > 0)
+				return sb.toString();
+		}
+		return null;
+	}
+
+	public static String toString(List<Map<Object, Object>> list) {
+		JSONArray arr = new JSONArray();
+		JSONObject obj = null;
+		for (Map<Object, Object> map : list) {
+			if (map != null) {
+				obj = new JSONObject();
+				for (Object key : map.keySet()) {
+					obj.put(key, map.get(key));
+				}
+				arr.add(obj);
+			}
+		}
+		return arr.toString();
+	}
+
+	public static String toJSONString(Map<String, ?> map) {
+		return JSONObject.fromObject(map).toString();
+	}
+
+	public static String toString(Map<String, ?> map) {
+		Set<String> keys = map.keySet();
+		StringBuffer sb = new StringBuffer();
+		for (String k : keys) {
+			if (sb.length() > 0)
+				sb.append(",");
+			if (StringUtil.hasText(k))
+				sb.append(k).append(":");
+			Object value = map.get(k);
+			if (value instanceof Double) {
+				value = NumberUtil.parseBigDecimal(Double.parseDouble(String.valueOf(value)));
+			}
+			sb.append(value);
+		}
+		return sb.toString();
+	}
+
+	public static String toString(Collection<String> paramArray) {
+		return toString(paramArray, ",");
+	}
+
+	public static String toString(Object[] strs) {
+		StringBuffer sb = new StringBuffer();
+		for (Object k : strs) {
+			if (!StringUtils.isEmpty(k)) {
+				if (sb.length() > 0)
+					sb.append(",");
+				sb.append(k);
+			}
+		}
+		return sb.toString();
+	}
+
+	public static String toString(Collection<String> paramArray, String separator) {
+		StringBuffer sb = new StringBuffer();
+		for (String k : paramArray) {
+			if (!StringUtils.isEmpty(k)) {
+				if (sb.length() > 0)
+					sb.append(separator);
+				sb.append(k);
+			}
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * 用类<T>的变量key的get方法取变量key的值,并用separator连接成字符串
+	 * 
+	 * @param paramArray
+	 * @param key
+	 * @param separator
+	 * @return
+	 */
+	public static <T> String getParamString(Collection<T> paramArray, String key, String separator) {
+		StringBuffer sb = new StringBuffer();
+		if (!isEmpty(paramArray)) {
+			String methodGet = "get" + StringUtils.capitalize(key);
+			Method method = null;
+			for (T param : paramArray) {
+				try {
+					if (method == null)
+						method = param.getClass().getMethod(methodGet, new Class[] {});
+					Object val = method.invoke(param, new Object[] {});
+					if (val != null) {
+						if (sb.length() > 0)
+							sb.append(separator);
+						sb.append(val);
+					}
+				} catch (NoSuchMethodException e) {
+					e.printStackTrace();
+				} catch (SecurityException e) {
+					e.printStackTrace();
+				} catch (IllegalAccessException e) {
+					e.printStackTrace();
+				} catch (IllegalArgumentException e) {
+					e.printStackTrace();
+				} catch (InvocationTargetException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return sb.toString();
+	}
+
+
+	public static String toSqlString(Set<String> strs) {
+		StringBuffer sb = new StringBuffer();
+		for (String k : strs) {
+			if (sb.length() > 0)
+				sb.append(",");
+			sb.append("'").append(k).append("'");
+		}
+		return sb.toString();
+	}
+
+	public static String toSqlString(String[] strs) {
+		StringBuffer sb = new StringBuffer();
+		for (String k : strs) {
+			if (sb.length() > 0)
+				sb.append(",");
+			sb.append("'").append(k).append("'");
+		}
+		return sb.toString();
+	}
+
+	public static String pluckSqlString(Collection<? extends Map<?, Object>> list, String field) {
+		StringBuffer sb = new StringBuffer();
+		for (Map<?, Object> m : list) {
+			if (m.containsKey(field)) {
+				if (sb.length() > 0)
+					sb.append(",");
+				sb.append("'").append(m.get(field).toString().replaceAll("'","''")).append("'");
+			}
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * 按给定size切割
+	 * 
+	 * @param paramList
+	 * @param paramSize
+	 * @return
+	 */
+	public static <T> List<List<T>> split(List<T> paramList, int paramSize) {
+		List<List<T>> lists = new ArrayList<List<T>>();
+		for (int j = 0, l = paramList.size(), i = l / paramSize; j <= i; j++) {
+			lists.add(paramList.subList(j * paramSize, Math.min((j + 1) * paramSize, l)));
+		}
+		return lists;
+	}
+
+	/**
+	 * 按给定size切割
+	 * 
+	 * @param paramArray
+	 * @param paramSize
+	 * @return
+	 */
+	public static Object[] split(Object[] paramArray, int paramSize) {
+		int len = paramArray.length;
+		Object[] arrays = new Object[(int) Math.ceil((double) len / paramSize)];
+		for (int j = 0, l = arrays.length; j < l; j++) {
+			arrays[j] = Arrays.copyOfRange(paramArray, j * paramSize, Math.min((j + 1) * paramSize, len));
+		}
+		return arrays;
+	}
+
+	public static boolean isEmpty(Collection<?> paramArray) {
+		return (paramArray == null) || (paramArray.size() == 0);
+	}
+
+	/**
+	 * 给list倒序
+	 * */
+	public static <T> List<T> reverse(List<T> lists) {
+		Collections.reverse(lists);
+		return lists;
+	}
+}

+ 62 - 0
src/main/java/com/uas/eis/utils/FlexJsonUtil.java

@@ -0,0 +1,62 @@
+package com.uas.eis.utils;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import flexjson.JSONDeserializer;
+import flexjson.JSONSerializer;
+
+/**
+ * <h1>flexjson</h1><br>
+ * 1.序列化json字符串时较快,优于jackson<br>
+ * 2.但是数据量较大时,序列化有问题<br>
+ * 3.反序列化较慢
+ * 
+ * @author yingp
+ * 
+ */
+public class FlexJsonUtil {
+
+	public static <T> T fromJson(String json, Class<?> cls) {
+		return new JSONDeserializer<T>().use(null, cls).deserialize(json);
+	}
+
+	public static <K, V> Map<K, V> fromJson(String json) {
+		if (json != null) {
+			Map<K, V> map = new HashMap<K, V>();
+			return new JSONDeserializer<Map<K, V>>().use(null, map.getClass()).deserialize(json);
+		}
+		return null;
+	}
+
+	public String toJson() {
+		return new JSONSerializer().exclude("*.class").serialize(this);
+	}
+
+	public static String toJson(Object obj) {
+		if (obj == null)
+			return null;
+		return new JSONSerializer().exclude("*.class").serialize(obj);
+	}
+
+	public static String toJsonDeep(Object obj) {
+		if (obj == null)
+			return null;
+		return new JSONSerializer().exclude("*.class").deepSerialize(obj);
+	}
+
+	public static <T> String toJsonArray(Collection<?> collection) {
+		return new JSONSerializer().exclude("*.class").serialize(collection);
+	}
+
+	public static <T> String toJsonArrayDeep(Collection<?> collection) {
+		return new JSONSerializer().exclude("*.class").deepSerialize(collection);
+	}
+
+	public static <T> List<T> fromJsonArray(String json, Class<?> cls) {
+		return new JSONDeserializer<List<T>>().use(null, ArrayList.class).use("values", cls).deserialize(json);
+	}
+}

+ 86 - 0
src/main/java/com/uas/eis/utils/JSONUtil.java

@@ -0,0 +1,86 @@
+package com.uas.eis.utils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class JSONUtil {
+
+	static final String Unicode_Pattern = "(\\\\u(\\p{XDigit}{4}))";
+
+	public static String decodeUnicode(String jsonStr) {
+		if (jsonStr != null) {
+			// unicode格式的转化成汉字
+			Pattern pattern = Pattern.compile(Unicode_Pattern);
+			Matcher matcher = pattern.matcher(jsonStr);
+			char ch;
+			while (matcher.find()) {
+				ch = (char) Integer.parseInt(matcher.group(2), 16);
+				jsonStr = jsonStr.replace(matcher.group(1), ch + "");
+			}
+		}
+		return jsonStr;
+	}
+
+	public static Map<Object, Object> toMap(String jsonStr) {
+		jsonStr = decodeUnicode(jsonStr);
+		jsonStr = jsonStr.substring(jsonStr.indexOf("{") + 1, jsonStr.lastIndexOf("}"));
+		String[] strs;
+		if(jsonStr.indexOf("\",\"")>0) strs = jsonStr.split(",\"");
+		else  strs = jsonStr.split(","); //字段名前没有引号的jsonStr ,类似bom校验:{bo_version:"V1.0",bo_mothercode:"BS00012",bo_ispast:"否",}
+		String field = null;
+		String value = null;
+		Map<Object, Object> map = new HashMap<Object, Object>();
+		for (String str : strs) {
+			if (str.indexOf(":") > 0) {
+				field = str.substring(0, str.indexOf(":"));
+				if (field != null) {
+					if (field.startsWith("\"")) {
+						field = field.substring(1, field.length());
+					}
+					if (field.endsWith("\"")) {
+						field = field.substring(0, field.lastIndexOf("\""));
+					}
+				}
+				value = str.substring(str.indexOf(":") + 1);
+				if (value != null) {
+					if (value.startsWith("\"")) {
+						value = value.substring(1, value.length());
+					}
+					if (value.endsWith("\"")) {
+						value = value.substring(0, value.lastIndexOf("\""));
+					}
+				}
+				map.put(field, value);
+			}
+		}
+		return map;
+	}
+	
+	public static List<Map<Object, Object>> toMapList(String jsonStr) {
+		if (jsonStr != null) {
+			if (jsonStr.startsWith("[")) {
+				jsonStr = jsonStr.substring(1, jsonStr.length());
+			}
+			if (jsonStr.endsWith("]")) {
+				jsonStr = jsonStr.substring(0, jsonStr.lastIndexOf("]"));
+			}
+			List<Map<Object, Object>> list = new ArrayList<Map<Object, Object>>();
+			if (jsonStr.indexOf("},") > -1) {
+				String[] js = jsonStr.split("},");
+				for (String j : js) {
+					if (!j.endsWith("}"))
+						j = j + "}";
+					list.add(toMap(j));
+				}
+			} else if (jsonStr.indexOf("{") > -1 && jsonStr.indexOf("}") > -1) {
+				list.add(toMap(jsonStr));
+			}
+			return list;
+		}
+		return null;
+	}
+}

+ 95 - 0
src/main/java/com/uas/eis/utils/JacksonUtil.java

@@ -0,0 +1,95 @@
+package com.uas.eis.utils;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.codehaus.jackson.JsonGenerationException;
+import org.codehaus.jackson.JsonParseException;
+import org.codehaus.jackson.JsonParser.Feature;
+import org.codehaus.jackson.map.JsonMappingException;
+import org.codehaus.jackson.map.ObjectMapper;
+
+/**
+ * <h1>jackson</h1><br>
+ * 建议反序列化采用和序列化同一util,不要jackson和flexjson混着用,否则消耗会加大很多
+ * 
+ * @author yingp
+ * 
+ */
+public class JacksonUtil {
+	@SuppressWarnings("unchecked")
+	public static <T> List<T> fromJsonArray(String json) {
+		ObjectMapper mapper = getObjectMapper();
+		try {
+			return mapper.readValue(json, List.class);
+		} catch (JsonParseException e) {
+			e.printStackTrace();
+		} catch (JsonMappingException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * 字段必须是有引号的,形如{"a":"1","b":2}<br>
+	 * 如果格式是{a:"1",b:2}是无法解析的
+	 * 
+	 * @param json
+	 * @return
+	 */
+	@SuppressWarnings("unchecked")
+	public static <K, V> HashMap<K, V> fromJson(String json) {
+		ObjectMapper mapper = getObjectMapper();
+		try {
+			return mapper.readValue(json, HashMap.class);
+		} catch (JsonParseException e) {
+			e.printStackTrace();
+		} catch (JsonMappingException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public static String toJson(Map<?, ?> map) {
+		ObjectMapper mapper = getObjectMapper();
+		try {
+			return mapper.writeValueAsString(map);
+		} catch (JsonGenerationException e) {
+			e.printStackTrace();
+		} catch (JsonMappingException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public static String toJsonArray(Collection<?> collection) {
+		ObjectMapper mapper = getObjectMapper();
+		try {
+			return mapper.writeValueAsString(collection);
+		} catch (JsonGenerationException e) {
+			e.printStackTrace();
+		} catch (JsonMappingException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	private static ObjectMapper getObjectMapper() {
+		ObjectMapper mapper = new ObjectMapper();
+		mapper.configure(Feature.ALLOW_SINGLE_QUOTES, true);
+		mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
+		return mapper;
+	}
+
+}

+ 863 - 0
src/main/java/com/uas/eis/utils/SqlUtil.java

@@ -0,0 +1,863 @@
+package com.uas.eis.utils;
+
+import java.io.Writer;
+import java.lang.reflect.Method;
+import java.sql.Clob;
+import java.sql.Connection;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import com.uas.eis.dao.SqlMap;
+
+import oracle.jdbc.OracleConnection;
+
+
+/**
+ * 处理一些拼sql的工具包
+ * 
+ * @author yingp
+ * @date 2012-08-02 10:22:17
+ * 
+ * @since 2015-11-26
+ *        <p>
+ *        增加对SqlMap的操作方法
+ *        </p>
+ */
+public class SqlUtil {
+
+	public final static String REG_D = "\\d{4}-\\d{2}-\\d{2}";
+	public final static String REG_DT = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}";
+	public final static String REG_TS = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.\\d{1}";
+
+
+	public static String getFullTableName(String tabName, String masterCode) {
+		String[] strs = tabName.split("left join ");
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0, len = strs.length; i < len; i++) {
+			sb.append(masterCode).append(".").append(strs[i]);
+			if (i != len - 1)
+				sb.append("left join ");
+		}
+		return sb.toString();
+	}
+
+
+	/**
+	 * @param map
+	 *            formStore解析成的map
+	 */
+	public static String getInsertSqlByFormStore(Map<?, Object> map, String table, String[] otherFields, Object[] otherValues) {
+		StringBuffer sb1 = new StringBuffer("INSERT into " + table + " (");
+		StringBuffer sb2 = new StringBuffer(" ");
+		Set<?> keys = map.keySet();
+		for (Object key : keys) {
+			String field = (String) key;
+			Object value = map.get(key);
+			for (int i = 0; i < otherFields.length; i++) {
+				if (field.equals(otherFields[i])) {// 字段重复了哦
+					value = otherValues[i];// 优先选用传递过来的value
+				}
+			}
+			sb1.append(field);
+			sb1.append(",");
+			if (value != null) {
+				String val = value.toString();
+				if (value.toString().matches(REG_D)) {// 判断是否是形如yyyy-mm-dd格式的日期类型数据
+					sb2.append(DateUtil.parseDateToOracleString(Constant.YMD, val));
+				} else if (value.toString().matches(REG_DT)) {
+					sb2.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val));
+				} else if (value.toString().matches(REG_TS)) {
+					sb2.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val.substring(0, val.lastIndexOf("."))));
+				} else if (value.toString().equals("null")) {
+					sb2.append("null");
+				} else if (val.contains("%n")) {
+					sb2.append("'" + val.replaceAll("%n", "\n") + "'");
+				} else if (val.contains("'")) {
+					sb2.append("'" + value.toString().replaceAll("'", "''") + "'");
+				} else {
+					sb2.append("'" + value + "'");
+				}
+			} else {
+				sb2.append("null");
+			}
+			sb2.append(",");
+		}
+		for (int i = 0; i < otherFields.length; i++) {
+			if (!sb1.toString().contains(otherFields[i])) {
+				sb1.append(otherFields[i]);
+				sb1.append(",");
+				sb2.append("'" + otherValues[i] + "'");
+				sb2.append(",");
+			}
+		}
+		return sb1.substring(0, sb1.length() - 1) + ") VALUES (" + sb2.substring(0, sb2.length() - 1) + ")";
+	}
+
+
+	public static List<String> getInsertSqlbyGridStore(List<Map<Object, Object>> maps, String table) {
+		List<String> sqls = new ArrayList<String>();
+		StringBuffer sb1 = null;
+		StringBuffer sb2 = null;
+		for (Map<Object, Object> map : maps) {
+			Set<Object> keys = map.keySet();
+			sb1 = new StringBuffer("INSERT into " + table + " (");
+			sb2 = new StringBuffer(" ");
+			for (Object key : keys) {
+				String field = (String) key;
+				Object value = map.get(key);
+				sb1.append(field);
+				sb1.append(",");
+				if (value != null) {
+					String val = value.toString();
+					if (val.matches(REG_D)) {// 判断是否是形如yyyy-mm-dd格式的日期类型数据
+						sb2.append(DateUtil.parseDateToOracleString(Constant.YMD, val));
+					} else if (val.matches(REG_DT)) {
+						sb2.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val));
+					} else if (val.matches(REG_TS)) {
+						sb2.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val.substring(0, val.lastIndexOf("."))));
+					} else if (value.toString().equals("null")) {
+						sb2.append("null");
+					} else if (val.contains("%n")) {
+						sb2.append("'" + val.replaceAll("%n", "\n") + "'");
+					} else if (val.contains("'")) {
+						sb2.append("'" + value.toString().replaceAll("'", "''") + "'");
+					} else {
+						sb2.append("'" + value + "'");
+					}
+				} else {
+					sb2.append("null");
+				}
+				sb2.append(",");
+			}
+			sqls.add(sb1.substring(0, sb1.length() - 1) + ") VALUES (" + sb2.substring(0, sb2.length() - 1) + ")");
+		}
+		return sqls;
+	}
+
+	public static List<String> getInsertSqlbyGridStoreWithoutDate(List<Map<Object, Object>> maps, String table) {
+		List<String> sqls = new ArrayList<String>();
+		StringBuffer sb1 = null;
+		StringBuffer sb2 = null;
+		for (Map<Object, Object> map : maps) {
+			Set<Object> keys = map.keySet();
+			sb1 = new StringBuffer("INSERT into " + table + " (");
+			sb2 = new StringBuffer(" ");
+			for (Object key : keys) {
+				String field = (String) key;
+				Object value = map.get(key);
+				sb1.append(field);
+				sb1.append(",");
+				if (value != null) {
+					if (value.toString().equals("null")) {
+						sb2.append("null");
+					} else {
+						sb2.append("'" + value + "'");
+					}
+				} else {
+					sb2.append("null");
+				}
+				sb2.append(",");
+			}
+			sqls.add(sb1.substring(0, sb1.length() - 1) + ") VALUES (" + sb2.substring(0, sb2.length() - 1) + ")");
+		}
+		return sqls;
+	}
+
+	public static List<String> getInsertSqlbyList(List<Map<Object, Object>> maps, String table, String prif) {
+		List<String> sqls = new ArrayList<String>();
+		if (maps != null) {
+			for (Map<Object, Object> map : maps) {
+				sqls.add(getInsertSql(map, table, prif));
+			}
+		}
+		return sqls;
+	}
+
+	/**
+	 * 从map集合格式的数据中解析出insert语句
+	 */
+	public static String getInsertSqlByMap(Map<?, Object> map, String table, String[] otherFields, Object[] otherValues) {
+		StringBuffer sb1 = new StringBuffer("INSERT into " + table + " (");
+		StringBuffer sb2 = new StringBuffer(" ");
+		Object value = null;
+		for (Object field : map.keySet()) {
+			value = map.get(field);
+			if (otherFields != null) {
+				for (int i = 0; i < otherFields.length; i++) {
+					if (field.equals(otherFields[i])) {// 字段重复了哦
+						value = otherValues[i];// 优先选用传递过来的value
+					}
+				}
+			}
+			sb1.append(field);
+			sb1.append(",");
+			if (value != null) {
+				String val = value.toString();
+				if (val.matches(REG_D)) {// 判断是否是形如yyyy-mm-dd格式的日期类型数据
+					sb2.append(DateUtil.parseDateToOracleString(Constant.YMD, val));
+				} else if (val.matches(REG_DT)) {
+					sb2.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val));
+				} else if (val.matches(REG_TS)) {
+					sb2.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val.substring(0, val.lastIndexOf("."))));
+				} else if (val.equals("null")) {
+					sb2.append("null");
+				} else if (val.contains("%n")) {
+					sb2.append("'" + val.replaceAll("%n", "\n") + "'");
+				} else if (val.contains("'")) {
+					sb2.append("'" + val.replaceAll("'", "''") + "'");
+				} else {
+					sb2.append("'" + value + "'");
+				}
+			} else {
+				sb2.append("null");
+			}
+			sb2.append(",");
+		}
+		if (otherFields != null) {
+			for (int i = 0; i < otherFields.length; i++) {
+				if (!sb1.toString().contains(otherFields[i])) {
+					sb1.append(otherFields[i]);
+					sb1.append(",");
+					sb2.append("'" + otherValues[i] + "'");
+					sb2.append(",");
+				}
+			}
+		}
+		return sb1.substring(0, sb1.length() - 1) + ") VALUES (" + sb2.substring(0, sb2.length() - 1) + ")";
+	}
+
+	public static String getInsertSqlByMap(Map<?, Object> map, String table) {
+		StringBuffer sb1 = new StringBuffer("INSERT into ");
+		sb1.append(table);
+		sb1.append(" (");
+		StringBuffer sb2 = new StringBuffer(" ");
+		Object value = null;
+		for (Object field : map.keySet()) {
+			value = map.get(field);
+			sb1.append(field);
+			sb1.append(",");
+			if (value != null) {
+				String val = value.toString();
+				if (val.matches(REG_D)) {// 判断是否是形如yyyy-mm-dd格式的日期类型数据
+					sb2.append(DateUtil.parseDateToOracleString(Constant.YMD, val));
+				} else if (val.matches(REG_DT)) {
+					sb2.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val));
+				} else if (val.matches(REG_TS)) {
+					sb2.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val.substring(0, val.lastIndexOf("."))));
+				} else if (val.equals("null")) {
+					sb2.append("null");
+				} else {
+					if (val.contains("'")) {
+						val = val.replaceAll("'", "''");
+					} else if (val.contains("%n")) {
+						val = val.replaceAll("%n", "\n");
+					}
+					// 针对较长字段,比如clob类型,防止ORA-01704的简单处理:切割成多个字符串连接起来
+					if (val.length() > 2000) {
+						sb2.append("''");
+					} else if (val.length() > 1000) {
+						sb2.append(StringUtil.splitAndConcat(val, 1333, "'", "'", "||"));
+					} else {
+						sb2.append("'" + val + "'");
+					}
+				}
+			} else {
+				sb2.append("null");
+			}
+			sb2.append(",");
+		}
+		return sb1.substring(0, sb1.length() - 1) + ") VALUES (" + sb2.substring(0, sb2.length() - 1) + ")";
+	}
+
+	public static String getInsertSql(Map<?, Object> map, String table, String keyField) {
+		StringBuffer sb1 = new StringBuffer("INSERT into ");
+		sb1.append(table);
+		sb1.append(" (");
+		StringBuffer sb2 = new StringBuffer(" ");
+		Object value = null;
+		for (Object field : map.keySet()) {
+			value = map.get(field);
+			sb1.append(field);
+			sb1.append(",");
+			if (field.equals(keyField)) {
+				sb2.append(table).append("_seq.nextval,");
+				continue;
+			}
+			if (value != null) {
+				String val = value.toString();
+				if (val.matches(REG_D)) {// 判断是否是形如yyyy-mm-dd格式的日期类型数据
+					sb2.append(DateUtil.parseDateToOracleString(Constant.YMD, val));
+				} else if (val.matches(REG_DT)) {
+					sb2.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val));
+				} else if (val.matches(REG_TS)) {
+					sb2.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val.substring(0, val.lastIndexOf("."))));
+				} else if (value.toString().equals("null")) {
+					sb2.append("null");
+				} else if (val.contains("'")) {
+					sb2.append("'" + value.toString().replaceAll("'", "''") + "'");
+				} else if (val.contains("%n")) {
+					sb2.append("'" + val.replaceAll("%n", "\n") + "'");
+				} else {
+					sb2.append("'" + value + "'");
+				}
+			} else {
+				sb2.append("null");
+			}
+			sb2.append(",");
+		}
+		return sb1.substring(0, sb1.length() - 1) + ") VALUES (" + sb2.substring(0, sb2.length() - 1) + ")";
+	}
+
+	public static String getDeleteSql(String tablename, String condition) {
+		StringBuffer sb = new StringBuffer("DELETE FROM ");
+		sb.append(tablename);
+		if (condition != null) {
+			sb.append(" WHERE ");
+			sb.append(condition);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * 生成更新SQL
+	 * 
+	 * @param map
+	 * @param table
+	 * @param keyField
+	 * @param prefix
+	 *            字段前缀
+	 * @return
+	 */
+	public static String getUpdateSqlByFormStore(Map<Object, Object> map, String table, String keyField, String prefix) {
+		Set<Object> keys = map.keySet();
+		StringBuffer sb1 = new StringBuffer("UPDATE " + table + " SET ");
+		Object keyValue = "";
+		for (Object key : keys) {
+			String field = (String) key;
+			if (null != prefix && !field.startsWith(prefix)) {
+				continue;
+			}
+			Object value = map.get(key);
+			if (field.equals(keyField)) {// 找到了需要的字段哦
+				keyValue = value;
+			}
+			sb1.append(field);
+			sb1.append("=");
+			if (value != null) {
+				String val = value.toString();
+				if (val.matches(REG_D)) {// 判断是否是形如yyyy-mm-dd格式的日期类型数据
+					sb1.append(DateUtil.parseDateToOracleString(Constant.YMD, val));
+				} else if (val.matches(REG_DT)) {
+					sb1.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val));
+				} else if (val.matches(REG_TS)) {
+					sb1.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val.substring(0, val.lastIndexOf("."))));
+				} else if (val.equals("null")) {
+					sb1.append("null");
+				} else {
+					if (val.contains("'")) {
+						val = val.replaceAll("'", "''");
+					} else if (val.contains("%n")) {
+						val = val.replaceAll("%n", "\n");
+					}
+					// 针对较长字段,比如clob类型,防止ORA-01704的简单处理:切割成多个字符串连接起来
+					if (val.length() > 2000) {
+						sb1.append("''");
+					} else if (val.length() > 1000) {
+						sb1.append(StringUtil.splitAndConcat(val, 666, "'", "'", "||"));
+					} else {
+						sb1.append("'" + val + "'");
+					}
+				}
+			} else {
+				sb1.append("null");
+			}
+			sb1.append(",");
+		}
+		return sb1.substring(0, sb1.length() - 1) + " WHERE " + keyField + "='" + keyValue + "'";
+	}
+
+	public static String getUpdateSqlByFormStore(Map<Object, Object> map, String table, String keyField) {
+		return getUpdateSqlByFormStore(map, table, keyField, null);
+	}
+
+	/**
+	 * 将HashMap的字段及值,转到SqlMap
+	 * 
+	 * @param sql
+	 * @param map
+	 */
+	private static void getSqlMap(SqlMap sql, Map<Object, Object> map) {
+		Object value = null;
+		for (Object field : map.keySet()) {
+			String key = field.toString();
+			value = map.get(field);
+			if (value != null) {
+				String val = value.toString();
+				if (val.matches(REG_D)) {// 判断是否是形如yyyy-mm-dd格式的日期类型数据
+					sql.setDate(key, val, Constant.YMD);
+				} else if (val.matches(REG_DT)) {
+					sql.setDate(key, val);
+				} else if (val.matches(REG_TS)) {
+					sql.setDate(key, val.substring(0, val.lastIndexOf(".")));
+				} else if (val.equals("null")) {
+					sql.setNull(key);
+				} else {
+					if (val.contains("'")) {
+						val = val.replaceAll("'", "''");
+					} else if (val.contains("%n")) {
+						val = val.replaceAll("%n", "\n");
+					}
+					sql.set(key, val);
+				}
+			} else {
+				sql.setNull(key);
+			}
+		}
+	}
+
+	/**
+	 * 多类型sql新增操作
+	 * 
+	 * @param map
+	 * @param table
+	 * @return
+	 */
+	public static SqlMap getSqlMap(Map<Object, Object> map, String table) {
+		SqlMap sql = new SqlMap(table);
+		getSqlMap(sql, map);
+		return sql;
+	}
+
+	/**
+	 * 多类型sql更新操作
+	 * 
+	 * @param map
+	 * @param table
+	 * @param keyField
+	 * @return
+	 */
+	public static SqlMap getSqlMap(Map<Object, Object> map, String table, String keyField) {
+		SqlMap sql = new SqlMap(table, keyField);
+		getSqlMap(sql, map);
+		return sql;
+	}
+
+	/**
+	 * 修改detail数据 将grid数据从字符串形式拼成sql,
+	 * 
+	 * @param
+	 */
+	public static List<String> getUpdateSqlbyGridStore(String gridStore, String table, String keyField) {
+		List<Map<Object, Object>> maps = BaseUtil.parseGridStoreToMaps(gridStore);
+		List<String> sqls = new ArrayList<String>();
+		for (Map<Object, Object> map : maps) {
+			Set<Object> keys = map.keySet();
+			StringBuffer sb1 = new StringBuffer("UPDATE " + table + " SET ");
+			Object keyValue = "";
+			for (Object key : keys) {
+				String field = (String) key;
+				Object value = map.get(key);
+				if (field.equals(keyField)) {
+					// value不为空,即为已存在数据
+					if (value != null && !value.equals("") && !value.equals("null")) {
+						keyValue = value;
+					} else {// 否则,为新添加的数据
+						sb1 = null;
+						break;
+					}
+				}
+				sb1.append(field);
+				sb1.append("=");
+				if (value != null) {
+					String val = value.toString();
+					if (val.matches(REG_D)) {// 判断是否是形如yyyy-mm-dd格式的日期类型数据
+						sb1.append(DateUtil.parseDateToOracleString(Constant.YMD, val));
+					} else if (val.matches(REG_DT)) {
+						sb1.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val));
+					} else if (val.matches(REG_TS)) {
+						sb1.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val.substring(0, val.lastIndexOf("."))));
+					} else if (value.toString().equals("null")) {
+						sb1.append("null");
+					} else if (val.contains("%n")) {
+						sb1.append("'" + val.replaceAll("%n", "\n") + "'");
+					} else if (val.contains("'")) {
+						sb1.append("'" + value.toString().replaceAll("'", "''") + "'");
+					} else {
+						sb1.append("'" + value + "'");
+					}
+				} else {
+					sb1.append("null");
+				}
+				sb1.append(",");
+			}
+			if (sb1 != null)
+				sqls.add(sb1.substring(0, sb1.length() - 1) + " WHERE " + keyField + "='" + keyValue + "'");
+		}
+
+		return CollectionUtil.reverse(sqls);
+	}
+
+	/**
+	 * get update_sql by GridStore
+	 * 
+	 * @param maps
+	 * @param table
+	 * @param keyField
+	 * @return
+	 */
+	public static List<String> getUpdateSqlbyGridStore(List<Map<Object, Object>> maps, String table, String keyField) {
+		List<String> sqls = new ArrayList<String>();
+		if (maps != null) {
+			for (Map<Object, Object> map : maps) {
+				Set<Object> keys = map.keySet();
+				StringBuffer sb1 = new StringBuffer("UPDATE " + table + " SET ");
+				Object keyValue = "";
+				for (Object key : keys) {
+					String field = (String) key;
+					Object value = map.get(key);
+					if (field.equals(keyField)) {
+						// value不为空,即为已存在数据
+						if (value != null && !value.equals("") && !value.equals("null") && Integer.parseInt(value.toString()) > 0) {
+							keyValue = value;
+						} else {// 否则,为新添加的数据
+							sb1 = null;
+							break;
+						}
+					}
+					sb1.append(field);
+					sb1.append("=");
+					if (value != null) {
+						String val = value.toString();
+						if (val.matches(REG_D)) {// 判断是否是形如yyyy-mm-dd格式的日期类型数据
+							sb1.append(DateUtil.parseDateToOracleString(Constant.YMD, val));
+						} else if (val.matches(REG_DT)) {
+							sb1.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val));
+						} else if (val.matches(REG_TS)) {
+							sb1.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val.substring(0, val.lastIndexOf("."))));
+						} else if (value.toString().equals("null")) {
+							sb1.append("null");
+						} else if (val.contains("%n")) {
+							sb1.append("'" + val.replaceAll("%n", "\n") + "'");
+						} else if (val.contains("'")) {
+							sb1.append("'" + value.toString().replaceAll("'", "''") + "'");
+						} else {
+							sb1.append("'" + value + "'");
+						}
+					} else {
+						sb1.append("null");
+					}
+					sb1.append(",");
+				}
+				if (sb1 != null) {
+					sqls.add(sb1.substring(0, sb1.length() - 1) + " WHERE " + keyField + "='" + keyValue + "'");
+				}
+			}
+		}
+		return CollectionUtil.reverse(sqls);
+	}
+
+	/**
+	 * get update_sql by GridStore
+	 * 
+	 * @param maps
+	 * @param table
+	 * @param keyField
+	 * @return
+	 */
+	public static List<String> getUpdateSqlbyGridStoreWithoutDate(List<Map<Object, Object>> maps, String table, String keyField) {
+		List<String> sqls = new ArrayList<String>();
+		for (Map<Object, Object> map : maps) {
+			Set<Object> keys = map.keySet();
+			StringBuffer sb1 = new StringBuffer("UPDATE " + table + " SET ");
+			Object keyValue = "";
+			for (Object key : keys) {
+				String field = (String) key;
+				Object value = map.get(key);
+				if (field.equals(keyField)) {
+					// value不为空,即为已存在数据
+					if (value != null && !value.equals("") && !value.equals("null") && Integer.parseInt(value.toString()) > 0) {
+						keyValue = value;
+					} else {// 否则,为新添加的数据
+						sb1 = null;
+						break;
+					}
+				}
+				sb1.append(field);
+				sb1.append("=");
+				if (value != null) {
+					String val = value.toString();
+					if (value.toString().equals("null")) {
+						sb1.append("null");
+					} else if (val.contains("%n")) {
+						sb1.append("'" + val.replaceAll("%n", "\n") + "'");
+					} else if (val.contains("'")) {
+						sb1.append("'" + value.toString().replaceAll("'", "''") + "'");
+					} else {
+						sb1.append("'" + value + "'");
+					}
+				} else {
+					sb1.append("null");
+				}
+				sb1.append(",");
+			}
+			if (sb1 != null) {
+				sqls.add(sb1.substring(0, sb1.length() - 1) + " WHERE " + keyField + "='" + keyValue + "'");
+			}
+		}
+		return CollectionUtil.reverse(sqls);
+	}
+
+	/**
+	 * notice that trigger must be defined
+	 * 
+	 * @param maps
+	 * @param table
+	 * @param keyField
+	 * @return
+	 */
+	public static List<String> getInsertOrUpdateSqlbyGridStore(List<Map<Object, Object>> maps, String table, String keyField) {
+		List<String> sqls = new ArrayList<String>();
+		for (Map<Object, Object> map : maps) {
+			if (map.get(keyField) == null || "".equals(map.get(keyField)) || "null".equals(map.get(keyField))
+					|| Integer.parseInt(String.valueOf(map.get(keyField))) <= 0) {
+				sqls.add(getInsertSql(map, table, keyField));
+				continue;
+			}
+			Set<Object> keys = map.keySet();
+			StringBuffer sb1 = new StringBuffer("UPDATE " + table + " SET ");
+			Object keyValue = "";
+			for (Object key : keys) {
+				String field = (String) key;
+				Object value = map.get(key);
+				if (field.equals(keyField)) {
+					// value不为空,即为已存在数据
+					if (value != null && !value.equals("") && !value.equals("null") && Integer.parseInt(value.toString()) > 0) {
+						keyValue = value;
+					} else {// 否则,为新添加的数据
+						sb1 = null;
+						break;
+					}
+				}
+				sb1.append(field);
+				sb1.append("=");
+				if (value != null) {
+					String val = value.toString();
+					if (val.matches(REG_D)) {// 判断是否是形如yyyy-mm-dd格式的日期类型数据
+						sb1.append(DateUtil.parseDateToOracleString(Constant.YMD, val));
+					} else if (val.matches(REG_DT)) {
+						sb1.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val));
+					} else if (val.matches(REG_TS)) {
+						sb1.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val.substring(0, val.lastIndexOf("."))));
+					} else if (value.toString().equals("null")) {
+						sb1.append("null");
+					} else if (val.contains("%n")) {
+						sb1.append("'" + val.replaceAll("%n", "\n") + "'");
+					} else if (val.contains("'")) {
+						sb1.append("'" + value.toString().replaceAll("'", "''") + "'");
+					} else {
+						sb1.append("'" + value + "'");
+					}
+				} else {
+					sb1.append("null");
+				}
+				sb1.append(",");
+			}
+			if (sb1 != null)
+				sqls.add(sb1.substring(0, sb1.length() - 1) + " WHERE " + keyField + "='" + keyValue + "'");
+		}
+		return sqls;
+	}
+
+	public static List<String> getInsertOrUpdateSqlbyGridStoreWithoutDate(List<Map<Object, Object>> maps, String table, String keyField) {
+		List<String> sqls = new ArrayList<String>();
+		for (Map<Object, Object> map : maps) {
+			if (map.get(keyField) == null || "".equals(map.get(keyField)) || "null".equals(map.get(keyField))
+					|| Integer.parseInt(String.valueOf(map.get(keyField))) <= 0) {
+				sqls.add(getInsertSql(map, table, keyField));
+				continue;
+			}
+			Set<Object> keys = map.keySet();
+			StringBuffer sb1 = new StringBuffer("UPDATE " + table + " SET ");
+			Object keyValue = "";
+			for (Object key : keys) {
+				String field = (String) key;
+				Object value = map.get(key);
+				if (field.equals(keyField)) {
+					// value不为空,即为已存在数据
+					if (value != null && !value.equals("") && !value.equals("null") && Integer.parseInt(value.toString()) > 0) {
+						keyValue = value;
+					} else {// 否则,为新添加的数据
+						sb1 = null;
+						break;
+					}
+				}
+				sb1.append(field);
+				sb1.append("=");
+				if (value != null) {
+					String val = value.toString();
+					if (value.toString().equals("null")) {
+						sb1.append("null");
+					} else if (val.contains("%n")) {
+						sb1.append("'" + val.replaceAll("%n", "\n") + "'");
+					} else if (val.contains("'")) {
+						sb1.append("'" + value.toString().replaceAll("'", "''") + "'");
+					} else {
+						sb1.append("'" + value + "'");
+					}
+				} else {
+					sb1.append("null");
+				}
+				sb1.append(",");
+			}
+			if (sb1 != null)
+				sqls.add(sb1.substring(0, sb1.length() - 1) + " WHERE " + keyField + "='" + keyValue + "'");
+		}
+		return sqls;
+	}
+
+	public static List<String> getInsertOrUpdateSql(List<Map<Object, Object>> maps, String table, String keyField) {
+		List<String> sqls = new ArrayList<String>();
+		if (maps != null) {
+			for (Map<Object, Object> map : maps) {
+				if (map.get(keyField) == null || "".equals(map.get(keyField)) || "null".equals(map.get(keyField))
+						|| Integer.parseInt(String.valueOf(map.get(keyField))) <= 0) {
+					sqls.add(getInsertSql(map, table, keyField));
+					continue;
+				}
+				Set<Object> keys = map.keySet();
+				StringBuffer sb1 = new StringBuffer("UPDATE " + table + " SET ");
+				Object keyValue = "";
+				for (Object key : keys) {
+					String field = (String) key;
+					Object value = map.get(key);
+					if (field.equals(keyField)) {
+						// value不为空,即为已存在数据
+						if (value != null && !value.equals("") && !value.equals("null") && Integer.parseInt(value.toString()) > 0) {
+							keyValue = value;
+						} else {// 否则,为新添加的数据
+							sb1 = null;
+							break;
+						}
+					}
+					sb1.append(field);
+					sb1.append("=");
+					if (value != null) {
+						String val = value.toString();
+						if (val.matches(REG_D)) {// 判断是否是形如yyyy-mm-dd格式的日期类型数据
+							sb1.append(DateUtil.parseDateToOracleString(Constant.YMD, val));
+						} else if (val.matches(REG_DT)) {
+							sb1.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val));
+						} else if (val.matches(REG_TS)) {
+							sb1.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val.substring(0, val.lastIndexOf("."))));
+						} else if (value.toString().equals("null")) {
+							sb1.append("null");
+						} else if (val.contains("'")) {
+							sb1.append("'" + val.replaceAll("'", "''") + "'");
+						} else if (val.contains("%n")) {
+							sb1.append("'" + val.replaceAll("%n", "\n") + "'");
+						} else {
+							sb1.append("'" + value + "'");
+						}
+					} else {
+						sb1.append("null");
+					}
+					sb1.append(",");
+				}
+				if (sb1 != null)
+					sqls.add(sb1.substring(0, sb1.length() - 1) + " WHERE " + keyField + "='" + keyValue + "'");
+			}
+		}
+		return sqls;
+	}
+
+	public static Object createOracleLob(OracleConnection conn, String lobClassName) throws Exception {
+		@SuppressWarnings("rawtypes")
+		Class lobClass = conn.getClass().getClassLoader().loadClass(lobClassName);
+		final Integer DURATION_SESSION = new Integer(lobClass.getField("DURATION_SESSION").getInt(null));
+		final Integer MODE_READWRITE = new Integer(lobClass.getField("MODE_READWRITE").getInt(null));
+		@SuppressWarnings("unchecked")
+		Method createTemporary = lobClass.getMethod("createTemporary", new Class[] { Connection.class, boolean.class, int.class });
+		Object lob = createTemporary.invoke(null, new Object[] { conn, false, DURATION_SESSION });
+		@SuppressWarnings("unchecked")
+		Method open = lobClass.getMethod("open", new Class[] { int.class });
+		open.invoke(lob, new Object[] { MODE_READWRITE });
+		return lob;
+	}
+
+	public static String oracleClob2Str(Clob clob) throws Exception {
+		return (clob != null ? clob.getSubString(1, (int) clob.length()) : null);
+	}
+
+	public static Clob oracleStr2Clob(String str, Clob lob) throws Exception {
+		Method methodToInvoke = lob.getClass().getMethod("getCharacterOutputStream", (Class[]) null);
+		Writer writer = (Writer) methodToInvoke.invoke(lob, (Object[]) null);
+		writer.write(str);
+		writer.close();
+		return lob;
+	}
+
+	public static Map<String, String> splitCondition(String condition, String... fields) {
+		if (condition != null && condition.length() > 0) {
+			String[] strs = condition.toUpperCase().split(" AND ");
+			Map<String, String> ns = new HashMap<String, String>();
+			int i = 0;
+			int j = 0;
+			int len = condition.length();
+			for (String s : strs) {
+				i = j;
+				j += s.length();
+				if (i > 0 && j < len) {
+					i += 5;
+					j += 5;
+				}
+				if (s.trim().length() > 0) {
+					for (String field : fields) {
+						if (s.contains(field.toUpperCase()) && s.contains("=")) {
+							String[] su = condition.substring(i, j).split("=");
+							ns.put(field, su[1]);
+							break;
+						}
+					}
+				}
+			}
+			return ns;
+		}
+		return null;
+	}
+
+	/**
+	 * 拆分condition 拆出来的条件还是带单引号的
+	 * 
+	 * @param condition
+	 * @return
+	 */
+	public static Map<String, String> splitCondition(String condition) {
+		if (condition != null && condition.length() > 0) {
+			String[] strs = condition.toUpperCase().split(" AND ");
+			Map<String, String> ns = new HashMap<String, String>();
+			int i = 0;
+			int j = 0;
+			int len = condition.length();
+			for (String s : strs) {
+				i = j;
+				j += s.length();
+				if (i > 0 && j < len) {
+					i += 5;
+					j += 5;
+				}
+				if (s.trim().length() > 0) {
+					if (s.contains("=")) {
+						String[] su = condition.substring(i, j).split("=");
+						ns.put(su[0], su[1]);
+					}
+				}
+			}
+			return ns;
+		}
+		return null;
+	}
+
+}

+ 325 - 0
src/main/java/com/uas/eis/utils/StringUtil.java

@@ -0,0 +1,325 @@
+package com.uas.eis.utils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.HashSet;
+import java.util.Random;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.springframework.util.StringUtils;
+
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+/**
+ * 字符串操作工具
+ * 
+ * @author yingp
+ * 
+ */
+public class StringUtil {
+
+	/**
+	 * 查找字符串重复项
+	 * 
+	 * @param str
+	 * @param ch
+	 * @return
+	 */
+	public static String getRepeats(String str, String ch) {
+		Set<String> set = new HashSet<String>();
+		String[] datas = str.split(ch);
+		StringBuffer repeat = new StringBuffer();
+		for (String s : datas) {
+			if (s != null && !s.trim().equals("")) {
+				if (!set.contains(s)) {
+					set.add(s);
+				} else {
+					if (repeat.length() > 0) {
+						repeat.append(",");
+					}
+					repeat.append(s);
+				}
+			}
+		}
+		return repeat.toString();
+	}
+
+	/**
+	 * 去掉字符串重复项
+	 * 
+	 * @param str
+	 * @param ch
+	 * @return
+	 */
+	public static String deleteRepeats(String str, String ch) {
+		Set<String> set = new HashSet<String>();
+		String[] datas = str.split(ch);
+		StringBuffer repeat = new StringBuffer();
+		for (String s : datas) {
+			if (s != null && !s.trim().equals("")) {
+				if (!set.contains(s)) {
+					set.add(s);
+					repeat.append(s + ch);
+				}
+			}
+		}
+		return repeat.toString().substring(0, repeat.toString().length() - 1);
+	}
+
+	/**
+	 * InputStream转成字符串
+	 * 
+	 * @param in
+	 * @return
+	 */
+	public static String parserInputStream(InputStream in) {
+		BufferedReader br = new BufferedReader(new InputStreamReader(in));
+		StringBuffer buffer = new StringBuffer();
+		String line = null;
+		try {
+			while ((line = br.readLine()) != null) {
+				buffer.append(line);
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return buffer.toString();
+	}
+
+	/**
+	 * 字符串是否在数组里面
+	 */
+	public static boolean isInArray(String[] objs, String str) {
+		boolean bool = false;
+		for (String obj : objs) {
+			if (obj.equals(str)) {
+				bool = true;
+				break;
+			}
+		}
+		return bool;
+	}
+
+	/**
+	 * 判断参数是否为空、空字符串、空白格
+	 * 
+	 * @param object
+	 * @return
+	 */
+	public static boolean hasText(Object object) {
+		return object == null ? false : StringUtils.hasText(object.toString());
+	}
+
+	/**
+	 * @param object
+	 * @return 字符串
+	 */
+	public static String valueOf(Object object) {
+		return (object == null) ? null : object.toString();
+	}
+
+	/**
+	 * 当object为空时,返回nvlValue,否则返回object
+	 * 
+	 * @param object
+	 * @param nvlValue
+	 * @return
+	 */
+	public static String nvl(Object object, String nvlValue) {
+		return !hasText(object) ? nvlValue : object.toString();
+	}
+
+	/**
+	 * 当object为空时,返回nvlValue,否则返回value
+	 * 
+	 * @param object
+	 * @param value
+	 * @param nvlValue
+	 * @return
+	 */
+	public static String nvl2(Object object, String value, String nvlValue) {
+		return !hasText(object) ? nvlValue : value;
+	}
+
+	/**
+	 * 类似于String.format的逆运算
+	 * 
+	 * @param paramString
+	 *            待解析字符串
+	 * @param pattern
+	 *            表达式
+	 * @return
+	 */
+	public static String[] parse(String paramString, String pattern) {
+		String[] patternArray = pattern.split("%s");
+		int i = 0;
+		int strLen = paramString.length();
+		int len = patternArray.length;
+		int startIndex = 0;
+		int endIndex = 0;
+		String macher = null;
+		String temp = paramString;
+		String[] macherArray = new String[pattern.endsWith("%s") ? len : (len - 1)];
+		for (String patternStr : patternArray) {
+			startIndex += patternStr.length();
+			if (startIndex == strLen)
+				break;
+			temp = paramString.substring(startIndex);
+			if (i < len - 1)
+				endIndex = startIndex + temp.indexOf(patternArray[i + 1]);
+			else
+				endIndex = paramString.length();
+			macher = paramString.substring(startIndex, endIndex);
+			macherArray[i++] = macher;
+			if (i == macherArray.length)
+				break;
+			else
+				startIndex = endIndex;
+		}
+		return macherArray;
+	}
+
+	/**
+	 * 判断是否包含汉字
+	 * 
+	 * @param paramString
+	 * @return
+	 */
+	public static boolean hasChinese(String paramString) {
+		String regExp = "[\\u4e00-\\u9fa5]";
+		Pattern p = Pattern.compile(regExp);
+		return p.matcher(paramString).find();
+	}
+
+	final static char[] numbersAndLettersCharArray = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+			'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5',
+			'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
+			'V', 'W', 'X', 'Y', 'Z' };
+
+	/**
+	 * 产生给定长度的随机字符串
+	 * 
+	 * @param length
+	 * @return
+	 */
+	public static String getRandomString(int length) {
+		if (length < 1) {
+			return null;
+		}
+		Random randGen = new Random();
+		char[] randBuffer = new char[length];
+		for (int i = 0; i < randBuffer.length; i++) {
+			randBuffer[i] = numbersAndLettersCharArray[randGen.nextInt(71)];
+		}
+		return new String(randBuffer);
+	}
+
+	/**
+	 * 按长度分割字符串
+	 *
+	 * @param str
+	 *            原字符串
+	 * @param length
+	 */
+	public static String[] split(String str, int length) {
+		int strLen = str.length();
+		int len = (int) Math.ceil((double) strLen / length);
+		String[] strArray = new String[len];
+		for (int i = 0; i < len; i++) {
+			strArray[i] = str.substring(i * length, i < len - 1 ? (i + 1) * length : strLen);
+		}
+		return strArray;
+	}
+
+	/**
+	 * 按长度分割字符串
+	 * 
+	 * @param str
+	 *            原字符串
+	 * @param length
+	 *            切割长度
+	 * @param prevStr
+	 *            前置字符串
+	 * @param subStr
+	 *            后置字符串
+	 * @param concatStr
+	 *            连接字符串
+	 * @return
+	 */
+	public static String splitAndConcat(String str, int length, String prevStr, String subStr, String concatStr) {
+		int strLen = str.length();
+		int len = (int) Math.ceil((double) strLen / length);
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < len; i++) {
+			if (i > 0)
+				buffer.append(concatStr);
+			buffer.append(prevStr).append(str.substring(i * length, i < len - 1 ? (i + 1) * length : strLen)).append(subStr);
+		}
+		return buffer.toString();
+	}
+
+	/**
+	 * 将String[] 数组转为 String
+	 * 
+	 * @param Str
+	 * @return
+	 */
+	public static String ArraysToString(String[] str) {
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0; i < str.length; i++) {
+			sb.append(str[i]);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * 清除换行空格等
+	 * 
+	 * @param str
+	 * @return
+	 */
+	public static String trimBlankChars(String str) {
+		if (null != str) {
+			Pattern p = Pattern.compile("\\s*|\t|\r|\n");
+			return p.matcher(str).replaceAll("");
+		}
+		return null;
+	}
+
+	/**
+	 * 字节数组转base64字符串
+	 * 
+	 * @param bytes
+	 * @return
+	 */
+	public static String encodeBase64(byte[] bytes) {
+		if (null != bytes) {
+			BASE64Encoder encoder = new BASE64Encoder();
+			return encoder.encode(bytes);
+		}
+		return null;
+	}
+
+	/**
+	 * base64字符串转字节数组
+	 * 
+	 * @param data
+	 * @return
+	 */
+	public static byte[] decodeBase64(String data) {
+		if (null != data) {
+			BASE64Decoder decoder = new BASE64Decoder();
+			try {
+				return decoder.decodeBuffer(data);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return null;
+	}
+
+}

+ 13 - 1
src/main/resources/application.yml

@@ -1,6 +1,18 @@
 spring:
     datasource:
+        name: UAS_DEV
+        type: org.apache.tomcat.jdbc.pool.DataSource
         driverClassName: oracle.jdbc.OracleDriver
         username: UAS_DEV
         password: select!#%*(
-        url: jdbc:oracle:thin:@192.168.253.6:1521:orcl
+        url: jdbc:oracle:thin:@192.168.253.6:1521:orcl
+        # 初始化大小,最小,最大
+        initialSize: 5
+        minIdle: 3
+        maxActive: 20
+        # 配置获取连接等待超时的时间
+        maxWait: 60000
+        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+        timeBetweenEvictionRunsMillis: 60000
+        # 配置一个连接在池中最小生存的时间,单位是毫秒
+        minEvictableIdleTimeMillis: 30000