All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yuweix.tripod.dao.mybatis.CacheableDao Maven / Gradle / Ivy

package com.yuweix.tripod.dao.mybatis;


import javax.persistence.Id;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


/**
 * @author yuwei
 */
public abstract class CacheableDao extends AbstractDao {
	private static final Map, Field> CLASS_PK_FIELD_ID_MAP = new ConcurrentHashMap<>();


	public CacheableDao() {

	}


	@Override
	public T get(PK id) {
		String key = getPkCacheKeyPre() + id;
		T t = getByCacheKey(key);
		if (t != null) {
			return t;
		}

		t = getMapper().selectOneById(id, clz);
		if (t != null) {
			putByCacheKey(key, t);
			return t;
		} else {
			return null;
		}
	}

	public void deleteByIdFromCache(PK id) {
		String key = getPkCacheKeyPre() + id;
		deleteByCacheKey(key);
	}

	protected String getPkCacheKeyPre() {
		String appName = getAppName();
		String str = appName == null || "".equals(appName.trim()) ? "" : "." + appName.trim();
		return "cache" + str + "." + clz.getName() + ".by.pk.";
	}
	protected String getAppName() {
		return null;
	}

	protected abstract T getByCacheKey(String key);
	protected abstract void putByCacheKey(String key, T t);
	protected abstract void deleteByCacheKey(String key);

	private Field getPKField() {
		Field f = CLASS_PK_FIELD_ID_MAP.get(clz);

		if (f == null) {
			Field[] fields = clz.getDeclaredFields();
			for (Field field: fields) {
				field.setAccessible(true);
				Id idAnn = field.getAnnotation(Id.class);
				if (idAnn != null) {
					f = field;
					CLASS_PK_FIELD_ID_MAP.put(clz, field);
					break;
				}
			}
		}
		return f;
	}

	private void handleChange(T t) {
		deleteByIdFromCache(getId(t));
		onchange(t);
	}
	@SuppressWarnings("unchecked")
	private PK getId(T t) {
		PK id = null;
		Field field = getPKField();
		if (field != null) {
			try {
				id = (PK) field.get(t);
			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		}

		if (id == null) {
			throw new RuntimeException("数据异常");
		}
		return id;
	}

	/**
	 * 当参数指定的数据发生变化之后触发的行为
	 * @param t
	 */
	protected abstract void onchange(T t);

	@Override
	public int insert(T t) {
		int n = getMapper().insert(t);
		if (t != null) {
			handleChange(t);
		}
		return n;
	}

	@Override
	public int insertSelective(T t) {
		int n = getMapper().insertSelective(t);
		if (t != null) {
			handleChange(t);
		}
		return n;
	}

	@Override
	public int updateByPrimaryKey(T t) {
		PK id = getId(t);
		T t0 = getMapper().selectOneById(id, clz);

		int n = getMapper().updateByPrimaryKey(t);
		if (t != null) {
			handleChange(t);
		}
		if (t0 != null) {
			handleChange(t0);
		}
		return n;
	}

	@Override
	public int updateByPrimaryKeySelective(T t) {
		PK id = getId(t);
		T t0 = getMapper().selectOneById(id, clz);

		int n = getMapper().updateByPrimaryKeySelective(t);
		if (t != null) {
			handleChange(t);
		}
		if (t0 != null) {
			handleChange(t0);
		}
		return n;
	}

	@Override
	public int delete(T t) {
		int n = getMapper().delete(t);
		if (t != null) {
			handleChange(t);
		}
		return n;
	}

	@Override
	public int deleteByKey(PK id) {
		T t = get(id);
		if (t == null) {
			return 0;
		}
		return delete(t);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy