|
public class CacheSqlMapClientTemplate extends SqlMapClientTemplate {
private static final Log logger = LogFactory
.getLog(CacheSqlMapClientTemplate.class);
private static final String DEFAULT_SPARATOR = "_";
/* (non-Javadoc)
* @see org.springframework.orm.ibatis.SqlMapClientTemplate#queryForList(java.lang.String, java.lang.Object, int, int)
*/
@Override
public List queryForList(String statementName, Object parameterObject, int skipResults,
int maxResults) throws DataAccessException {
String key = statementName + DEFAULT_SPARATOR + generateKeyPart(parameterObject)
+ skipResults + maxResults;
List result = queryDataFromCacheModel(key, List.class);
if (result != null) {
return result;
}
result = super.queryForList(statementName, parameterObject, skipResults, maxResults);
addDataToCacheModel(key, result);
return result;
}
/* (non-Javadoc)
* @see org.springframework.orm.ibatis.SqlMapClientTemplate#queryForList(java.lang.String, java.lang.Object)
*/
@Override
public List queryForList(String statementName, Object parameterObject)
throws DataAccessException {
String key = statementName + DEFAULT_SPARATOR + generateKeyPart(parameterObject);
List result = queryDataFromCacheModel(key, List.class);
if (result != null) {
return result;
}
result = super.queryForList(statementName, parameterObject);
addDataToCacheModel(key, result);
return result;
}
/* (non-Javadoc)
* @see org.springframework.orm.ibatis.SqlMapClientTemplate#queryForObject(java.lang.String, java.lang.Object, java.lang.Object)
*/
@Override
public Object queryForObject(String statementName, Object parameterObject, Object resultObject)
throws DataAccessException {
String key = statementName + DEFAULT_SPARATOR + generateKeyPart(parameterObject)
+ DEFAULT_SPARATOR + generateKeyPart(resultObject);
Object result = queryDataFromCacheModel(key, Object.class);
if (result != null) {
return result;
}
result = super.queryForObject(statementName, parameterObject, resultObject);
addDataToCacheModel(key, result);
return result;
}
/* (non-Javadoc)
* @see org.springframework.orm.ibatis.SqlMapClientTemplate#queryForObject(java.lang.String, java.lang.Object)
*/
@Override
public Object queryForObject(String statementName, Object parameterObject)
throws DataAccessException {
String key = statementName + DEFAULT_SPARATOR + generateKeyPart(parameterObject);
Object result = queryDataFromCacheModel(key, Object.class);
if (result != null) {
return result;
}
result = super.queryForObject(statementName, parameterObject);
addDataToCacheModel(key, result);
return result;
}
private <T> T queryDataFromCacheModel(Object key, Class<T> type) {
if (CacheModel.exist()) {
logger.info("Look up data from current transaction's CacheModel , KEY={" + key + "}");
Object value = CacheModel.get(key);
if (value != null) {
return type.cast(value);
} else {
logger
.info("Current transaction's CacheModel dosen't contain any data relate with {"
+ key + "}");
}
}
return null;
}
private <T> void addDataToCacheModel(Object key, T value) {
if (null == value) {
return;
}
if (CacheModel.exist()) {
CacheModel.add(key, value);
logger.info("Add data to current transaction's CacheModel , KEY={" + key + "}");
}
}
private String generateKeyPart(Object source) {
if (source == null) {
return "";
} else if (source instanceof String) {
return (String) source;
} else if (source instanceof Map) {
return generate((Map) source);
} else {
try {
return generate(BeanUtils.describe(source));
} catch (Exception e) {
return source.toString();
}
}
}
private String generate(Map props) {
try {
Iterator iProps = props.keySet().iterator();
StringBuffer retBuffer = new StringBuffer();
while (iProps.hasNext()) {
String key = (String) iProps.next();
if ("class".equals(key)) {
continue;
}
retBuffer.append(key).append("=[").append(props.get(key)).append("]");
if (iProps.hasNext()) {
retBuffer.append(", ");
}
}
return retBuffer.toString();
} catch (Exception e) {
return "";
}
}
}
|