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

该实现是在DAO层拦截,即存入DB前最后一层。后经分析,不是很合理,改为在service层拦截,用spring AOP来实现了,该代码遂弃用。不过已经测试可用,记录备忘。
package com.development;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
/**
* 拦截器作用:给各实体对象在增加、修改时,自动添加操作属性信息。
*/
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class }) })
public class OpeInfoInterceptor implements Interceptor
{
public Object intercept(Invocation invocation) throws Throwable
{
Object[] args = invocation.getArgs();
System.out.println("-----------参数拦截---------------------------------------------------");
System.out.println("02 当前线程ID:"+Thread.currentThread().getId());
//遍历处理所有参数,update方法有两个参数,参见Executor类中的update()方法。
for(int i=0;i<args.length;i++)
{
Object arg=args[i];
String className=arg.getClass().getName();
System.out.println(i + " 参数类型:"+className);
//第一个参数处理。根据它判断是否给“操作属性”赋值。
if(arg instanceof MappedStatement)
{//如果是第一个参数 MappedStatement
MappedStatement ms = (MappedStatement)arg;
SqlCommandType sqlCommandType = ms.getSqlCommandType();
System.out.println("操作类型:"+sqlCommandType);
if(sqlCommandType == SqlCommandType.INSERT || sqlCommandType==SqlCommandType.UPDATE)
{//如果是“增加”或“更新”操作,则继续进行默认操作信息赋值。否则,则退出
continue;
}
else
{
break;
}
}
//第二个参数处理。(只有第二个程序才能跑到这)
if (arg instanceof Map)
{//如果是map,有两种情况:(1)使用@Param多参数传入,由Mybatis包装成map。(2)原始传入Map
System.out.println("这是一个包装过的类型!");
Map map=(Map)arg;
for (Object obj : map.values())
{
setProperty(obj);
}
}
else
{//原始参数传入
setProperty(arg);
}
}
return invocation.proceed();
}
/**
* 为对象的操作属性赋值
* @param obj
*/
private void setProperty(Object obj)
{
try
{
//TODO: 根据需要,将相关属性赋上默认值
BeanUtils.setProperty(obj, "createrUsername", "张三");
BeanUtils.setProperty(obj, "createDT", new Date());
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
catch (InvocationTargetException e)
{
e.printStackTrace();
}
}
public Object plugin(Object target)
{
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties)
{
}
}
以上这篇MyBatis拦截器:给参数对象属性赋值的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# mybatis拦截器
# mybatis 拦截器添加参数的实现
# 第一个
# 第二个
# 给大家
# 拦截器
# 是在
# 遍历
# 不是很
# 这是一个
# 跑到
# 希望能
# 这篇
# 有两种
# 小编
# 大家多多
# 默认值
# 后经
# 类中
# 判断是否
# 实现了
# 有两个
相关文章:
中山网站制作网页,中山新生登记系统登记流程?
建站主机选哪家性价比最高?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
建站之星如何开启自定义404页面避免用户流失?
建站之星导航配置指南:自助建站与SEO优化全解析
C++如何编写函数模板?(泛型编程入门)
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
大型企业网站制作流程,做网站需要注册公司吗?
制作宣传网站的软件,小红书可以宣传网站吗?
微信h5制作网站有哪些,免费微信H5页面制作工具?
建站之星备案是否影响网站上线时间?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
如何快速搭建个人网站并优化SEO?
小型网站制作HTML,*游戏网站怎么搭建?
建站主机与虚拟主机有何区别?如何选择最优方案?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
淘宝制作网站有哪些,淘宝网官网主页?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
广州营销型建站服务商推荐:技术优势与SEO优化解析
电商网站制作公司有哪些,1688网是什么意思?
如何快速搭建高效服务器建站系统?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何高效利用亚马逊云主机搭建企业网站?
制作网站的软件免费下载,免费制作app哪个平台好?
如何通过虚拟主机快速完成网站搭建?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
如何选择CMS系统实现快速建站与SEO优化?
建站主机选择指南:服务器配置与SEO优化实战技巧
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
Bpmn 2.0的XML文件怎么画流程图
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
寿县云建站:智能SEO优化与多行业模板快速上线指南
建站主机数据库如何配置才能提升网站性能?
免费网站制作appp,免费制作app哪个平台好?
郑州企业网站制作公司,郑州招聘网站有哪些?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
制作网站的模板软件,网站怎么建设?
如何快速搭建高效可靠的建站解决方案?
网站制作需要会哪些技术,建立一个网站要花费多少?
如何获取上海专业网站定制建站电话?
常州自助建站工具推荐:低成本搭建与模板选择技巧
Python路径拼接规范_跨平台处理说明【指导】
nginx修改上传文件大小限制的方法
建站之星会员如何解锁更多建站功能?
*请认真填写需求信息,我们会在24小时内与您取得联系。