oracle RowNum 与之对应的 sql server 写法


兼容Oracle 和 sql server 使用sql来进行复杂自定义标签formData的使用

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">


	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:/db.properties</value>
			</list>
		</property>
	</bean>
	
	 
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  destroy-method="close">
		<property name="driverClassName">
			<value>${database.driver}</value>
		</property>
		<property name="url">
			<value>${database.url}</value>
		</property>
		<property name="username">
			<value>${database.username}</value>
		</property>
		<property name="password">
			<value>${database.password}</value>
		</property>
	</bean>

<!-- 
	 
	   <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">      
   		<property name="jndiName">    
           	<value>CCB.oraclePool</value>  
       	</property>    
       	<property name="resourceRef">    
            <value>false</value>  
        </property>    
        <property name="jndiEnvironment">    
            <props>    
                <prop key="java.naming.provider.url">t3://128.128.96.252:7001</prop>    
                <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>    
           	</props>                                   
        </property>    
	 </bean>  
	
 	
	<bean id="dataSourceJdbc" class="org.springframework.jndi.JndiObjectFactoryBean">      
   		<property name="jndiName">    
           	<value>CCB.oraclePool</value>  
       	</property>    
       	<property name="resourceRef">    
            <value>false</value>  
        </property>    
        <property name="jndiEnvironment">    
            <props>    
                <prop key="java.naming.provider.url">t3://128.128.96.252:7001</prop>    
                <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>    
           	</props>                                   
        </property>    
	 </bean>  

-->

	
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="mappingDirectoryLocations">
			<list>
				<value>classpath:/com/fa/ibox/plugin/entity</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.statement_cache.size">2500</prop>
				<prop key="hibernate.c3p0.max_size">500000</prop>
				<prop key="hibernate.c3p0.min_size">10</prop>
				<prop key="hibernate.c3p0.timeout">5000000</prop>
				<prop key="hibernate.c3p0.max_statements">200</prop>
				<prop key="hibernate.c3p0.idle_test_period">5000000</prop>
				<prop key="hibernate.c3p0.acquire_increment">2</prop>
				<prop key="hibernate.dialect">
		        ${database.dialect}
		        <!--
		        	com.fa.core.dao.SQLServer2005Dialect
					org.hibernate.dialect.SQLServerDialect 
		        -->
		        </prop>
				<prop key="hibernate.max_fetch_depth">3</prop>
				<prop key="hibernate.jdbc.fetch_size">10000</prop>
				<prop key="hibernate.jdbc.batch_size">3000</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.cascade">true</prop>
			</props>
		</property>
	</bean>

    <!-- config hibernate manger -->
	<bean id="hibernateManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref local="sessionFactory" />
		</property>
	</bean>

  <!-- config hibernate transaction -->
	<bean id="transactionInterceptor"
		class="org.springframework.transaction.interceptor.TransactionInterceptor">
		<property name="transactionManager">
			<ref bean="hibernateManager" />
		</property>
		<property name="transactionAttributes">
			<props>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="report*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="*">PROPAGATION_REQUIRED</prop>
			</props>
		</property>
	</bean>
	
	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	
	<bean
		class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="beanNames">
			<value>*Service</value>
		</property>
		<property name="interceptorNames">
			<list>
				<value>transactionInterceptor</value>
			</list>
		</property>
	</bean>
	
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource" />
	</bean>
	
	<!-- <bean id="jdbcDao" class="com.fa.core.plugin.dao.jdbc.OracleJdbcDao">
		<property name="jdbcTemplate" ref="jdbcTemplate" />
		<property name="jdbcTransactionManager" ref="jdbcTransactionManager" />
	</bean> -->
	
	<bean id="jdbcDao" class="com.fa.core.plugin.dao.jdbc.SqlServerJdbcDao">
		<property name="jdbcTemplate" ref="jdbcTemplate" />
		<property name="jdbcTransactionManager" ref="jdbcTransactionManager" />
	</bean>
	
	<bean id="jdbcTransactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource">
			<ref local="dataSource" />
		</property>
	</bean>
	
</beans>

具体的jdbc观察下边这两节

<!-- <bean id="jdbcDao" class="com.fa.core.plugin.dao.jdbc.OracleJdbcDao">
        <property name="jdbcTemplate" ref="jdbcTemplate" />
        <property name="jdbcTransactionManager" ref="jdbcTransactionManager" />
    </bean> -->
    
    <bean id="jdbcDao" class="com.fa.core.plugin.dao.jdbc.SqlServerJdbcDao">
        <property name="jdbcTemplate" ref="jdbcTemplate" />
        <property name="jdbcTransactionManager" ref="jdbcTransactionManager" />
    </bean>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page contentType="text/html; charset=utf-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>
<%@ taglib uri="http://ibox.fortuneage.com/tags/ibox" prefix="ibox"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="css/complex.css" />
<link rel="stylesheet" type="text/css" href="css/tempFA.css" />
<script type="text/javascript" src="js/jquery.js"></script>

</head>

<body>
	<h1>ibox:formData 使用:</h1>
	<br>
	<ibox:formData tableName="FO_DS_yi_test2">
		<ul>
			<li>{NAME(fdCreateAt)}</li>
			<li>{NAME(fdUserID)}</li>
			<li>{NAME(fdyi_testField2)}</li>
		</ul>

	</ibox:formData>

	<div id="IBOX_FORM_0"></div>
</body>
</html>

上边是页面,具体看到就是下边的样子:

调用流程:

public String doGetDataFromPattern() throws Exception {
		try {
			long formId = ServletRequestUtils.getLongParameter(getRequest(),
					"formId", -1);
			if (formId == -1) {
				log.error("该 自定义表不存在!请输入正确的自定义表名称!");
				return null;
			}

			int pageSize = ServletRequestUtils.getIntParameter(getRequest(),
					"pageSize", Page.getDEFAULT_PAGE_SIZE());
			;
			int pageNo = ServletRequestUtils.getIntParameter(getRequest(),
					"pageNo", 1);

			String where = ServletRequestUtils.getStringParameter(getRequest(),
					"where", "");
			;
			int showReply = ServletRequestUtils.getIntParameter(getRequest(),
					"showReply", 0);
			int topCount = ServletRequestUtils.getIntParameter(getRequest(),
					"topCount", 0);

			String pattern = ServletRequestUtils.getStringParameter(
					getRequest(), "pattern", "");
			pattern = URLDecoder.decode(pattern, "utf-8");

			String result = foFormService.pageQueryDataFront(formId, pageSi
/**
	 * 不知为什么,不能是查询相同的两个字段
	 * 
	 * 根据模板,获自字义表单的记录,在前台显示
	 * 
	 * @param formId
	 *            表的id
	 * @param pageSize
	 *            第页显示的记录数
	 * @param pageNo
	 *            显示第几页
	 * @param pattern
	 *            显示的模板
	 * @param where
	 *            表的查询条件
	 * @param showReply
	 *            是否在前台显示表单数
	 * @param topCount
	 *            整个表单,共显示前几条。
	 * @return 返回填充后的模板
	 */
	public String pageQueryDataFront(long formId, int pageSize, int pageNo,
			String pattern, String where, int showReply, int topCount) {
		StringBuffer result = new StringBuffer();
		StringBuffer sql = new StringBuffer();
		List<String> fieldsPattern = getPatternField(pattern);

		if (PublicUtil.checkEmptyList(fieldsPattern)) {
			log.error("没有自定义表单是查询字段,不执行是查询!!");
			return "";
		}

		String sqls [] = getQuerySqlFront(pageNo,pageSize,formId, sql, fieldsPattern, where);
		log.info("执行的自定义表单是查询语句为:     " + sql.toString());
		
		Page page = null;
		try {
			//2018年1月22日18:18:29 根据db配置进行判断数据库类型 William
			Properties props = PropertiesUtils.getPropertiesFile("db.properties");
			String driverClass = props.getProperty("database.driver");
			if (!StringUtils.isEmpty(driverClass) && driverClass.toLowerCase().contains("sqlserver") && jdbcDao instanceof SqlServerJdbcDao) 
				page = this.jdbcDao.pagedQueryBySqlServer(sqls, pageNo, pageSize);
			else 
				page = this.jdbcDao.pagedQuery(sqls[0], pageNo, pageSize);
				
		} catch (Exception e) {
			page = this.jdbcDao.pagedQuery(sqls[0], pageNo, pageSize);
		}

		List<ListOrderedMap> records = (List) page.getData();

		for (ListOrderedMap record : records) {
			String aRecord = fillPattern(pattern, record, fieldsPattern);
			result.append(aRecord);
		}

		return result.toString();
	}

ze,pageNo, pattern, where, showReply, topCount);log.info(result);this.renderText(this.getResponse(), result);return null;} catch (Exception e) {e.printStackTrace();return null;}}


/**
	 * 获取自字义表单的sql语句表显示的标题
	 * William 2018年1月22日17:15:21
	 * @param formId
	 * @param sql
	 * @param title
	 */
	private String[] getQuerySqlFront(int pageNo,int pageSize,long formId, StringBuffer sql,
			List<String> fields, String where) {
		String tableName = this.foFormDao.getTableNameByFormId(formId);
		if (PublicUtil.checkEmptyString(tableName)) {
			return new String[]{"",""};
		}

		//分页查询sql Server语句接拼 William 2018年1月22日17:03:32
		/*SELECT top 10 A.* FROM
		(select top 20 * from FO_DS_yi_test2) 
		A order by A.fdID desc */
		
		//sql.append("select top " + pageSize + " A.* ");
		List<String> list = getPatternSqlField(fields);

		// for(String sqlField:list){
		// sql.append(sqlField + ", " );
		// }
		
		StringBuffer sqlSelectParams = new StringBuffer();
		StringBuffer sqlCountSql = new StringBuffer("select ");
		
		for (int i = 0; i < list.size(); i++) {
			sqlSelectParams.append((String) list.get(i));
			sqlCountSql.append((String) list.get(i));
			if (i != list.size() - 1) {
				sqlSelectParams.append(" , ");
				sqlCountSql.append(" , ");
			}
		}
		
		sql.append("select top %1$d " + sqlSelectParams.toString()  + " " ); //这里的 %1$d 或者 pageSize 为起始index
		sql.append(" from (select top %1$d * " + " "); //这里的 %1$d 或者 pageSize * pageNo 为区间闭合区域边界值

		sql.append("  from " + tableName);
		sqlCountSql.append("  from " + tableName);
		if (!PublicUtil.checkEmptyString(where.trim())) {
			sql.append(" where " + where);
			sqlCountSql.append(" where " + where);
package plugin.dao.jdbc;

//~--- non-JDK imports --------------------------------------------------------

import java.util.List;
import java.util.Map;

import org.apache.commons.collections.map.ListOrderedMap;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.util.Assert;

import plugin.pager.Page;
import plugin.utils.Display;
import plugin.utils.PublicUtil;
import plugin.dao.FoFieldPro;

/**
 * jdbcDao测试
 * 
 * @author bifulin
 * 
 */
public abstract class JdbcDao extends JdbcDaoSupport {

	private static final Log log = LogFactory.getLog(JdbcDao.class);

	public List queryList(String sql, Object[] params)
			throws DataAccessException {
		return getJdbcTemplate().queryForList(sql, params);
	}

	/**
	 * 
	 * 因为oracle里面的表名、字段是区分大小写的,而在sql server里面是没有区分的
	 * 所有为了统一起见,所有的表名、字段名在建立时,统一改成大写。
	 * 
	 * 为了防止注入攻击,将所有的空格转换成: "",,将所有的";"转换成:""
	 * 
	 * @param name
	 * @return
	 */
	public String toSql(String name) {
		if (name == null) {
			return name;
		}
		name = name.toUpperCase();
		name.replaceAll(" ", "");
		name.replaceAll(";", "");
		return name;
	}

	/**
	 * 去除 sql 中的 select 子句
	 * 
	 * @param sql
	 * @return String - sql
	 */
	private final String removeSelect(String sql) {
		Assert.hasText(sql);
		int beginPos = sql.toLowerCase().indexOf("from");
		Assert.isTrue(beginPos != -1, " sql : " + sql
				+ " must has a keyword 'from'");
		return sql.substring(beginPos);
	}

	/**
	 * 去除 sql 中的 order by 子句
	 * 
	 * @param sql
	 * @return sql
	 */
	private final String removeOrder(String sql) {
		Assert.hasText(sql);
		return StringUtils.lowerCase(sql).replaceAll(
				"(order\\s+by\\s+[a-z,._\\s+]+(\\s+(asc|desc)?))", " ");
	}

	// 

	/**
	 * 获取本地的分页语句
	 * 
	 */
	protected abstract String getLocalQuerySql(String sql); // oracle 及 mysql
															// 数据库用

	protected abstract String getLocalQuerySql(String sql, String pk); // mssql数据库用

	/***
	 * 获取本地的分页参数
	 * 
	 * @param startIndex
	 * @param pageSize
	 * @param params
	 * @return
	 */
	protected abstract Object[] getParams(int startIndex, int pageSize,
			Object[] params);

	public abstract void addField(String tableName, FoFieldPro pro);

	public abstract void modifyField(String tableName, FoFieldPro pro);

	public abstract void dropField(String tableName, FoFieldPro pro);

	public abstract void dropIndex(String tableName, FoFieldPro pro);

	public abstract void createIndex(String tableName, FoFieldPro pro);

	public abstract void modifyNull(String tableName, FoFieldPro pro);

	public abstract void modifyNotNull(String tableName, FoFieldPro pro);

	public abstract void modifyDefault(String tableName, FoFieldPro pro);

	public abstract void createBaseTable(String tableName,
			List<FoFieldPro> fields, String pkField);

	public abstract boolean dropTable(String tableName);

	/***
	 * 获取开始的行号
	 * 
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */

	private int getStartIndex(int pageNo, int pageSize) {
		if (!PublicUtil.checkBigerThanZero(pageSize)) {
			pageSize = Page.getDEFAULT_PAGE_SIZE();
		}
		if (pageNo <= 0) {
			return 0;
		}
		return (pageNo - 1) * pageSize + 1;
	}

	public Page pagedQuery(String sql, int pageNo, int pageSize,
			Object[] params, RowMapper rowMapper) {
		int startIndex = getStartIndex(pageNo, pageSize);
		return pagedQuery(startIndex, pageSize, sql, params, rowMapper);
	}

	public Page pagedQuery(String sql, int pageNo, int pageSize, Object[] params) {
		int startIndex = getStartIndex(pageNo, pageSize);
		return pagedQuery(startIndex, pageSize, sql, params, null);
	}

	public Page pagedQuery(String sql, int pageNo, int pageSize) {
		return pagedQuery(sql, pageNo, pageSize, null);
	}

	public Page pagedQuery(String sql, int pageNo) {
		return pagedQuery(sql, pageNo, Page.getDEFAULT_PAGE_SIZE());
	}

	public Page pagedQuery(int startIndex, int pageSize, String sql,
			Object[] params) {
		return pagedQuery(startIndex, pageSize, sql, params, null);
	}

	public Page pagedQuery(int startIndex, int pageSize, String sql) {
		return pagedQuery(startIndex, pageSize, sql, null);
	}

	public Page pagedQuery(int startIndex, String sql) {
		return pagedQuery(startIndex, 0, sql, null);
	}

	public Page pagedQuery(int startIndex, int pageSize, String sql,
			Object[] params, RowMapper rowMapper) {
		Assert.hasText(sql);
		Assert.isTrue(startIndex >= 0, "startIndex should start from 0");
		// Count查询
		String countQueryString = " select count (*) "
				+ removeSelect(removeOrder(sql));
		int totalCount = this.getJdbcTemplate().queryForInt(countQueryString,
				params);

		// 如果开始数大于总记录数,那么就取最后一页
		if (startIndex > totalCount) {
			startIndex = totalCount - pageSize + 1;
		}

		int endIndex = startIndex + pageSize;

		if (totalCount < 1)
			return new Page();
		if (pageSize == 0) {
			pageSize = Integer.MAX_VALUE;
		}

		// 实际查询返回分页对象
		Object[] desParams = getParams(startIndex, pageSize, params);

		List list = null;
		if (desParams != null && rowMapper == null) {
			list = getJdbcTemplate().queryForList(getLocalQuerySql(sql),
					desParams);
		} else if (desParams != null && rowMapper != null) {
			list = getJdbcTemplate().query(getLocalQuerySql(sql), desParams,
					rowMapper);
		}

		Page page = new Page(startIndex, totalCount, pageSize, list);
		page.setCurrentPageSize(list.size());
		return page;
	}
	
	@SuppressWarnings({ "unused", "rawtypes" })
	public Page pagedQueryBySqlServer(String[] sqls, int pageNo, int pageSize) {
		int startIndex = getStartIndex(pageNo, pageSize);
		Assert.hasText(sqls[0]);
		Assert.hasText(sqls[1]);
		Assert.isTrue(startIndex >= 0, "startIndex should start from 0");
		// Count查询
		String countQueryString = " select count (*) "
				+ removeSelect(removeOrder(sqls[0]));
		int totalCount = this.getJdbcTemplate().queryForInt(countQueryString,
				null);

		// 如果开始数大于总记录数,那么就取最后一页
		if (startIndex > totalCount) {
			startIndex = totalCount - pageSize + 1;
		}

		int endIndex = startIndex + pageSize;

		if (totalCount < 1)
			return new Page();
		if (pageSize == 0) {
			pageSize = Integer.MAX_VALUE;
		}

		// 实际查询返回分页对象
		Object[] desParams = getParams(startIndex, pageSize, null);

		List list = null;
		if (desParams != null) {
			list = getJdbcTemplate().queryForList(getLocalQuerySql(String.format(sqls[1], startIndex,startIndex*pageSize)));
		} 

		Page page = new Page(startIndex, totalCount, pageSize, list);
		page.setCurrentPageSize(list.size());
		return page;
	}

	// 

	private DataSourceTransactionManager jdbcTransactionManager;

	public DataSourceTransactionManager getJdbcTransactionManager() {
		return jdbcTransactionManager;
	}

	public void setJdbcTransactionManager(
			DataSourceTransactionManager jdbcTransactionManager) {
		this.jdbcTransactionManager = jdbcTransactionManager;
	}

}

}sql.append(" ) A order by A.fdID desc ");log.info(sqlCountSql.toString());log.info(sql.toString());return new String[] {sqlCountSql.toString(),sql.toString()};}


对应的jdbcdao



例如:oracle dao

package  plugin.dao.jdbc;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.RowMapper;

import  plugin.pager.Page;
import  plugin.utils.Display;
import  plugin.utils.PublicUtil;
import  plugin.dao.DbType;
import  plugin.dao.FoFieldPro;

public class OracleJdbcDao extends JdbcDao {

	private static final Log log = LogFactory.getLog(OracleJdbcDao.class);

	/**
	 * 根据原始查询语句生成相应的分页SQL语句
	 * 
	 * @param sql
	 * @return String
	 */
	public String getLocalQuerySql(String sql) {
		StringBuffer sqlBuffer = new StringBuffer();
		sqlBuffer.append("SELECT * FROM(SELECT A.*,ROWNUM RN FROM(");
		sqlBuffer.append(sql);
		sqlBuffer.append(") A WHERE ROWNUM<?) WHERE RN>=?");
		return sqlBuffer.toString();
	}

	public String getLocalQuerySql(String sql, String pk) {
		return getLocalQuerySql(sql);
	}

	/**
	 * 获取分页参数
	 */
	public Object[] getParams(int startIndex, int pageSize, Object[] params) {

		Object[] des = null;
		Object[] append = { startIndex + pageSize, startIndex };

		if (params == null) {
			return des = append;
		} else {
			des = new Object[params.length + append.length];
			System.arraycopy(params, 0, des, 0, params.length);
			System.arraycopy(append, 0, des, params.length, append.length);
		}

		Display.display(des);
		return des;
	}

	// 增加字段 alter table FO_DS_BI3 add FD_TEST5 varchar(40) default '1' not
	// null;;
	public void addField(String tableName, FoFieldPro pro) {
		tableName = toSql(tableName);
		String columnName = toSql(pro.getName());
		String type = DbType.getDbType(pro.getType());
		boolean isRequire = pro.isRequire();
		boolean isIndex = pro.isIndex();
		String defaultVal = toSql(pro.getDefaultVal());

		// 建立字段
		String sql = " alter table " + tableName + " add " + columnName + " "
				+ type;

		if (defaultVal != null) {
			sql = sql + " default " + "'" + defaultVal + "'";
		}
		if (isRequire) {
			sql = sql + " not null ";
		}
		getJdbcTemplate().execute(sql);

		// 建立索引
		if (isIndex) {
			sql = " create index " + tableName + "_index_" + columnName
					+ " on " + tableName + ("(") + columnName + ")";
			getJdbcTemplate().execute(sql);
		}

	}

	// 修改字段 alter table FO_DS_BI2 modify FDCREATEAT varchar2(50);
	/**
	 * 因为字段类型的关系,此函数极易修改失败。
	 */
	public void modifyField(String tableName, FoFieldPro pro) {
		tableName = toSql(tableName);
		String columnName = toSql(pro.getName());
		String type = DbType.getDbType(pro.getType());
		String sql = " alter table " + tableName + " modify " + columnName
				+ " " + type;
		getJdbcTemplate().execute(sql);
	}

	// 删除字段 alter table FO_DS_BI2 drop column FDCODE;
	public void dropField(String tableName, FoFieldPro pro) {
		tableName = toSql(tableName);
		String columnName = toSql(pro.getName());

		String sql = " alter table " + tableName + " drop column " + columnName;
		getJdbcTemplate().execute(sql);
	}

	// 建立根本表
	public void createBaseTable(String tableName, List<FoFieldPro> fields,
			String pkField) {
		tableName = toSql(tableName);
		pkField = toSql(pkField);

		// 表名不能为空
		if (PublicUtil.checkEmptyString(tableName)) {
			log.error("表名不能为空");
			return;
		}

		// 至少要有一个字段

		if (PublicUtil.checkEmptyList(fields)) {
			log.error("字段不能为空,至少需要有一个字段");
			return;
		}

		StringBuffer sql = new StringBuffer(" create table " + tableName + " (");
		List<String> indexs = new ArrayList<String>();

		// 组合字段语句
		for (FoFieldPro pro : fields) {

			String columnName = toSql(pro.getName());
			String type = pro.getType();
			String columnType = DbType.getDbType(type);
			boolean isRequire = pro.isRequire();
			boolean isIndex = pro.isIndex();
			String defaultVal = toSql(pro.getDefaultVal());

			sql.append(toSql(columnName) + " " + toSql(columnType));

			// //建立字段

			if (defaultVal != null) {
				sql.append(" default " + "'" + defaultVal + "'");
			}
			if (isRequire) {
				sql.append(" not null ");
			}

			if (columnName.equalsIgnoreCase(pkField)) {
				sql.append(" primary key ");
			}

			if (isIndex) {
				String index = " create index " + tableName + "_index_"
						+ columnName + " on " + tableName + ("(") + columnName
						+ ")";
				indexs.add(index);
			}

			sql.append(" ,");
		}

		// 删除最后的逗号
		sql = new StringBuffer(sql.substring(0, sql.lastIndexOf(",") - 1));

		sql.append(" ) ");

		log.info(sql.toString());
		getJdbcTemplate().execute(sql.toString());

		// 建立索引
		if (!PublicUtil.checkEmptyList(indexs)) {
			for (String s : indexs) {
				getJdbcTemplate().execute(s);
			}
		}

	}

	// 删除数据表
	public boolean dropTable(String tableName) {
		tableName = toSql(tableName);

		// 删除表
		String sqlDropTable = "drop table " + tableName;

		try {
			getJdbcTemplate().execute(sqlDropTable);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}

	}

	public void dropIndex(String tableName, FoFieldPro pro) {
		String columnName = toSql(pro.getName());
		tableName = toSql(tableName);
		String sql = " drop index " + tableName + "_index_" + columnName;
		getJdbcTemplate().execute(sql);

	}

	public void createIndex(String tableName, FoFieldPro pro) {
		String columnName = toSql(pro.getName());
		tableName = toSql(tableName);
		String sql = " create index " + tableName + "_index_" + columnName
				+ " on " + tableName + ("(") + columnName + ")";
		getJdbcTemplate().execute(sql);
	}

	public void modifyNull(String tableName, FoFieldPro pro) {
		String columnName = toSql(pro.getName());
		tableName = toSql(tableName);

		String sql = "alter table " + tableName + " modify " + columnName
				+ " null";
		getJdbcTemplate().execute(sql);
	}

	public void modifyNotNull(String tableName, FoFieldPro pro) {
		String columnName = toSql(pro.getName());
		tableName = toSql(tableName);

		String sql = "alter table " + tableName + " modify " + columnName
				+ " not null";
		getJdbcTemplate().execute(sql);
	}

	/**
	 * 
	 * alter table STUDENT modify name default 1; alter table STUDENT modify
	 * NAME default null;
	 * 
	 */
	public void modifyDefault(String tableName, FoFieldPro pro) {
		String columnName = toSql(pro.getName());
		tableName = toSql(tableName);
		String sql = "alter table " + tableName + " modify " + columnName
				+ " default " + pro.getDefaultVal();
		getJdbcTemplate().execute(sql);
	}

	public static void main(String[] args) {
		String[] configLocations = { "classpath*:spring/*.xml" };
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
				configLocations);
		JdbcDao dao = (JdbcDao) applicationContext.getBean("jdbcDao");

		int startIndex = 3;
		int pageSize = 5;
		int pageNo = 2;
		String sql = "select * from fo_ds_bi";
		// Object[] params = {"%1%"};
		Object[] params = null;
		// RowMapper rowMapper =new StudentRowMapper();
		RowMapper rowMapper = null;

		// Page page = dao.pagedQuery(startIndex, pageSize, sql, params,
		// rowMapper);
		Page page = dao.pagedQuery(sql, pageNo, pageSize, params, rowMapper);

		log.info(page.getTotalCount());
		List list = (List) page.getData();
		Display.display(list);

		// for(int i=0;i<list.size();i++){
		// Student student = (Student)list.get(i);
		// log.info(student.getName() + "     " + student.getId());
		// }

	}
}

参考了以下文章
https://www.cnblogs.com/liguangxi8/archive/2010/05/21/1740708.html

文章内容

浅淡SqlServer的Top与Oracle的RowNum

       平时的项目开发中,分页存储过程是用的比较多的存储过程,SqlServer分页存储过程中经常要用到top,Oracle中则经常用到了RowNum.

       现在,有一个UserInfo表,一个字段是UserId,另一个字段是UserName,其中是UserId是自动增长的,步长是1.表中共有30条数据,其中UserId的值不一定是连续的。现在要实现的目的是取其中的第11至第20条记录。先看SqlServer的几种做法:

       第一种写法:

复制代码
select   top   10   *   
 
from  UserInfo  
 
where  UserId  in  
       (
        
select   top   20  UserId 
        
from  UserInfo
       ) 
 
order   by  UserId  desc

 

复制代码

      第二种写法:

复制代码
  select   top   10   *   from  UserInfo  where  UserId  not   in    

 (select top 10 UserId from UserInfo )

 

复制代码

      第三种写法:

复制代码
  select   top   10   *   from  UserInfo  where  UserId >
 ( select   max (UserId)  from      

 (select top10 UserId from UserInfo order by UserId) a)

 

复制代码

     第四种写法(只可在Sqlserver 2005中):

复制代码
select   *   from  ( select  Row_Number()  over          

(Order by UserId) as RowId ,* from UserInfo) U 
where U.RowId between 10 and 20

 

复制代码

     Sqlserver 中其实还有另外几种写法,不一一写出。四种方法中,后两种的写法要比前两种写法效率要高些,但第四种只能写在SqlServer 2005中。

    在看Oracle中实现取其中的第11至第20条记录的做法之前,先看看一些人在使用RowNum遇到的莫名其妙的怪事。表同样是UserInfo,30条数据

select  t. * from  userinfo t  where  rownum > 10

    查询结果:

    

    理论上应该是有20条数据才对啊,问题出现在哪呢?

    因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (这里要强调的一点是:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。所以对于rownum>10没有数据是否可以这样理解:

    ROWNUM 是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,最后的查询结果为空。

    再看下面一条sql语句:

select  t. *   from  userinfo t  where  rownum != 10

    查询结果:

 

     查出的来结果不是21条,而是9条。可以这样理解:rownum 为9后的记录的 rownum为10,因条件为 !=10,所以去掉,其后记录补上,rownum又是10,也去掉,一直这样下去,最后的结果只有9条了。

    如果把后面的条件改为 where rownum>1 时,会发现查不到一条数据,如果是where rownum>0 或是where rownum>=1时则可以查询到所有的数据。原因很简单:因为 rownum 是在查询到的结果集后加上去的,它总是从1开始。

     between 1 and 20 或者 between 0 and 20 能查到结果,而用 between 2 and 20 却得不到结果,原因同上一样,因为 rownum 总是从 1 开始。

     所以要实现取UserInfo表其中的第11至第20条记录,可以这样写:

select   *    from  
(
select  rownum  as  rn,t. *   from  userinfo t  where  rownum  > 0 )
where  rn  between   10   and   20

查询结果:

     

当然也可以这样写:

  select     *     from    UserInfo    where    rownum < 20      
   minus     
  
select     *     from    UserInfo    where    rownum < 10

这种写法没有前面那种效率高。

 

但不能这样写:

select  t. *  from  UserInfo t  where  rownum  between  10  and  20
select  t. *  from  UserInfo t  where  rownum  >  10  and  rownum  <= 20

上 面两种写法都取不到数据的。 

     对于Sqlserver 和Oracle实现取表其中的第11至第20条记录如果有更好的写法 ,可以贴出来学习下。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值