zoukankan      html  css  js  c++  java
  • MyBatis拦截器:给参数对象属性赋值

    复制代码
      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 }
    复制代码
  • 相关阅读:
    Uva 11806 拉拉队 二进制+容斥原理 经典!
    CSU CHESS
    hdu 4049 Tourism Planning 状态压缩dp
    HDOJ 4661: Message Passing(找递推公式+逆元)
    HDU
    hdu4647(思路啊!)
    spoj 370. Ones and zeros(搜索+同余剪枝+链表存数(可能越界LL))
    URAL
    URAL
    hdu4614 (二分线段树)
  • 原文地址:https://www.cnblogs.com/zhaodahai/p/6824252.html
Copyright © 2011-2022 走看看