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 }

时间: 2024-10-04 02:04:27

MyBatis拦截器:给参数对象属性赋值的相关文章

MyBatis拦截器原理探究

前言: MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用.默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClose

Mybatis拦截器介绍及分页插件

1.1    目录 1.1 目录 1.2 前言 1.3 Interceptor接口 1.4 注册拦截器 1.5 Mybatis可拦截的方法 1.6 利用拦截器进行分页 1.2     前言 拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法.Mybatis拦截器设计的一个初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑.打个比方,对于Executor

Mybatis拦截器介绍

拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法.Mybatis拦截器设计的一个初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑.打个比方,对于Executor,Mybatis中有几种实现:BatchExecutor.ReuseExecutor.SimpleExecutor和CachingExecutor.这个时候如果你觉得这几种实现对于Execu

mybatis拦截器实现分页功能的示例讲解

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.Properties; import org.apache.ibatis.executor.parameter.ParameterHandler; import org.apach

Mybatis 拦截器(二)

Mybatis拦截器介绍 拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法.Mybatis拦截器设计的一个初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑.打个比方,对于Executor,Mybatis中有几种实现:BatchExecutor.ReuseExecutor.SimpleExecutor和CachingExecutor.这个时候如果你觉

mybatis拦截器使用

[toc] mybatis拦截器入门 mybatis 拦截器接口Interceptor Interceptor接口,我们通过这个接口可以自定义我们自己的拦截器,从而实现在拦截的时候写上我们自己的一些逻辑.该接口提供了三个方法, 接口介绍: intercept方法: intercept方法是在进行拦截的时候要执行的方法. plugin方法: 该方法是拦截器用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理. setProperties方法: mybatis配置文件中co

Mybatis拦截器源码深度解析

目录: 一. 建立拦截器链1. 创建对象2. 建立配置文件3. 加载拦截器链二. 方法调用解析1. 对请求对象进行拦截器包装2. 执行调用三. 小结 Mybatis拦截器 可以帮助我们在执行sql语句过程中增加插件以实现一些通用的逻辑,比如对查询sql分页.数据权限处理等. 允许使用插件拦截的方法调用包括: - Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

Mybatis拦截器实现分页

本文介绍使用Mybatis拦截器,实现分页:并且在dao层,直接返回自定义的分页对象. 最终dao层结果: public interface ModelMapper { Page<Model> pageByConditions(RowBounds rowBounds, Model record); } 接下来一步一步来实现分页. 一.创建Page对象: public class Page<T> extends PageList<T> { private int page

Mybatis 拦截器实现原理

Mybatis 拦截器实现原理 标签(空格分隔): mybatis 拦截器概述 像springmvc一样,mybatis也提供了拦截器实现,只是他们拦截的对象不同. mybatis给Executor.StatementHandler.ResultSetHandler.ParameterHandler提供了拦截器功能, Executor提供了增删改查的接口. StatementHandler负责处理Mybatis与JDBC之间Statement的交互. ResultSetHandler负责处理St