[图片]
package com.tenwa.business.daoImpl;
/**
* 项目名称: 系统名称
* 包名: com.business.daoImpl
* 文件名: BaseDaoImpl.java
* 版本信息: 1.0.0
* 创建日期: 2013-1-14-上午10:01:10
* Copyright:2013XX公司-版权所有
**/
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import junit.framework.Assert;
import oracle.jdbc.OracleTypes;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.map.ObjectMapper;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.aop.ThrowsAdvice;
import org.springframework.beans.BeanUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.CallableStatementCreator;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import com.tenwa.business.dao.BaseDao;
import com.tenwa.business.entity.User;
import com.tenwa.business.model.CaseEnum;
import com.tenwa.exception.BusinessException;
import com.tenwa.kernal.utils.DateUtil;
import com.tenwa.kernal.utils.EntityUtil;
import com.tenwa.kernal.utils.MathUtil;
import com.tenwa.kernal.utils.ResourceUtil;
import com.tenwa.kernal.utils.SecurityUtil;
import com.tenwa.kernal.utils.StringUtil;
/**
* 类名称: BaseDaoImpl
* 类描述:
* 创建人: Administrator
* 修改人: Administrator
* 修改时间:2013-1-14 上午10:01:10
* 修改备注:
*
* @version 1.0.0
**/
@SuppressWarnings({ "unchecked" })
public abstract class AbstractBaseDaoImpl implements BaseDao {
private static ObjectMapper jsonMapper = new ObjectMapper();
private static Log log = LogFactory.getLog(AbstractBaseDaoImpl.class);
@Override
public abstract JdbcTemplate getJdbcTemplate() throws Exception;
@Override
public abstract HibernateTemplate getHibernateTemplate() throws Exception;
@Override
public abstract RedisTemplate<String, String> getRedisTemplate() throws Exception;
@Override
public void saveEntity(Object entity) throws Exception
{
this.getHibernateTemplate().save(entity);
}
@Override
public void saveAllEntities(Collection entities) throws Exception
{
for (Object entity : entities)
{
this.getHibernateTemplate().save(entity);
}
}
@Override
public void updateEntity(Object entity) throws Exception
{
this.getHibernateTemplate().update(entity);
}
@Override
public void updateAllEntities(Collection entities) throws Exception
{
for (Object entity : entities)
{
this.getHibernateTemplate().update(entity);
}
}
@Override
public void mergeEntity(Object entity) throws Exception
{
this.getHibernateTemplate().merge(entity);
}
@Override
public void mergeAllEntities(Collection entities) throws Exception
{
for (Object entity : entities)
{
this.getHibernateTemplate().merge(entity);
}
}
@Override
public void saveOrUpdateEntity(Object entity) throws Exception
{
this.getHibernateTemplate().saveOrUpdate(entity);
}
@Override
public void saveOrUpdateAllEntities(Collection entities) throws Exception
{
for(Object obj:entities){
this.getHibernateTemplate().saveOrUpdate(obj);
}
}
@Override
public void removeEntity(Object entity) throws Exception
{
this.getHibernateTemplate().delete(entity);
}
@Override
public void removeAllEntites(Collection entities) throws Exception
{
if(entities!= null){
this.getHibernateTemplate().deleteAll(entities);
}
}
@Override
public int updateByHSQL(String hsql, Object... values) throws Exception
{
return this.getHibernateTemplate().bulkUpdate(hsql, values);
}
public void updateFlush() throws Exception {
this.getHibernateTemplate().flush();
}
@Override
public <T> List<T> findEntities(Class<T> entityClass) throws Exception
{
/*DetachedCriteria criteria = DetachedCriteria.forClass(entityClass);
return this.getHibernateTemplate().findByCriteria(criteria);*/
String entityClassName = entityClass.getSimpleName();
String hsql = "select u from "+entityClassName+" u";
return this.findResultsByHSQL(hsql);
}
@Override
public <T> T findEntityByID(Class<T> entityClass, String id) throws DataAccessException, Exception {
return this.getHibernateTemplate().get(entityClass, id);
}
@Override
public <T> List<T> findEntityByIDArray(Class<T> entityClass, String[] ids) throws DataAccessException, Exception {
DetachedCriteria criteria = DetachedCriteria.forClass(entityClass);
criteria.add(Restrictions.in("id", ids));
List<T> list = (List<T>)this.getHibernateTemplate().findByCriteria(criteria);
return list;
}
@Override
public <T> Integer getEntitiesRowCount(Class<T> entityClass) throws Exception
{
DetachedCriteria criteria = DetachedCriteria.forClass(entityClass);
criteria.setProjection(Projections.rowCount());
return (Integer) this.getHibernateTemplate().findByCriteria(criteria).get(0);
}
@Override
public <T> List<T> findEntitiesPage(final Class<T> entityClass, final int start, final int limit) throws Exception
{
return this.getHibernateTemplate().executeFind(new HibernateCallback<List<Object>>() {
@Override
public List doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria criteria = session.createCriteria(entityClass);
criteria.setFirstResult(start);
criteria.setMaxResults(limit);
return criteria.list();
}
});
}
@Override
public <T> List<T> findEntityByProperties(Class<T> entityClass, Map<String, Object> propertiesMap) throws Exception
{
int start = -1;
int limit = -1;
return this.findEntityByPropertiesPage(entityClass, propertiesMap, start, limit);
}
/**
*
* @date 2013-4-17
* 保存mainObjectClass的数据到数据库
* xuyunlong
* @param mainObjectClass
* :要保存实体的class 例projInfo.class
* @param propertiesMap
* :类属性来查找类Map 关键字来找数据
* @param sourceMapModel
* :数据源Map
* @param classFieldMapping
* :map<类名,"属性"> 是指当类属性为实体时来查到到这个实体,实体.属性
* @param entityIdentifier
* :字符串前台字段的Key 和mainObject对应该的字符串
* @return object :返回操作的类
* @throws Exception
*/
@Override
public <T> T updateMainEntity(Class<T> mainObjectClass, Map<String, Object> propertiesMap, Map sourceMapModel,
Map<String, String> classFieldMapping, String... entityIdentifier) throws Exception
{
StringBuffer sb = new StringBuffer();
if (entityIdentifier.length > 0) {
for (String ei : entityIdentifier)
{
sb.append(ei + ".");
}
}
sourceMapModel.remove(sb.toString() + "id");
T mainObject = this.getNewOrUpdateObject(mainObjectClass, propertiesMap);
this.copyAndOverrideExistedValueFromStringMap(sourceMapModel, mainObject, classFieldMapping, entityIdentifier);
this.getHibernateTemplate().saveOrUpdate(mainObject);
return mainObject;
}
/**
*
* @date 2013-4-17
* 更新实体的一个属性对象
* xuyunlong
* @param mainObject
* :主实体对照
* @param toUpdatedObjectFieldName
* :主实体的属性
* @param toMainObjectFieldName
* :主实体中某个属性的对象 相对主实体的属性
* @ sourceMapModel :数据源Map
* @param classFieldMapping
* :map<类名,"属性"> 是指当类属性为实体时来查到到这个实体,实体.属性
* @param entityIdentifier
* :字符串前台字段的Key 和mainObject对应该的字符串
* @return object :返回操作的类
* @throws Exception
*/
@Override
public <T,V> V updateOneToOneEntity(T mainObject, String toUpdatedObjectFieldName,
String toMainObjectFieldName, Map sourceMapModel, Map<String, String> classFieldMapping,
String... entityIdentifier) throws Exception
{
StringBuffer sb = new StringBuffer();
if (entityIdentifier.length > 0) {
for (String ei : entityIdentifier)
{
sb.append(ei + ".");
}
}
sourceMapModel.remove(sb.toString() + "id");
Assert.assertNotNull(mainObject);
PropertyDescriptor toUpdatedObjectFieldNamePD = BeanUtils.getPropertyDescriptor(mainObject.getClass(),
toUpdatedObjectFieldName);
Method toUpdatedObjectFieldNameReadMethod = toUpdatedObjectFieldNamePD.getReadMethod();
V updatedObject = (V)toUpdatedObjectFieldNameReadMethod.invoke(mainObject);
Class<V> updatedObjectClass = (Class<V>)toUpdatedObjectFieldNameReadMethod.getReturnType();
PropertyDescriptor toMainObjectFieldNamePD = BeanUtils.getPropertyDescriptor(updatedObjectClass,
toMainObjectFieldName);
Method toMainObjectFieldNameMethod = toMainObjectFieldNamePD.getWriteMethod();
if (null == updatedObject)
{
updatedObject = updatedObjectClass.newInstance();
}
this.copyAndOverrideExistedValueFromStringMap(sourceMapModel, updatedObject, classFieldMapping, entityIdentifier);
toMainObjectFieldNameMethod.invoke(updatedObject, mainObject);
this.saveOrUpdateEntity(updatedObject);
return updatedObject;
}
/**
*
* @date 2013-4-17
* 获得要更新对象,如果数据库中没有,则新建一个
* xuyunlong
* @param entityClass
* :主实体对象
* @param propertiesMap
* :属性,值。查找对象
* @return object :返回操作的类
* @throws Exception
*
*/
@Override
public <T> T getNewOrUpdateObject(Class<T> entityClass, Map<String, Object> propertiesMap) throws Exception
{
T obj = null;
if (propertiesMap != null) {
List<T> l = this.findEntityByProperties(entityClass, propertiesMap);
if (l.size() > 0) {
obj = l.get(0);
} else {
obj = entityClass.newInstance();
}
} else {
obj = entityClass.newInstance();
}
return obj;
}
/**
*
* @date 2013-4-17
* 查对实体数量。通过属性Map
* xuyunlong
* @param entityClass
* :主实体对象
* @param propertiesMap
* :属性,值。查找对象
* @return integer :返回操作的类
* @throws Exception
*/
@Override
public <T> Integer getEntityByPropertiesRowCount(Class<T> entityClass, Map<String, Object> propertiesMap)
throws Exception
{
DetachedCriteria criteria = DetachedCriteria.forClass(entityClass);
Set<String> propertiesSet = propertiesMap.keySet();
for (String propertyName : propertiesSet)
{
Object value = propertiesMap.get(propertyName);
criteria.add(Restrictions.eq(propertyName, value));
}
criteria.setProjection(Projections.rowCount());
return (Integer) this.getHibernateTemplate().findByCriteria(criteria).get(0);
}
/**
*
* @date 2013-4-17
* 分页查找
* xuyunlong
* @param entityClass
* :主实体对象
* @param propertiesMap
* :属性,值。查找对象
* @param start
* :开始
* @param limit
* :条数
* @return List
* @throws Exception
*/
@Override
public <T> List<T> findEntityByPropertiesPage(Class<T> entityClass, Map<String, Object> propertiesMap, int start, int limit)
throws Exception
{
DetachedCriteria criteria = DetachedCriteria.forClass(entityClass);
Set<String> propertiesSet = propertiesMap.keySet();
for (String propertyName : propertiesSet)
{
Object value = propertiesMap.get(propertyName);
criteria.add(Restrictions.eq(propertyName, value));
}
return this.getHibernateTemplate().findByCriteria(criteria, start, limit);
}
/**
*
* @date 2013-4-17
* 通过HSQL来查找
* xuyunlong
* @param hsql
* :HSQL语句
* @param values
* :值
* @return List
* @throws Exception
*/
@Override
public <T> List<T> findResultsByHSQL(String hsql, Object... values) throws Exception
{
return this.getHibernateTemplate().find(hsql, values);
}
/**
*
* @date 2013-4-17
* 通过HSQL数量
* xuyunlong
* @param hsql
* :HSQL语句
* @param values
* :值
* @return List
* @throws Exception
*/
@Override
public Integer getResultsByHSQLRowCount(String countHSql, Object... values) throws Exception
{
return (Integer) this.findResultsByHSQL(countHSql, values).get(0);
}
/**
*
* @date 2013-4-17
* 分页查找
* xuyunlong
* @param hsql
* :查询语句
* @param start
* :开始
* @param limit
* :条数
* @param values
* :值
* @return List
*
* @throws Exception
*/
@Override
public <T> List<T> findResultsByHSQLPage(final String hsql, final int start, final int limit, final Object... values)
throws Exception
{
return this.getHibernateTemplate().executeFind(new HibernateCallback<List<Object>>() {
@Override
public List<Object> doInHibernate(Session session)
throws HibernateException, SQLException {
Query queryObject = session.createQuery(hsql);
if (values != null)
{
for (int i = 0; i < values.length; i++)
{
queryObject.setParameter(i, values[i]);
}
}
queryObject.setFirstResult(start);
queryObject.setMaxResults(limit);
return queryObject.list();
}
});
}
@Override
public <T> List<T> findResultsByNamedParamHSQL(String hsql, String[] paramNames, Object[] values) throws Exception
{
return this.getHibernateTemplate().findByNamedParam(hsql, paramNames, values);
}
@Override
public Integer getResultsByNamedParamHSQLRowCount(String countHsql, String[] paramNames, Object[] values)
throws Exception
{
return (Integer) this.getHibernateTemplate().findByNamedParam(countHsql, paramNames, values).get(0);
}
@Override
public <T> List<T> findResultsByNamedParamHSQLPage(final String hsql, final String[] paramNames, final Object[] values,
final int start, final int limit) throws Exception
{
final int paramsLen = paramNames.length;
final int valuesLen = values.length;
Assert.assertEquals(paramsLen, valuesLen);
return this.getHibernateTemplate().executeFind(new HibernateCallback<List<Object>>() {
@Override
public List<Object> doInHibernate(Session session)
throws HibernateException, SQLException {
Query queryObject = session.createQuery(hsql);
if (values != null)
{
for (int i = 0; i < valuesLen; i++)
{
queryObject.setParameter(paramNames[i], values[i]);
}
}
queryObject.setFirstResult(start);
queryObject.setMaxResults(limit);
return queryObject.list();
}
});
}
@Override
public <T> T copyAndOverrideExistedValueFromJSONObject(JSONObject jsonObj, T targetObject,Map<String, String> classFieldMapping, String... entityIdentifier)
throws Exception{
Map<String,String> sourceMapModel = new HashMap<String,String>();
Iterator iterKeys = jsonObj.keys();
while(iterKeys.hasNext()){
String key = iterKeys.next().toString().trim();
String value = StringUtil.nullToString(jsonObj.getString(key)).trim();
sourceMapModel.put(key, value);
}
this.copyAndOverrideExistedValueFromStringMap(sourceMapModel, targetObject, classFieldMapping, entityIdentifier);
return targetObject;
}
@Override
public <T> Collection<T> saveOrUpdateEntitiesByJSONArrayString(Class<T> saveEntityClass,String jsonArrayString,Map<String, String> classFieldMapping, String... entityIdentifier)
throws Exception{
Collection<T> entities = this.getEntitiesByJSONArrayString(saveEntityClass, jsonArrayString, classFieldMapping, entityIdentifier);
this.saveOrUpdateAllEntities(entities);
return entities;
}
public <T> T copyAndOverrideExistedValueFromJSONObject(JSONObject jsonObj, T targetObject, Map<String, String> classFieldMapping,
boolean withUserInfo, String... entityIdentifier) throws Exception {
Map<String, String> sourceMapModel = new HashMap<String, String>();
Iterator iterKeys = jsonObj.keys();
while (iterKeys.hasNext()) {
String key = iterKeys.next().toString().trim();
String value = StringUtil.nullToString(jsonObj.getString(key)).trim();
sourceMapModel.put(key, value);
}
this.copyAndOverrideExistedValueFromStringMap(sourceMapModel, targetObject, classFieldMapping, withUserInfo, entityIdentifier);
return targetObject;
}
public <T> Collection<T> getEntitiesByJSONArrayString(Class<T> saveEntityClass,String jsonArrayString,Map<String, String> classFieldMapping, String... entityIdentifier)
throws Exception{
List<T> c = new ArrayList<T>();
JSONArray jsonArray = new JSONArray(jsonArrayString);
for(int i=0;i<jsonArray.length();i++){
JSONObject jsonObj = jsonArray.getJSONObject(i);
T targetObject = saveEntityClass.newInstance();
this.copyAndOverrideExistedValueFromJSONObject(jsonObj, targetObject, classFieldMapping, entityIdentifier);
c.add(targetObject);
}
return c;
}
/**
*
* @date 2013-4-17
* xuyunlong
* 对象属性值拷贝
* @param sourceObject
* :原对象
* @param targetObject
* :目标对象
* @return Object:目标对象
* @throws Exception
*/
@Override
public <T> T copyAndOverrideExistedValueFromObject(Object sourceObject, T targetObject) throws Exception
{
Map<String, String> sourceMapModel = new HashMap<String, String>();
PropertyDescriptor[] propertyDescriptors_source = BeanUtils.getPropertyDescriptors(sourceObject.getClass());
for (PropertyDescriptor propertyDescriptor_source : propertyDescriptors_source)
{
// 获取读get方法
Method readMethod = propertyDescriptor_source.getReadMethod();
if (null == readMethod)
throw new Exception(sourceObject.getClass().getName() + "中字段 < " + propertyDescriptor_source.getName()
+ " > 不存在read方法");
Class<?> clazz = readMethod.getReturnType();
// 调用(get)方法
Object obj = readMethod.invoke(sourceObject);
Object value = null;
if (clazz.getName().startsWith(("com.business.entity"))) {
if (null != obj) {
value = clazz.getMethod("getId").invoke(obj);
}
} else {
value = obj;
}
System.out.println(propertyDescriptor_source.getName()+":"+
StringUtil.empty2Other(StringUtil.nullToString(value), null));
sourceMapModel.put(propertyDescriptor_source.getName(),
StringUtil.empty2Other(StringUtil.nullToString(value), null));
}
this.copyAndOverrideExistedValueFromStringMap(sourceMapModel, targetObject, null);
return targetObject;
}
/**
*
* @date 2013-4-17
* xuyunlong
* 对象属性值拷贝
* @param sourceObject
* :原对象
* @param targetObject
* :目标对象
* @return Object:目标对象
* @throws Exception
*/
@Override
public <T> T copyAndOverrideExistedValueFromObjectNoSet(Object sourceObject, T targetObject) throws Exception
{
Map<String, String> sourceMapModel = new HashMap<String, String>();
PropertyDescriptor[] propertyDescriptors_source = BeanUtils.getPropertyDescriptors(sourceObject.getClass());
for (PropertyDescriptor propertyDescriptor_source : propertyDescriptors_source)
{
// 获取读get方法
Method readMethod = propertyDescriptor_source.getReadMethod();
if (null == readMethod)
throw new Exception(sourceObject.getClass().getName() + "中字段 < " + propertyDescriptor_source.getName()
+ " > 不存在read方法");
Class<?> clazz = readMethod.getReturnType();
// 调用(get)方法
Object obj = readMethod.invoke(sourceObject);
Object value = null;
if (clazz.getName().indexOf(".entity.")>0) {
if (null != obj) {
value = clazz.getMethod("getId").invoke(obj);
}
} else {
value = obj;
}
if(!clazz.getName().startsWith("java.util.Set")){
sourceMapModel.put(propertyDescriptor_source.getName(),
StringUtil.empty2Other(StringUtil.nullToString(value), null));
}
}
this.copyAndOverrideExistedValueFromStringMap(sourceMapModel, targetObject, null,false);
return targetObject;
}
/**
* @method copyAndOverrideExistedValueFromMap(这里用一句话描述这个方法的作用)
* (这里描述这个方法适用条件 – 可选) 给目标对象赋值,值从MAP中取
* @param sourceMapModel
* :数据源
* @param targetObject
* :目标对象
* @return
* @throws Exception
* @returnType Object
* @exception
* @since 1.0.0
**/
public <T> T copyAndOverrideExistedValueFromMap(Map<String, ? extends Object> sourceMapModel, T targetObject)
throws Exception
{
PropertyDescriptor[] propertyDescriptors_target = BeanUtils.getPropertyDescriptors(targetObject.getClass());
Set<String> overrideFieldsName = sourceMapModel.keySet();
for (String overrideFieldName : overrideFieldsName)
{
for (PropertyDescriptor propertyDescriptor_target : propertyDescriptors_target)
{
String name_target = propertyDescriptor_target.getName();
if (overrideFieldName.equalsIgnoreCase(name_target))
{
Object value = sourceMapModel.get(overrideFieldName);
// 获取写set方法
Method writeMethod = propertyDescriptor_target.getWriteMethod();
// 调用(set)方法
if (null == writeMethod)
break;
try
{
writeMethod.invoke(targetObject, value);
} catch (Exception e)
{
System.out.println("异常字段:" + overrideFieldName);
e.printStackTrace();
throw new Exception("字段【" + overrideFieldName + "】覆写异常");
}
break;
}
}
}
return targetObject;
}
public <T> T copyAndOverrideExistedValueFromStringMap(Map<String,String> sourceMapModel, T targetObject,
Map<String, String> classFieldMapping, String... entityIdentifier) throws Exception {
return copyAndOverrideExistedValueFromStringMap(sourceMapModel, targetObject, classFieldMapping, true, entityIdentifier);
}
/**
*
* @date 2014-10-28
* 更新目标对象的值
* tpf
* @param sourceMapModel
* :数据源
* @param targetObject
* :目标对象
* @param classFieldMapping
* :查找类对象的KEY例<CustInfo,custname>
* @param withUserInfo
* : 是否需要附加用户信息
* @param entityIdentifier
* :map中KEY中标识部份和目标对象相对应
* @return
* @throws Exception
*/
public <T> T copyAndSetValueFromStringMap(Map<String,String> sourceMapModel, T targetObject,
Map<String, String> classFieldMapping, String... entityIdentifier) throws Exception
{
Class targetClass = targetObject.getClass();
String targetClassName = targetClass.getName();
PropertyDescriptor[] propertyDescriptors_target = BeanUtils.getPropertyDescriptors(targetObject.getClass());
Set<String> overrideFieldsName = (Set<String>) sourceMapModel.keySet();
Set<String> notOverrideFieldsName = new HashSet<String>();
StringBuffer sb = new StringBuffer();
if (entityIdentifier.length > 0) {
for (String ei : entityIdentifier)
{
sb.append(ei + ".");
}
}
String entityIdentifierStr = sb.toString();
for (PropertyDescriptor propertyDescriptor_target : propertyDescriptors_target)
{
String name_target = propertyDescriptor_target.getName();
if ("class".equals(name_target))
continue;
Method readMethod = propertyDescriptor_target.getReadMethod();
if(null == readMethod){
if(log.isWarnEnabled()){
log.warn(propertyDescriptor_target.getName());
}
continue;
}
Class<?> targetFieldClass = readMethod.getReturnType();
String targetFieldClassName = targetFieldClass.getName();
boolean isSuccessField = false;
if ("boolean".equals(targetFieldClassName))
{
targetFieldClass = Boolean.class;
}
if ("short".equals(targetFieldClassName))
{
targetFieldClass = Short.class;
}
if ("long".equals(targetFieldClassName))
{
targetFieldClass = Long.class;
}
if ("int".equals(targetFieldClassName))
{
targetFieldClass = Integer.class;
}
if ("float".equals(targetFieldClassName))
{
targetFieldClass = Float.class;
}
if ("double".equals(targetFieldClassName))
{
targetFieldClass = Double.class;
}
targetFieldClassName = targetFieldClass.getName();
// if(!targetFieldClass.isPrimitive())
{
//name_target = (entityIdentifierStr + name_target);
for (String overrideFieldName : overrideFieldsName)
{
overrideFieldName = overrideFieldName.substring(overrideFieldName.indexOf(".")+1, overrideFieldName.length());
if (overrideFieldName.equalsIgnoreCase(name_target))
{
Object valueObj = sourceMapModel.get(overrideFieldName);
if (overrideFieldName.equals(entityIdentifierStr + "id") && (new Integer(0).equals(valueObj))) {
break;
}
String value = StringUtil.nullToString(valueObj);
// 获取写set方法
Method writeMethod = propertyDescriptor_target.getWriteMethod();
// 调用(set)方法
if ((null == writeMethod)) {
writeMethod = targetClass.getMethod(
"set"
+ name_target.replaceFirst(name_target.substring(0, 1), name_target
.substring(0, 1).toUpperCase()), targetFieldClass);
if (null == writeMethod) {
if (log.isErrorEnabled())
{
log.error("类型:" + targetFieldClassName + ",【" + targetClassName + "." + name_target
+ "没有对应的set方法】");
// throw new Exception();
}
break;
}
}
try
{
if (StringUtils.isBlank(value)) {
value = null;
if("position".equalsIgnoreCase(name_target)){
writeMethod.invoke(targetObject, 0);
break;
}
System.out.println("targetObject"+targetObject +"-----value" + value);
writeMethod.invoke(targetObject, value);
isSuccessField = true;
if (log.isWarnEnabled() && ResourceUtil.isDebug())
{
log.warn("【 " + targetObject.getClass().getSimpleName() + "." + name_target
+ " 】被强制赋予了空值");
}
break;
}
Object castValue = null;
// 判断是否为实体
if (EntityUtil.isTenwaEntity(targetFieldClass))
{
try {
String fieldName = null;
if (null != classFieldMapping) {
fieldName = classFieldMapping.get(targetFieldClass.getSimpleName());
}
if (StringUtils.isBlank(fieldName)) {
castValue = this.getHibernateTemplate().get(targetFieldClass,
StringUtil.nullToString(value));
}
else {
Map<String, Object> propertiesMap = new HashMap<String, Object>();
propertiesMap.put(fieldName, StringUtil.nullToString(value));
List l = this.findEntityByProperties(targetFieldClass, propertiesMap);
if (l.size() > 0) {
castValue = l.get(0);
}
}
} catch (Exception e) {
e.printStackTrace();
// if (log.isErrorEnabled())
// {
// log.error("类型:" + targetFieldClassName + ",【" + targetClassName + "."
// + name_target + "的主键类型必须为String】");
// throw new Exception();
// }
}
}
else
{
try {
if (targetFieldClass.isEnum()) {//对Enum类型进行特殊处理
Class<? extends Enum> clazz= (Class<? extends Enum>) targetFieldClass;
castValue = Enum.valueOf(clazz, value.toString());
} else {
if(!"string".equalsIgnoreCase(targetFieldClass.getSimpleName())){
value = StringUtil.nullToString(value).replaceAll(",", "");
}
if (value.getClass().equals(targetFieldClass))
{
castValue = value;
}
else
{
castValue = targetFieldClass.getConstructor(value.getClass())
.newInstance(value);
}
}
} catch (Exception e) {
if (log.isErrorEnabled())
{
log.error("【" + targetObject.getClass() + "." + name_target + "[类型"+targetFieldClass+"],必须具有public("
+ value.getClass() + "){//方法体}】");
System.out.println("【" + targetObject.getClass() + "." + name_target + "[类型"+targetFieldClass+"],必须具有public("
+ value.getClass() + "){//方法体}】");
throw new Exception();
}
}
}
writeMethod.invoke(targetObject, castValue);
isSuccessField = true;
} catch (Exception e)
{
e.printStackTrace();
throw new Exception("name_target:"+name_target);
}
break;
}
}
}
if (!isSuccessField)
notOverrideFieldsName.add(name_target);
}
if (log.isWarnEnabled() && ResourceUtil.isDebug()) {
log.warn("对象【" + targetClassName + "】不能赋值的属性:");
notOverrideFieldsName.remove(entityIdentifierStr + "creator");
notOverrideFieldsName.remove(entityIdentifierStr + "modificator");
notOverrideFieldsName.remove(entityIdentifierStr + "create_date");
notOverrideFieldsName.remove(entityIdentifierStr + "modify_date");
for (String name : notOverrideFieldsName) {
log.warn(">>>>>> " + name);
}
}
User user = null;
boolean isWithUser = true;
try {
user = (User) SecurityUtil.getPrincipal();
} catch (Exception e) {
isWithUser = false;
}
if(isWithUser){
String systemDate = DateUtil.getSystemDateTime();
if (StringUtils.isBlank(StringUtil.nullToString(targetClass.getMethod("getId").invoke(targetObject))))
{
Method creatorMethod = targetClass.getDeclaredMethod("setCreator", User.class);
Method createDateMethod = targetClass.getDeclaredMethod("setCreateDate", String.class);
creatorMethod.invoke(targetObject, user);
createDateMethod.invoke(targetObject, systemDate);
}
else
{
Method modificatorMethod = targetClass.getDeclaredMethod("setModificator", User.class);
Method modifyDateMethod = targetClass.getDeclaredMethod("setModifyDate", String.class);
modificatorMethod.invoke(targetObject, user);
modifyDateMethod.invoke(targetObject, systemDate);
}
}
return targetObject;
}
@Override
public <T> T copyAndOverrideExistedValueFromStringMap(Map<String,String> sourceMapModel, T targetObject,
Map<String, String> classFieldMapping, boolean withUserInfo, String... entityIdentifier) throws Exception
{
Class targetClass = targetObject.getClass();
String targetClassName = targetClass.getName();
PropertyDescriptor[] propertyDescriptors_target = BeanUtils.getPropertyDescriptors(targetObject.getClass());
Set<String> overrideFieldsName = (Set<String>) sourceMapModel.keySet();
Set<String> notOverrideFieldsName = new HashSet<String>();
StringBuffer sb = new StringBuffer();
if (entityIdentifier.length > 0) {
if(entityIdentifier[0]!=""){
for (String ei : entityIdentifier)
{
sb.append(ei + ".");
}
}else{
sb.append("");
}
}
String entityIdentifierStr = sb.toString();
for (PropertyDescriptor propertyDescriptor_target : propertyDescriptors_target)
{
String name_target = propertyDescriptor_target.getName();
if ("class".equals(name_target))
continue;
Method readMethod = propertyDescriptor_target.getReadMethod();
if(null == readMethod){
if(log.isWarnEnabled()){
log.warn(propertyDescriptor_target.getName());
}
continue;
}
Class<?> targetFieldClass = readMethod.getReturnType();
String targetFieldClassName = targetFieldClass.getName();
boolean isSuccessField = false;
if ("boolean".equals(targetFieldClassName))
{
targetFieldClass = Boolean.class;
}
if ("short".equals(targetFieldClassName))
{
targetFieldClass = Short.class;
}
if ("long".equals(targetFieldClassName))
{
targetFieldClass = Long.class;
}
if ("int".equals(targetFieldClassName))
{
targetFieldClass = Integer.class;
}
if ("float".equals(targetFieldClassName))
{
targetFieldClass = Float.class;
}
if ("double".equals(targetFieldClassName))
{
targetFieldClass = Double.class;
}
targetFieldClassName = targetFieldClass.getName();
// if(!targetFieldClass.isPrimitive())
{
name_target = (entityIdentifierStr + name_target);
for (String overrideFieldName : overrideFieldsName)
{
if (overrideFieldName.equalsIgnoreCase(name_target))
{
Object valueObj = sourceMapModel.get(overrideFieldName);
if(null==valueObj)continue;
if (overrideFieldName.equals(entityIdentifierStr + "id") && (new Integer(0).equals(valueObj))) {
break;
}
String value = StringUtil.nullToString(valueObj);
// 获取写set方法
Method writeMethod = propertyDescriptor_target.getWriteMethod();
// 调用(set)方法
if ((null == writeMethod)) {
writeMethod = targetClass.getMethod(
"set"
+ name_target.replaceFirst(name_target.substring(0, 1), name_target
.substring(0, 1).toUpperCase()), targetFieldClass);
if (null == writeMethod) {
if (log.isErrorEnabled())
{
log.error("类型:" + targetFieldClassName + ",【" + targetClassName + "." + name_target
+ "没有对应的set方法】");
// throw new Exception();
}
break;
}
}
try
{
if (StringUtils.isBlank(value)) {
value = null;
if("position".equalsIgnoreCase(name_target)){
writeMethod.invoke(targetObject, 0);
break;
}
writeMethod.invoke(targetObject, value);
isSuccessField = true;
if (log.isWarnEnabled() && ResourceUtil.isDebug())
{
log.warn("【 " + targetObject.getClass().getSimpleName() + "." + name_target
+ " 】被强制赋予了空值");
}
break;
}
Object castValue = null;
// 判断是否为实体
if (EntityUtil.isTenwaEntity(targetFieldClass))
{
try {
String fieldName = null;
if (null != classFieldMapping) {
fieldName = classFieldMapping.get(targetFieldClass.getSimpleName());
}
if (StringUtils.isBlank(fieldName)) {
castValue = this.getHibernateTemplate().get(targetFieldClass, StringUtil.nullToString(value));
}
else {
Map<String, Object> propertiesMap = new HashMap<String, Object>();
if("class java.lang.Long".equals(targetFieldClass.getDeclaredField(fieldName).getType().toString())){
//System.out.println(value);
propertiesMap.put(fieldName, Long.valueOf(value));
}else{
propertiesMap.put(fieldName, StringUtil.nullToString(value));
}
List l = this.findEntityByProperties(targetFieldClass, propertiesMap);
if (l.size() > 0) {
castValue = l.get(0);
}
}
} catch (Exception e) {
e.printStackTrace();
// if (log.isErrorEnabled())
// {
// log.error("类型:" + targetFieldClassName + ",【" + targetClassName + "."
// + name_target + "的主键类型必须为String】");
// throw new Exception();
// }
}
}
else
{
try {
if (targetFieldClass.isEnum()) {//对Enum类型进行特殊处理
Class<? extends Enum> clazz= (Class<? extends Enum>) targetFieldClass;
castValue = Enum.valueOf(clazz, value.toString());
} else {
if(!"string".equalsIgnoreCase(targetFieldClass.getSimpleName())){
value = StringUtil.nullToString(value).replaceAll(",", "");
}
if (value.getClass().equals(targetFieldClass))
{
castValue = value;
}
else
{
castValue = targetFieldClass.getConstructor(value.getClass())
.newInstance(value);
}
}
} catch (Exception e) {
e.printStackTrace();
if (log.isErrorEnabled())
{
log.error("【" + targetObject.getClass() + "." + name_target + "[类型"+targetFieldClass+"],必须具有public("
+ value.getClass() + "){//方法体}】");
System.out.println("【" + targetObject.getClass() + "." + name_target + "[类型"+targetFieldClass+"],必须具有public("
+ value.getClass() + "){//方法体}】");
throw new Exception();
}
}
}
writeMethod.invoke(targetObject, castValue);
isSuccessField = true;
} catch (Exception e)
{
e.printStackTrace();
throw new Exception("name_target:"+name_target);
}
break;
}
}
}
if (!isSuccessField)
notOverrideFieldsName.add(name_target);
}
if (log.isWarnEnabled() && ResourceUtil.isDebug()) {
log.warn("对象【" + targetClassName + "】不能赋值的属性:");
notOverrideFieldsName.remove(entityIdentifierStr + "creator");
notOverrideFieldsName.remove(entityIdentifierStr + "modificator");
notOverrideFieldsName.remove(entityIdentifierStr + "create_date");
notOverrideFieldsName.remove(entityIdentifierStr + "modify_date");
for (String name : notOverrideFieldsName) {
log.warn(">>>>>> " + name);
}
}
if (withUserInfo) {
User user = null;
boolean isWithUser = true;
try {
user = (User) SecurityUtil.getPrincipal();
} catch (Exception e) {
isWithUser = false;
}
if(isWithUser){
String systemDate = DateUtil.getSystemDateTime();
if (StringUtils.isBlank(StringUtil.nullToString(targetClass.getMethod("getId").invoke(targetObject))))
{
Method creatorMethod = targetClass.getDeclaredMethod("setCreator", User.class);
Method createDateMethod = targetClass.getDeclaredMethod("setCreateDate", String.class);
creatorMethod.invoke(targetObject, user);
createDateMethod.invoke(targetObject, systemDate);
}
else
{
Method modificatorMethod = targetClass.getDeclaredMethod("setModificator", User.class);
Method modifyDateMethod = targetClass.getDeclaredMethod("setModifyDate", String.class);
modificatorMethod.invoke(targetObject, user);
modifyDateMethod.invoke(targetObject, systemDate);
}
}
}
return targetObject;
}
/**
*
* @date 2013-4-17
* xuyunlong
* 将Map数据转为JSONObject对象
* @param map
* :
* @param allownNull
* :
* @return JSONObject:
* @throws Exception
*/
@Override
public JSONObject getJsonObjectByParameterMap(Map map, boolean allownNull) throws Exception
{
JSONObject jsonObj = new JSONObject();
for (Object key : map.keySet())
{
String name = StringUtil.nullToString(key);
if (StringUtils.isBlank(name))
continue;
Object value = StringUtil.nullToString(map.get(key));
if (!allownNull && StringUtils.isBlank(StringUtil.nullToString(value)))
{
continue;
}
JSONObject currentObj = new JSONObject();
if (name.indexOf(".") > -1)
{
String[] names = name.split("\\.");
int len = names.length;
for (int i = 0; i < len; i++)
{
String attrName = names[i];
if (0 == i)
{
if (!jsonObj.has(attrName))
{
jsonObj.put(attrName, new JSONObject());
}
currentObj = jsonObj.getJSONObject(attrName);
}
else if ((len - 1) == i)
{
currentObj.put(attrName, value);
}
else
{
if (!currentObj.has(attrName))
{
currentObj.put(attrName, new JSONObject());
}
currentObj = currentObj.getJSONObject(attrName);
}
}
}
else
{
jsonObj.put(name, value);
}
}
return jsonObj;
}
/**
* (non-Javadoc)
*
* @see com.business.dao.BaseDao#updateOneToManyCollections(java.lang.Object, java.lang.String, java.lang.Class, java.lang.String, java.lang.String)
**/
@Override
public <T,V> Collection<V> updateOneToManyCollections(T OneToManyObj,
String OneToManyFieldName, Class<V> ManyToOneObjClass,
String ManyToOneFieldName, String jsonArrayStr, Map<String, String> classFieldMapping,
boolean isRemovedRecord, String... entityIdentifier) throws Exception {
Class OneToManyObjClass = OneToManyObj.getClass();
// 获取onetomany的属性描述
PropertyDescriptor OneToManyPD = BeanUtils.getPropertyDescriptor(OneToManyObjClass, OneToManyFieldName);
// 获取manytoone的属性描述
PropertyDescriptor ManyToOnePD = BeanUtils.getPropertyDescriptor(ManyToOneObjClass, ManyToOneFieldName);
/*
* Field OneToManyField = OneToManyObjClass.getDeclaredField(OneToManyFieldName);
* Class fieldClazz = OneToManyField.getType(); // 得到field的class及类型全路径
* if(fieldClazz.isAssignableFrom(Set.class)) //【2】
* {
* Type fc = OneToManyField.getGenericType(); // 关键的地方,如果是List类型,得到其Generic的类型
* if(fc == null)
* {
* if(log.isErrorEnabled())
* {
* log.error("【字段"+OneToManyField.getName()+"必须使用Collection的泛型获取注入的实际类型】");
* throw new Exception();
* }
* }
* if(fc instanceof ParameterizedType) // 【3】如果是泛型参数的类型
* {
* ParameterizedType pt = (ParameterizedType) fc;
* Class genericClazz = (Class)pt.getActualTypeArguments()[0]; //【4】 得到泛型里的class类型对象。
* System.out.println(genericClazz);
* ManyToOneObjClass = genericClazz;
* ManyToOnePD = BeanUtils.getPropertyDescriptor(ManyToOneObjClass, ManyToOneFieldName);
* }
* }
*/
Set oldOneToManySet = (Set) OneToManyPD.getReadMethod().invoke(OneToManyObj);
Map<String, Object> oldMap = new HashMap<String, Object>();
// 查询出原有的equips
for (Object obj : oldOneToManySet) {
oldMap.put(ManyToOneObjClass.getMethod("getId").invoke(obj).toString(), obj);
}
Map[] newSetMaps = jsonMapper.readValue(jsonArrayStr, Map[].class);
Set<String> updatedIds = new HashSet<String>();
Method creatorMethod = ManyToOneObjClass.getDeclaredMethod("setCreator", User.class);
Method createDateMethod = ManyToOneObjClass.getDeclaredMethod("setCreateDate", String.class);
Method modificatorMethod = ManyToOneObjClass.getDeclaredMethod("setModificator", User.class);
Method modifyDateMethod = ManyToOneObjClass.getDeclaredMethod("setModifyDate", String.class);
User user = (User) SecurityUtil.getPrincipal();
String systemDate = DateUtil.getSystemDateTime();
Set newOneToManySet = new HashSet();
for (int i = 0; i < newSetMaps.length; i++)
{
Object ManyToOneObj = null;
Map sourceMapModel = newSetMaps[i];
boolean isOld = false;
String oldId = StringUtil.nullToString(sourceMapModel.get("id"));
if (oldMap.containsKey(oldId))
{
updatedIds.add(oldId);
ManyToOneObj = oldMap.get(oldId);
isOld = true;
}
else
{
StringBuffer sb = new StringBuffer();
if (entityIdentifier.length > 0) {
for (String ei : entityIdentifier)
{
sb.append(ei + ".");
}
}
sourceMapModel.remove(sb.toString() + "id");
ManyToOneObj = ManyToOneObjClass.newInstance();
}
this.copyAndOverrideExistedValueFromStringMap(sourceMapModel, ManyToOneObj, classFieldMapping,
entityIdentifier);
if (isOld) {
modificatorMethod.invoke(ManyToOneObj, user);
modifyDateMethod.invoke(ManyToOneObj, systemDate);
} else {
creatorMethod.invoke(ManyToOneObj, user);
createDateMethod.invoke(ManyToOneObj, systemDate);
}
ManyToOnePD.getWriteMethod().invoke(ManyToOneObj, OneToManyObj);
newOneToManySet.add(ManyToOneObj);
}
// 删除集合中已经移除的items
for (String oldId : oldMap.keySet())
{
if (!updatedIds.contains(oldId))
{
Object oldObj = oldMap.get(oldId);
if (isRemovedRecord) {
this.removeEntity(oldObj);
} else {
newOneToManySet.add(oldObj);
}
}
}
this.saveOrUpdateAllEntities(newOneToManySet);
return newOneToManySet;
}
@Override
public <T> Map<String, String> getEntityPropertiesToStringMapWithOtherEntityFields(T entity, Map<String, String> fieldClassMapping,Map<String, String> otherEntityFieldsMapping,
String... entityIdentifier) throws Exception
{
JSONObject jsonObj = this.getEntityPropertiesToJsonEntityWithOtherEntityFields(entity, fieldClassMapping, otherEntityFieldsMapping, entityIdentifier);
Map<String, String> StringMap = this.getStringMapByJsonObject(jsonObj);
return StringMap;
}
@Override
public <T> JSONArray getCollectionEntitiesPropertiesToJsonArrayWithOtherEntityFields(Collection<T> entities,
Map<String, String> fieldClassMapping,Map<String,String> otherEntityFieldsMapping, String... entityIdentifier) throws Exception {
JSONArray jsonArray = new JSONArray();
for (Object entity : entities) {
JSONObject jsonEntity = this.getEntityPropertiesToJsonEntityWithOtherEntityFields(entity, fieldClassMapping,otherEntityFieldsMapping, entityIdentifier);
jsonArray.put(jsonEntity);
}
return jsonArray;
}
@Override
public <T> String getCollectionEntitiesPropertiesToJsonArrayStringWithOtherEntityFields(Collection<T> entities,
Map<String, String> fieldClassMapping,Map<String,String> otherEntityFieldsMapping, String... entityIdentifier) throws Exception
{
return this.getCollectionEntitiesPropertiesToJsonArrayWithOtherEntityFields(entities, fieldClassMapping,otherEntityFieldsMapping, entityIdentifier).toString();
}
@Override
public <T> JSONObject getEntityPropertiesToJsonEntityWithOtherEntityFields(T entity, Map<String, String> fieldClassMapping,
Map<String,String> otherEntityFieldsMapping,String... entityIdentifier) throws Exception{
StringBuffer sb = new StringBuffer();
if (entityIdentifier.length > 0) {
for (String ei : entityIdentifier)
{
if(!StringUtil.nullToString(ei).trim().isEmpty()){
sb.append(ei + ".");
}
}
}
JSONObject jsonEntity = this.getEntityPropertiesToJsonEntity(entity, fieldClassMapping, entityIdentifier);
if(null != otherEntityFieldsMapping){
for(String otherFieldsStr : otherEntityFieldsMapping.keySet()){
String otherFieldKeyName = otherEntityFieldsMapping.get(otherFieldsStr);
if(otherFieldsStr.indexOf(".")>-1){
jsonEntity.put(otherFieldKeyName, this.recursionEntityFieldValue(entity, otherFieldsStr));
}
}
}
return jsonEntity;
}
@Override
public Object recursionEntityFieldValue(Object topEntity,String recursionFieldStr) throws Exception{
if(-1 < recursionFieldStr.indexOf(".")){
String[] recursionFieldStrArr = recursionFieldStr.split("\\.");
String parentRecursionField = recursionFieldStrArr[0];
return this.recursionEntityFieldValue(this.recursionEntityFieldValue(topEntity, parentRecursionField), recursionFieldStr.substring(parentRecursionField.length()+1));
}
else{
return BeanUtils.getPropertyDescriptor(topEntity.getClass(), recursionFieldStr).getReadMethod().invoke(topEntity);
}
}
@Override
public <T> JSONObject getEntityPropertiesToJsonEntityWithCase(T entity, Map<String, String> fieldClassMapping,CaseEnum caseFlag,
String... entityIdentifier) throws Exception{
JSONObject jsonEntity = new JSONObject();
StringBuffer sb = new StringBuffer();
if (entityIdentifier.length > 0) {
for (String ei : entityIdentifier)
{
if(!StringUtil.nullToString(ei).trim().isEmpty()){
sb.append(ei + ".");
}
}
}
String prefixStr = sb.toString();
PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(entity.getClass());
for (PropertyDescriptor pd : pds)
{
Method readMethod = pd.getReadMethod();
if (null == readMethod)
continue;
Class<?> returnType = readMethod.getReturnType();
Object returnValue = readMethod.invoke(entity);
if (null != returnValue)
{
String value = "";
if (returnType.isAssignableFrom(Set.class))
{
continue;
}
else if (EntityUtil.isTenwaEntity(returnType))
{
String fieldName = null;
if (null != fieldClassMapping) {
fieldName = fieldClassMapping.get(returnType.getSimpleName());
}
if (StringUtils.isBlank(fieldName)) {
fieldName = "id";
}
Method method = BeanUtils.getPropertyDescriptor(returnType, fieldName).getReadMethod();
//System.out.println("####:"+method.getName()+","+returnValue);
value = StringUtil.nullToString(method.invoke(returnValue));
if(EntityUtil.isTenwaDictDataEntity(returnType)){
String rawName = BeanUtils.getPropertyDescriptor(returnType, "name").getReadMethod().invoke(returnValue).toString();
jsonEntity.put("rawValue_"+prefixStr + pd.getName().toLowerCase(), rawName);
}
if(EntityUtil.isTenwaDictDataEntity(returnType)){
String rawName = BeanUtils.getPropertyDescriptor(returnType, "name").getReadMethod().invoke(returnValue).toString();
jsonEntity.put(prefixStr + pd.getName().toLowerCase()+"name", rawName);
}
if(EntityUtil.isTenwaUserEntity(returnType)){
String rawName = BeanUtils.getPropertyDescriptor(returnType, "realname").getReadMethod().invoke(returnValue).toString();
jsonEntity.put("rawValue_"+prefixStr + pd.getName().toLowerCase(), rawName);
}
if(EntityUtil.isTenwaDepEntity(returnType)){
String rawName = BeanUtils.getPropertyDescriptor(returnType, "name").getReadMethod().invoke(returnValue).toString();
jsonEntity.put("rawValue_"+prefixStr + pd.getName().toLowerCase(), rawName);
}
if(EntityUtil.isTenwaCustEntity(returnType)){
String rawName = BeanUtils.getPropertyDescriptor(returnType, "custName").getReadMethod().invoke(returnValue).toString();
jsonEntity.put(prefixStr + pd.getName().toLowerCase()+"name", rawName);
}
}
else
{
if (returnType.getSimpleName().equalsIgnoreCase("double"))
{
value = MathUtil.decimal((Double) returnValue, 8);
}
else {
value = returnValue.toString();
}
}
String propertyName = pd.getName();
if(null != caseFlag){
switch(caseFlag){
case UPPERCASE :{
propertyName = propertyName.toUpperCase();
break;
}
case LOWERCASE :{
propertyName = propertyName.toLowerCase();
break;
}
case NORMAL :{
break;
}
}
}
jsonEntity.put(prefixStr+propertyName, value);
}
}
return jsonEntity;
}
@Override
public <T> JSONObject getEntityPropertiesToJsonEntity(T entity, Map<String, String> fieldClassMapping,
String... entityIdentifier) throws Exception
{
return this.getEntityPropertiesToJsonEntityWithCase(entity, fieldClassMapping, CaseEnum.LOWERCASE, entityIdentifier);
}
@Override
public Map<String,String> getStringMapByJsonObject(JSONObject jsonObj) throws Exception
{
Map<String, String> propertiesMap = new HashMap<String, String>();
Iterator iter = jsonObj.keys();
while(iter.hasNext()){
String key = (String) iter.next();
String value = StringUtil.nullToString(jsonObj.getString(key));
propertiesMap.put(key, value);
}
return propertiesMap;
}
/**
*
* @date 2013-4-17
* xuyunlong
* 将实体对象转为Map
* @param entity
* :实体对象
* @param fieldClassMapping
* :实体中属性为体类则设置对象关系
* @param entityIdentifier
* @return
* @throws Exception
*/
@Override
public <T> Map<String, String> getEntityPropertiesToStringMap(T entity, Map<String, String> fieldClassMapping,
String... entityIdentifier) throws Exception
{
JSONObject jsonObj = this.getEntityPropertiesToJsonEntity(entity, fieldClassMapping, entityIdentifier);
Map<String, String> StringMap = this.getStringMapByJsonObject(jsonObj);
return StringMap;
}
/**
*
* @date 2013-4-17
* xuyunlong
* 实体集合对象转为JSONO数据
* @param entity
* :实体集合对象
* @param fieldClassMapping
* :实体中属性为体类则设置对象关系
* @param entityIdentifier
* @return
* @throws Exception
*/
@Override
public <T> JSONArray getCollectionEntitiesPropertiesToJsonArray(Collection<T> entities,
Map<String, String> fieldClassMapping, String... entityIdentifier) throws Exception {
JSONArray jsonArray = new JSONArray();
for (Object entity : entities) {
JSONObject jsonEntity = this.getEntityPropertiesToJsonEntity(entity, fieldClassMapping, entityIdentifier);
jsonArray.put(jsonEntity);
}
return jsonArray;
}
@Override
public <T> String getCollectionEntitiesPropertiesToJsonArrayString(Collection<T> entities,
Map<String, String> fieldClassMapping, String... entityIdentifier) throws Exception
{
return this.getCollectionEntitiesPropertiesToJsonArray(entities, fieldClassMapping, entityIdentifier).toString();
}
@Override
public <T> void removeEntityById(Class<T> entityClass, String id) throws Exception {
Object entity = this.findEntityByID(entityClass, id);
this.removeEntity(entity);
}
@Override
public void updateOrderPosition(String tablename, String currentId, String parentId, String currentPosition)
throws Exception
{
String updateSql_self = "";
String updateSql_others = "";
String sql_create_table = "";
String sql_drop_table = "";
String wherePid = "";
String andPid = "";
if (null != parentId) {
wherePid = " where pid_ = '" + parentId + "'";
andPid = " and pid_ = '" + parentId + "'";
}
if ("-1".equals(currentPosition))
{
updateSql_self = " update " + tablename + " set position_ = 1 where id_='" + currentId + "'";
updateSql_others = " update " + tablename
+ " set position_ = ( (case when position_ is null then 0 else position_ end) + 1 ) where id_!='"
+ currentId + "'" + andPid;
}
else if ("999999".equals(currentPosition))
{
String queryMaxPositionSql = "select ((case when max(position_) is null then 0 else max(position_) end)+ 1) as pos from "
+ tablename + wherePid;
if (ResourceUtil.getDBType().indexOf("mysql".toUpperCase()) > -1)
{
sql_create_table = " create table " + tablename + "_temp as " + queryMaxPositionSql;
updateSql_self = " update " + tablename + " set position_ = (select pos from " + tablename
+ "_temp) where id_='" + currentId + "'";
sql_drop_table = " drop table " + tablename + "_temp";
}
else
{
updateSql_self = " update " + tablename + " set position_ = (" + queryMaxPositionSql + ") where id_='"
+ currentId + "'";
}
}
else
{
updateSql_self = " update " + tablename + " set position_ = (" + (currentPosition) + "+1) where id_='"
+ currentId + "'";
updateSql_others = " update " + tablename + " set position_ = (position_ + 1) where position_>"
+ currentPosition + " and id_!='" + currentId + "'" + andPid;
}
if (!"".equals(sql_create_table))
{
this.getJdbcTemplate().execute(sql_create_table);
}
if (!"".equals(updateSql_self))
{
this.getJdbcTemplate().execute(updateSql_self);
}
if (!"".equals(sql_drop_table))
{
this.getJdbcTemplate().execute(sql_drop_table);
}
if (!"".equals(updateSql_others))
{
this.getJdbcTemplate().execute(updateSql_others);
}
}
@Override
public void updateBySql(String sql ,Object... values) throws Exception{
this.getJdbcTemplate().update(sql, values);
}
@Override
public List<Map<String,Object>> queryListBySql( String sql ,Object... values) throws Exception{
return this.getJdbcTemplate().queryForList(sql, values);
}
@Override
public void hisEntityByProcedures(final String fromtablename, final String totablename,
final String condition, Map<String, String> otherproperty,List<String>excludeColumn)
throws Exception {
// String otherconditionkey="his_id";
//String otherconditionvalue="sys_guid()";
String otherkey="";
String othervalue="";
String e_cloumn="";
if(null!=excludeColumn){
for(String column:excludeColumn){
if(!"".equals(e_cloumn)){
e_cloumn+=",";
}
e_cloumn+="'"+column.toLowerCase()+"'";
}
}
if(null!=otherproperty){
for(String key :otherproperty.keySet()){
if(!"".equals(otherkey)){
otherkey+=",";
othervalue+=",";
}
otherkey+=key;
if("id".equals(otherproperty.get(key).toString())){
othervalue+="sys_guid()";
}else{
othervalue+="'"+otherproperty.get(key).toString()+"'";
}
}}
this.callhisEntityProcedures(fromtablename, totablename, condition, otherkey, othervalue, e_cloumn);
}
public void callhisEntityProcedures(final String fromtablename, final String totablename,
final String condition,final String otherPropertityKey,final String otherPropertityValue,final String excludeColumn)throws Exception{
try {
String returnValue = (String) this.getJdbcTemplate().execute(
new CallableStatementCreator() {
public CallableStatement createCallableStatement(Connection con) throws SQLException {
String storedProc = "{call proc_his_table (?,?,?,?,?,?,?)}";// 调用的sql
CallableStatement cs = con.prepareCall(storedProc);
cs.setString(1, fromtablename);// 设置输入参数的值
cs.setString(2, totablename);// 设置输入参数的值
cs.setString(3, condition);// 设置输入参数的值
cs.setString(4, otherPropertityKey);// 设置输入参数的值
cs.setString(5, otherPropertityValue);// 设置输入参数的值
cs.setString(6, excludeColumn);// 设置输入参数的值
cs.registerOutParameter(7,OracleTypes.VARCHAR);// 注册输出参数的类型
return cs;
}
}, new CallableStatementCallback() {
public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
cs.execute();
return cs.getString(7);// 获取输出参数的值
}
});
if(null!=returnValue&&(!"".endsWith(returnValue))){
throw new BusinessException(returnValue);
}
} catch (Exception e) {
throw new BusinessException("his表"+fromtablename+"到"+totablename+"出错 内容:"+e.getMessage());
}
}
@Override
public RedisSerializer<String> getRedisSerializer() throws Exception {
return this.getRedisTemplate().getStringSerializer();
}
@Override
public String getByRedis(final String keyId) throws Exception {
RedisTemplate<String, String> redisTemplate = getRedisTemplate();
return redisTemplate.execute(new RedisCallback<String>() {
@Override
public String doInRedis(RedisConnection connection)
throws DataAccessException {
try {
RedisSerializer<String> serializer = getRedisSerializer();
byte[] key = serializer.serialize(keyId);
byte[] value = connection.get(key);
return serializer.deserialize(value);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
});
}
@Override
public void deleteByRedis(String keyId) throws Exception {
getRedisTemplate().delete(keyId);
}
@Override
public void deleteByRedis(List<String> keyIds) throws Exception {
getRedisTemplate().delete(keyIds);
}
@Override
public void addByRedis(final Map<String, String> valueMap) throws Exception {
if(
!getRedisTemplate().execute(new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection)
throws DataAccessException {
try{
RedisSerializer<String> serializer = getRedisSerializer();
for(String key : valueMap.keySet()){
String value = valueMap.get(key);
byte[]keyByte = serializer.serialize(key);
byte[]valueByte = serializer.serialize(value);
connection.setNX(keyByte, valueByte);
}
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}
})
){
throw new Exception("redis添加数据失败");
}
}
@Override
public Long pushByRedis(String key, List<String> values) throws Exception {
Long pushSize = 0l;
for(String value : values){
pushSize = getRedisTemplate().opsForList().leftPush(key, value);
}
return pushSize;
}
@Override
public String popByRedis(String key) throws Exception {
return getRedisTemplate().opsForList().leftPop(key);
}
@Override
public Long inByRedis(String key, List<String> values) throws Exception {
Long pushSize = 0l;
for(String value : values){
pushSize = getRedisTemplate().opsForList().rightPush(key, value);
}
return pushSize;
}
@Override
public String outByRedis(String key) throws Exception {
return getRedisTemplate().opsForList().rightPop(key);
}
@Override
public String indexForRedisList(String key, long index) throws Exception {
return getRedisTemplate().opsForList().index(key, index);
}
@Override
public Long length(String key) throws Exception {
return getRedisTemplate().opsForList().size(key);
}
@Override
public List<String> rangeForListByRedis(String key, int start, int end)
throws Exception {
return getRedisTemplate().opsForList().range(key, start, end);
}
@Override
public void removeByRedis(String key, long i, String value)
throws Exception {
getRedisTemplate().opsForList().remove(key, i, value);
}
@Override
public void setForRedisList(String key, long index, String value)
throws Exception {
getRedisTemplate().opsForList().set(key, index, value);
}
@Override
public void trimForRedisList(String key, long start, int end)
throws Exception {
getRedisTemplate().opsForList().trim(key, start, end);
}
}
|