• MyBatis拦截器:给参数对象属性赋值


      该拦截器的作用:在进行增加、修改等操作时,给数据模型的一些通用操作属性(如:创建人、创建时间、修改人、修改时间等)自动赋值。

      该实现是在DAO层拦截,即存入DB前最后一层。后经分析,不是很合理,改为在service层拦截,用spring AOP来实现了,该代码遂弃用。不过已经测试可用,记录备忘。

      1 package com.development;
      2 
      3 import java.lang.reflect.InvocationTargetException;
      4 import java.util.Date;
      5 import java.util.Map;
      6 import java.util.Properties;
      7 
      8 import org.apache.commons.beanutils.BeanUtils;
      9 import org.apache.ibatis.executor.Executor;
     10 import org.apache.ibatis.mapping.MappedStatement;
     11 import org.apache.ibatis.mapping.SqlCommandType;
     12 import org.apache.ibatis.plugin.Interceptor;
     13 import org.apache.ibatis.plugin.Intercepts;
     14 import org.apache.ibatis.plugin.Invocation;
     15 import org.apache.ibatis.plugin.Plugin;
     16 import org.apache.ibatis.plugin.Signature;
     17 
     18 /**
     19  * 拦截器作用:给各实体对象在增加、修改时,自动添加操作属性信息。
     20  */
     21 @Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class }) })
     22 public class OpeInfoInterceptor implements Interceptor
     23 {
     24 
     25     public Object intercept(Invocation invocation) throws Throwable
     26     {
     27         Object[] args = invocation.getArgs();
     28 
     29         System.out.println("-----------参数拦截---------------------------------------------------");
     30         System.out.println("02 当前线程ID:"+Thread.currentThread().getId());
     31         //遍历处理所有参数,update方法有两个参数,参见Executor类中的update()方法。
     32         for(int i=0;i<args.length;i++)
     33         {
     34             Object arg=args[i];
     35             String className=arg.getClass().getName();
     36             System.out.println(i + " 参数类型:"+className);
     37             
     38             //第一个参数处理。根据它判断是否给“操作属性”赋值。
     39             if(arg instanceof MappedStatement)
     40             {//如果是第一个参数 MappedStatement
     41                 MappedStatement ms = (MappedStatement)arg;
     42                 SqlCommandType sqlCommandType = ms.getSqlCommandType();
     43                 System.out.println("操作类型:"+sqlCommandType);
     44                 if(sqlCommandType == SqlCommandType.INSERT || sqlCommandType==SqlCommandType.UPDATE)
     45                 {//如果是“增加”或“更新”操作,则继续进行默认操作信息赋值。否则,则退出
     46                     continue;
     47                 }
     48                 else
     49                 {
     50                     break;
     51                 }
     52             }
     53             
     54             //第二个参数处理。(只有第二个程序才能跑到这)
     55             if (arg instanceof Map) 
     56             {//如果是map,有两种情况:(1)使用@Param多参数传入,由Mybatis包装成map。(2)原始传入Map
     57                 System.out.println("这是一个包装过的类型!");
     58                 Map map=(Map)arg;
     59                 for (Object obj : map.values()) 
     60                 {  
     61                     setProperty(obj);
     62                 } 
     63             }
     64             else
     65             {//原始参数传入
     66                 setProperty(arg);
     67             }
     68             
     69         }
     70 
     71         return invocation.proceed();
     72 
     73     }
     74     
     75     /**
     76      * 为对象的操作属性赋值
     77      * @param obj
     78      */
     79     private void setProperty(Object obj)
     80     {
     81         try
     82         {
     83             //TODO: 根据需要,将相关属性赋上默认值
     84             BeanUtils.setProperty(obj, "createrUsername", "张三");
     85             BeanUtils.setProperty(obj, "createDT", new Date());
     86         }
     87         catch (IllegalAccessException e)
     88         {
     89             e.printStackTrace();
     90         }
     91         catch (InvocationTargetException e)
     92         {
     93             e.printStackTrace();
     94         }
     95     }
     96 
     97     public Object plugin(Object target)
     98     {
     99         return Plugin.wrap(target, this);
    100     }
    101 
    102     public void setProperties(Properties properties)
    103     {
    104 
    105     }
    106 
    107 }
  • 相关阅读:
    构建调试Linux内核网络代码的环境MenuOS系统
    stm32内存管理
    STM32CubeMx——ADC多通道采集
    STM32CubeMx——串口使用DMA收发数据
    STM32CubeMx——串口收发
    stm32CubeMx+TrueSTUDIO+uc/os-III移植开发(二)
    stm32CubeMx+TrueSTUDIO+uc/os-III移植开发(一)
    STM32F103RCT6移植到STM32F103C8T6注意事项
    关于STM32F103系列从大容量向中容量移植的若干问题
    KEIL软件中编译时出现的Error L6200E: symbol multiply defined ...的解决方法
  • 原文地址:https://www.cnblogs.com/rulian/p/5937426.html
Copyright © 2020-2023  润新知