首页>代码>spring+spring jdbc+spring mvc整合easyui搭建的SQL查询器>/remotesql/src/main/java/org/virtus/study/remotesql/app/base/data/JdbcDaoSupportEx.java
package org.virtus.study.remotesql.app.base.data;

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

import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.virtus.study.remotesql.app.base.data.service.SQLPersister;
import org.virtus.study.remotesql.app.base.ex.DatabaseNotSupportException;

/**
 * 描述 :spring jdbc 扩展
 *
 * @author Sylar
 *
 */
@SuppressWarnings({ "unchecked", "rawtypes" })
public class JdbcDaoSupportEx extends NamedParameterJdbcDaoSupport implements SQLPersister{
	
	private final static int DBTYPE_ORACLE=0;
	private final static int DBTYPE_MYSQL=1;
	
	private int dbmsType=DBTYPE_ORACLE;
	
	public void setDbType(String type)
	{
		this.dbmsType=type.indexOf("oracle")>=0 ? DBTYPE_ORACLE : DBTYPE_MYSQL;
	}
	/**
	 * 描述 :
	 * 
	 * @author Sylar
	 * @param sql
	 * @param param
	 * @return
	 */
	@Override
	public Map getOrderedRow(String sql, Object... param) {
		SqlRowSet rs = this.getJdbcTemplate().queryForRowSet(sql, param);
		if(rs == null) {
			return null;
		}
		Map result = new LinkedHashMap();
		int columnCount = rs.getMetaData().getColumnCount();
		for(int i=1; i<=columnCount; i++) {
			//rs.getMetaData().getColumnName(i) 获取不到别名   改用getColumnLabel
			//rs.first()判断是否有数据
			result.put(rs.getMetaData().getColumnLabel(i), rs.first() ? rs.getString(i) : null);
		}
		return result;
	}

	/**
	 * 描述 :
	 * 
	 * @author Sylar
	 * @param sql
	 * @param params
	 * @return
	 */
	@Override
	public List<?> find(String sql, Object... params) {
		return this.getJdbcTemplate().query(sql, params, new QueryRowMapper());
	}

	/**
	 * 描述 :
	 * 
	 * @author Sylar
	 * @param pageNow
	 * @param pageSize
	 * @param sql
	 * @param params
	 * @return
	 */
	@Override
	public Pager findPagination(int pageNow, int pageSize, String sql,
			Object... params) {
		String countSQL = " SELECT count(*) c FROM (" + sql + ") count";
		int recordCount = Integer.parseInt(this.getOne(countSQL, params));

		int m = (recordCount % pageSize);
		int pageCount = (int) (recordCount - m) / pageSize + (m > 0 ? 1 : 0);
		if (pageCount <= 0) pageCount = 1;

		if (pageNow > pageCount) pageNow = pageCount;
		if (pageNow <= 0) pageNow = 1;

		String pageSql = this.getPaginationSql(sql, pageNow, pageSize);
		
		Pager pager = new Pager(pageNow, pageSize);
		pager.setRows(find(pageSql, params));
		
		pager.setRecordCount(recordCount);
		pager.setPageCount(pageCount);

		return pager;
	}

	/**
	 * 描述 :
	 * 
	 * @author Sylar
	 * @param sql
	 * @param pageNow
	 * @param pageSize
	 * @return
	 */
	private String getPaginationSql(String sql, int pageNow, int pageSize) {
		int startPos = (pageNow - 1) * pageSize;
		
		switch(this.dbmsType)
		{
			case DBTYPE_ORACLE: return this.getPageSqlOracle(sql, startPos, pageSize);
			case DBTYPE_MYSQL: return this.getPageSqlMysql(sql, startPos, pageSize);
		}
		
		throw new DatabaseNotSupportException("database type is not supported");
	}

	/**
	 * 描述 :
	 * 
	 * @author Sylar
	 * @param sql
	 * @param startPos
	 * @param pageSize
	 * @return
	 */
	private String getPageSqlMysql(String sql, int startPos, int pageSize) {
		StringBuffer buff = new StringBuffer();
		buff.append(sql).append(" LIMIT ").append(startPos).append(", ").append(pageSize);
		return buff.toString();
	}
	/**
	 * 描述 :
	 * 
	 * @author Sylar
	 * @param sql
	 * @param startPos
	 * @param pageSize
	 * @return
	 */
	private String getPageSqlOracle(String sql, int startPos, int pageSize) {
		StringBuffer buff = new StringBuffer();
		int endPos = startPos + pageSize;
		buff.append("SELECT *  FROM (SELECT A.*, ROWNUM rn FROM (").append(sql).append(") a ");
		buff.append(" WHERE ROWNUM <=").append(endPos).append(") b WHERE b.rn>").append(startPos);

		return buff.toString();
	}
	/**
	 * 描述 :
	 * 
	 * @author Sylar
	 * @param sql
	 * @param params
	 * @return
	 */
	@Override
	public int executeNonQuery(String sql, Object... params) {
		return this.getJdbcTemplate().update(sql, params);
	}

	/**
	 * 描述 :
	 * 
	 * @author Sylar
	 * @param sql
	 * @param params
	 * @return
	 */
	@Override
	public String getOne(String sql, Object... params) {
		SqlRowSet rs = this.getJdbcTemplate().queryForRowSet(sql, params);
		return rs.next() ? rs.getString(1) : null;
	}

}
最近下载更多
vicgong  LV4 2022年5月23日
423256321  LV4 2021年1月7日
爱自己的修罗  LV7 2020年9月29日
cs1994814814  LV8 2020年4月21日
17600446733  LV21 2019年12月23日
花开为君顾  LV6 2019年11月18日
1106547553  LV10 2019年5月5日
zhangxu1111  LV11 2019年1月18日
但愿一生只爱一人  LV7 2018年11月27日
ReynLi  LV8 2018年7月31日
最近浏览更多
chen影 2023年10月27日
暂无贡献等级
huangjie123456  LV5 2023年8月7日
sunhao111111  LV2 2023年7月27日
Dominick  LV14 2023年6月20日
akbar2020  LV9 2022年8月27日
vicgong  LV4 2022年5月23日
wyg1414530637 2022年4月1日
暂无贡献等级
刘亦菲9527  LV15 2022年2月12日
缘------  LV9 2021年8月31日
zt77259066  LV3 2021年6月25日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友