您的位置:首页 > 编程语言 > Java开发

mysql数据库数据改变监控 触发器 游标 new. old. java监控比对 最终是在后端java进行比对

2016-06-24 11:22 387 查看
最近有了这样一个需求,就是数据改变项,需要进行突出显示,而这就涉及到一个数据比对的问题,在网上搜了一下解决方案,没有明确的方案,大致上也只有两种:
一种通过数据库来进行处理,暂时以mysql为例子
一种后台代码实现
先说一下数据库的思路,最后没有成功:
设计到数据的前后改变,我想大多数的朋友也都会想到是触发器trigger;另一种数据库的方式就是读取mysql的操作日志如
当然任何一款数据库均会有操作日志,比如oracle会进行数据的归档的日志等。
由于操作日志比较复杂,而且不容易读取操作,往往会有偏差,因此在这里说一下触发器的思路:
首先创建触发器,另外由于表的字段数有1000列,因此无法通过常规的new.column != old.column的常规思路去做,忒繁琐,估计要写到2020年,维护也比较繁琐,只能去考虑数据库字段的循环遍历,因此使用了mysql自由的这样一个表去做,sql如下

SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE table_name = 'one';


通过游标的形式进行字段的循环到一个变量中, 然后用new.variable,old.variable,这个时间报错,提示没有这个字段,也是正常的,然后就去找mysql是否有另外一种机制,比如相应的符号,来特殊的指定到变量上,当引用的时间,不是操作的变量,这样就可以进行循环遍历,可以最后愣是没有找到类似的解决方案,所以只能放弃,但愿有一天会可以使用。

再说一下后台代码实现:

后台代码相当于是一个两个model的比对,由于是一个常用的功能,我进行了功能的抽象,使用了主要的知识点是映射的概念,见如下代码:

<pre name="code" class="java">public static List<String> getDisffField(Object o1, Object o2) throws InstantiationException, IllegalAccessException, IntrospectionException, IllegalArgumentException, InvocationTargetException {

List<String> l = new ArrayList<String>();
Field fArr[] = o1.getClass().getDeclaredFields();

for(Field f : fArr) {
String fieldName = f.getName();
PropertyDescriptor pd = new PropertyDescriptor(fieldName, o1.getClass());
Method getM = pd.getReadMethod();
Object fieldO1 = getM.invoke(o1);
Object fieldO2 = getM.invoke(o2);

if(!(fieldO1+"").equals(fieldO2+"")) {
l.add(fieldName);
}
}
return l;
}



最后会将不一致的列名进行一个返回,这样就可以进行业务的实际开发了,大体就是这个 样子
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息