/*
* 系统名称: QuickBundle --> rmdemo
*
* 文件名称: org.quickbundle.project.common.service.impl --> RmCommonService.java
*
* 功能描述:
*
* 版本历史: 2005-9-23 15:25:23 创建1.0.0版 (baixiaoyong)
*
*/
package org.quickbundle.project.common.service.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.quickbundle.ICoreConstants;
import org.quickbundle.base.dao.RmJdbcTemplate;
import org.quickbundle.base.exception.RmRuntimeException;
import org.quickbundle.base.service.RmService;
import org.quickbundle.base.web.page.RmPageVo;
import org.quickbundle.itf.IExecuteCode;
import org.quickbundle.project.common.dao.RmCommonDao;
import org.quickbundle.project.common.service.IRmCommonService;
import org.quickbundle.project.common.vo.RmCommonVo;
import org.quickbundle.project.listener.RmRequestMonitor;
import org.quickbundle.tools.helper.RmPopulateHelper;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
/**
* 功能: 通用的JDBC方法,do开头的方法有特殊的业务含义,非do开头的转发JdbcTemplate
*
* @author 白小勇
*/
public class RmCommonService extends RmService implements IRmCommonService {
/**
* dao 表示: 数据访问层的实例
*/
private RmCommonDao dao = null;
public RmCommonDao getDao() {
return dao;
}
public void setDao(RmCommonDao dao) {
this.dao = dao;
}
/**
* 查询sql,返回RmcommonVo
*
* @param sql
* @return
*/
public List<RmCommonVo> doQuery(String sql) {
return query(sql, getDefaultRowMapper(RmCommonVo.class));
}
/**
* 通用的方法,返回自己控制的对象
*
* @param sql 要执行的sql语句
* @param rowMapper 回调方法
* @return 自己控制的对象列表
*/
public List query(String sql, RowMapper rowMapper) {
return getDao().query(sql, rowMapper);
}
/**
* 以size作为分页大小,取回第no页的记录
* 查询sql,返回RowMapper中自定义的对象
*
* @param sql 要执行的sql语句
* @param rowMapper 回调方法
* @param no 当前页数
* @param size 每页记录数
* @return 对象列表
*/
@SuppressWarnings("unchecked")
public List<RmCommonVo> doQuery(String sql, int no, int size) {
return doQueryStartIndex(sql, getDefaultRowMapper(RmCommonVo.class), (no - 1) * size + 1, size);
}
/**
* 从指定的startIndex作为第一条,获取size条记录
*
* @param sql 要执行的sql语句
* @param rowMapper 回调方法
* @param startIndex 开始位置(第一条是1,第二条是2...)
* @param size 获取的记录数
* @return 对象列表
*/
@SuppressWarnings("unchecked")
public List<RmCommonVo> doQueryStartIndex(String sql, int startIndex, int size) {
return doQueryStartIndex(sql, getDefaultRowMapper(RmCommonVo.class), startIndex, size);
}
/**
* 通用的方法,返回自己控制的对象
*
* @param sql 要执行的sql语句
* @param rowMapper 回调方法
* @param no 当前页数
* @param size 每页记录数
* @return 自己控制的对象列表
*/
public List doQuery(String sql, RowMapper rowMapper, int no, int size) {
return doQueryStartIndex(sql, rowMapper, (no - 1) * size + 1, size);
}
/**
* 从指定的startIndex作为第一条,获取size条记录
*
* @param sql 要执行的sql语句
* @param rowMapper 回调方法
* @param startIndex 开始位置(第一条是1,第二条是2...)
* @param size 获取的记录数
* @return 对象列表
*/
public List doQueryStartIndex(String sql, RowMapper rowMapper, int startIndex, int size) {
return getDao().query(sql, rowMapper, startIndex, size);
}
/**
* 查询sql,返回RmcommonVo,自动分页
*
* @param sql SQL语句
* @return
*/
@SuppressWarnings("unchecked")
public List<RmCommonVo> doQueryPage(String sql) {
return doQueryPage(sql, RmCommonVo.class);
}
private List doQueryPage(String sql, Class className) {
int recordCount = doQueryForInt("select count(*) from (" + sql + ") rm_a");
int[] aPage_size_current = (int[])RmRequestMonitor.getCurrentThreadRequest().getAttribute(ICoreConstants.RM_CURRENT_PAGE);
RmPageVo pageVo = new RmPageVo(recordCount, aPage_size_current[0]);
pageVo.setCurrentPage(aPage_size_current[1]);
RmRequestMonitor.getCurrentThreadRequest().setAttribute(ICoreConstants.RM_PAGE_VO, pageVo);
return doQuery(sql, getDefaultRowMapper(className), pageVo.getCurrentPage(), pageVo.getPageSize());
}
/**
* 通用的方法,返回自己控制的对象
*
* @param sql 要执行的sql语句
* @param elementType 需要的类型
* @return 对象列表
* @throws DataAccessException
*/
public <T> List<T> queryForList(String sql, Class<T> elementType) throws DataAccessException {
return getDao().queryForList(sql, elementType);
}
/**
* 通用的方法,返回自己控制的对象
*
* @param sql 要执行的sql语句
* @return 对象列表
* @throws DataAccessException
*/
public List<Map<String, Object>> queryForList(String sql) throws DataAccessException {
return getDao().queryForList(sql);
}
/**
* 通用的方法,返回自己控制的对象
*
* @param sql 要执行的sql语句
* @param args ?对应的值
* @param argTypes ?对应的值的类型
* @param elementType 需要的类型
* @return 对象列表
* @throws DataAccessException
*/
public <T> List<T> queryForList(String sql, Object[] args, int[] argTypes, Class<T> elementType) throws DataAccessException {
return getDao().queryForList(sql, args, argTypes, elementType);
}
/**
* 通用的方法,返回自己控制的对象
*
* @param sql 要执行的sql语句
* @param args ?对应的值
* @param elementType 需要的类型
* @return 对象列表
* @throws DataAccessException
*/
public <T> List<T> queryForList(String sql, Object[] args, Class<T> elementType) throws DataAccessException {
return getDao().queryForList(sql, args, elementType);
}
/**
* 通用的方法,返回自己控制的对象
*
* @param sql 要执行的sql语句
* @return RmCommonVo对象
*/
public RmCommonVo doQueryForObject(String sql) {
return (RmCommonVo)getDao().queryForObject(sql, getDefaultRowMapper(RmCommonVo.class));
}
/**
* 通用的方法,返回自己控制的对象
*
* @param sql 要执行的sql语句
* @param requiredType 需要的类型
* @return
*/
public <T> T queryForObject(String sql, Class<T> requiredType) {
return getDao().queryForObject(sql, requiredType);
}
/**
* sql带?及参数,执行查询,返回T
*
* @param sql 要执行的sql语句
* @param args ?对应的值
* @param requiredType 需要的类型
* @return
*/
public <T> T queryForObject(String sql, Object[] args, Class<T> requiredType) {
return getDao().queryForObject(sql, args, requiredType);
}
/**
* 通用的方法,返回自己控制的对象
*
* @param sql 要执行的sql语句
* @param rowMapper 回调方法
* @return 自己控制的对象
*/
public <T> T queryForObject(String sql, RowMapper<T> rowMapper) {
return getDao().queryForObject(sql, rowMapper);
}
/**
* 通用的方法,执行查询,返回int
*
* @param sql 要执行的sql语句
* @return 查询结果int
*/
public int doQueryForInt(String sql) {
Integer value = getDao().queryForObject(sql, Integer.class);
if(value == null) {
return 0;
} else {
return value.intValue();
}
}
/**
* 执行查询,返回long
*
* @param sql 要执行的sql语句
* @return 查询结果long
*/
public long doQueryForLong(String sql) {
Long value = getDao().queryForObject(sql, Long.class);
if(value == null) {
return 0;
} else {
return value.longValue();
}
}
/**
* 执行更新,返回更新的记录条数
*
* @param sql 要执行的sql语句
* @return 更新记录条数
*/
public int doUpdate(String sql) {
//TODO 业务日志
return getDao().update(sql);
}
/**
* 执行更新,带?及参数,返回更新的记录条数
*
* @param sql 带 ?的SQL语句
* @param aObj ?对应的值
* @return
*/
public int doUpdate(String sql, Object[] aObj) {
//TODO 业务日志
return getDao().update(sql, aObj);
}
/**
* 执行批量更新sql,返回更新的记录条数
*
* @param sql
* @return
*/
public int[] doUpdateBatch(String[] sql) {
//TODO 业务日志
return getDao().batchUpdate(sql);
}
/** 执行批量更新,带?及参数,返回更新的记录条数
* @param sql 带 ?的SQL语句
* @param aObj ?对应的值
* @return
*/
public int[] doUpdateBatch(String sql, Object[][] aaObj) {
//TODO 业务日志
return getDao().batchUpdate(sql, aaObj, new RmJdbcTemplate.CircleVoArray() {
public Object[] getArgs(Object obj) {
return (Object[])obj;
}
});
}
/**
* 执行自定义定义代码,在一个事务中
* @param executeCode
* @return
*/
public Object execute(IExecuteCode executeCode) {
return executeCode.execute();
}
/**
* 查询sql语句,将第1列和第2列放入数组,结果集作为二维数组返回
*
* @param sql select value, name from table1
* @return new String[count(*)][2]
*/
public String[][] paseToArrays(String sql) {
return paseToArrays(sql, new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
return new String[]{rs.getString(1), rs.getString(2)};
}
});
}
/**
* 查询sql语句,rowMapper完成一维数组的创建,整个结果集作为二维数组返回
*
* @param sql select value, name from table1
* @param rowMapper 创建一维数组的回调实现
* @return new String[count(*)][2]
* @return
*/
@SuppressWarnings("unchecked")
public String[][] paseToArrays(String sql, RowMapper rowMapper) {
return (String[][])query(sql, rowMapper).toArray(new String[0][0]);
}
private RowMapper getDefaultRowMapper(final Class className) {
return new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Object obj = null;
try {
obj = className.newInstance();
RmPopulateHelper.populate(obj, rs);
} catch (InstantiationException e) {
throw new RmRuntimeException("反射错误", e);
} catch (IllegalAccessException e) {
throw new RmRuntimeException("反射错误", e);
}
return obj;
}
};
}
}