最代码广告位
首页>分享>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;
	}

}
最近下载更多
17600446733 LV192019年12月23日
太阳星星星星星星
花开为君顾 LV62019年11月18日
月亮星星星星
1106547553 LV92019年5月5日
月亮月亮星星
zhangxu1111 LV112019年1月18日
月亮月亮星星星星星星
但愿一生只爱一人 LV72018年11月27日
月亮星星星星星星
ReynLi LV82018年7月31日
月亮月亮
话不多的程序员 LV172018年7月11日
太阳星星
james4lee LV112018年6月24日
月亮月亮星星星星星星
哦大幅度 LV162018年5月8日
太阳
苗毅6666 LV322018年3月27日
太阳太阳
最近浏览更多
今夜满天星 LV62月9日
月亮星星星星
农村电脑名称 LV181月23日
太阳星星星星
yuyan49911月21日
暂无贡献等级
忘了海的鱼 LV41月14日
月亮
zhouzh LV51月8日
月亮星星
343068175 LV51月7日
月亮星星
清欢hello LV21月3日
星星星星
是小王同学呀2019年12月28日
暂无贡献等级
wy5209192019年12月23日
暂无贡献等级
Kwok0125 LV22019年12月23日
星星星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友