NutzCN Logo
精华 拦截dao,怎么给insert、update类型的操作自动设置更新时间字段
发布于 1828天前 作者 qq_93105859 2364 次浏览 复制 上一个帖子 下一个帖子
标签:

如题,当更新的pojo中含有更新时间的字段时,拦截后自动给该值赋值,我自己写了个拦截器,但是写不动了,不知道怎么给字段赋值。

@Override
	public void filter(DaoInterceptorChain chain) throws DaoException {
		DaoStatement st = chain.getDaoStatement();
		if (st instanceof NutPojo) {
			Entity<?> et = st.getEntity();
			MappingField field = et.getField("rts");
			field.setValue(field, 1234);//这样写会报错
			Class<? extends Entity> clazz = et.getClass();
			if (st.isUpdate()) {
				logger.debug("拦截到update操作。");
			} else if (st.isInsert()) {
				// 新增操作
				logger.debug("拦截到insert操作。");
			}
		} else {
			
		}
		chain.doChain();// 继续下一个拦截器执行
	}
17 回复

这句代码是没用的,忘删了

Class<? extends Entity> clazz = et.getClass();
    @Column
    @Comment("操作时间")
    @Prev(els = @EL("$me.now()"))
    //Long不要用ColDefine定义,兼容oracle/mysql,支持2038年以后的时间戳
    private Long opAt;

    public Long now() {
        return Times.getTS();
    }

@Wizzercn 请问Date类型要怎么弄呢

@Wizzercn 这个注解可能满足不了需求,因为有的字段是在新增操作的时候,有的字段是在更新操作的时候,而且有Date类型

    @Column
    @Comment("操作时间")
    @Prev(els = @EL("$me.nowDate()"))
    private Date opAt;

    public Date nowDate() {
        return new Date();
    }

Date好办,,update 好像没有现成的注解

@Wizzercn 是的,所以我做了dao的拦截,想在拦截里面来处理这个业务,但是卡住了,不知道怎么给pojo对应的字段赋值。有什么办法吗?

((NutPojo)st).getOperatingObject();

完整代码如下,方便同问者参考

public class UpdateDaoInterceptor implements DaoInterceptor {
	private Logger logger = Logger.getLogger(getClass());

	@Override
	public void filter(DaoInterceptorChain chain) throws DaoException {
		DaoStatement st = chain.getDaoStatement();
		if (st instanceof NutPojo) {
			// 如果是dao.insert(user)之类的操作,会进入这个分支
			// 获取当前操作的对象
			Object obj = ((NutPojo) st).getOperatingObject();
			// 操作对象为null的时候跳过此拦截器
			if (obj == null) {
				chain.doChain();
				return;
			}
			String methodRts = "setRts";
			Method rtsMethod = hasMethod(obj, methodRts);
			try {
				if (rtsMethod != null)
					rtsMethod.invoke(obj, DateUtils.getTimeMillis());
				if (st.isUpdate()) {
					// 更新操作
					logger.debug("拦截到update操作。");
					String modifyTime = "setModifyTime";
					Method modifyTimeMethod = hasMethod(obj, modifyTime);
					if (modifyTimeMethod != null)
						modifyTimeMethod.invoke(obj, DateUtils.date());
				} else if (st.isInsert()) {
					// 新增操作
					logger.debug("拦截到insert操作。");
					String createTime = "setCreateTime";
					Method createTimeMethod = hasMethod(obj, createTime);
					if (createTimeMethod != null)
						createTimeMethod.invoke(obj, DateUtils.date());
				}
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			}
		} else {
			// 如果是自定义SQL,会进入这个分支
		}
		chain.doChain();// 继续下一个拦截器执行
	}

	private Method hasMethod(Object obj, String methodName) {
		Class<? extends Object> clas = obj.getClass();
		Method[] methods = clas.getDeclaredMethods();
		if (methods != null && methods.length > 0) {
			for (Method m : methods) {
				String mName = m.getName();
				if (methodName.equals(mName)) {
					return m;
				}
			}
		}
		return null;
	}

}

@wendal 对了,如果我想在这个地方再自动拼接一个条件应该怎么做呢?

比如:在update的时候我要多加一个时间戳是否等于取出来的值的条件。

很好很强大

@wendal 应该也可以做到,只是我不知道怎么去拼接这个条件。

这么做我只是为了防止重复提交和脏数据

额, 貌似不好弄

@qq_93105859 你是防止某时间内多次提交么?

@Rekoe 我在表里面弄了个时间戳字段,每次更新会比对之前取出来的时间戳值与数据库里值是否相等,所以我想在每个更新操作的时候自动增加一个条件:

and rts = 操作前查询出来的时间戳
添加回复
请先登陆
回到顶部