Mybatis自动插入时间的插件

一般数据库的表结构都会有create_date和update_date两个列,分别表示当前行的插入时间和修改时间,因为这两个字段基本与业务没有太大关联,因此开发过程中经常会忘记设置这两个字段的值,本插件就是来解决这个问题。


1. 使用方式:在mybatis配置文件中加入如下配置,就完成了。


   
       
       
   


2. 对插件配置的说明:

create_date和update_date代表数据库表中的创建时间和更新时间,这两个可以只配置一个,也可以两个都配置。
如果两个都不配置,则相当于插件不起作用。


3. 效果:

之前:insert into smart_user(id, name, password, version)values(?, ?, ?, ?)
之后:INSERT INTO smart_user (id, name, password, version, create_date) VALUES (?, ?, ?, ?, {ts '2016-06-23 15:01:05.55'})


之前:update smart_user set version = ? where id = ?
之后:UPDATE smart_user SET version = ?, update_date = '016-06-23 15:01:5' WHERE id = ?

【注】可支持批量的insert和update


github地址:https://github.com/xjs1919/autodate

----------

项目中一般不光有时间这些字段,还有可能有别的共通字段:loginName,userId。在插入的时候自动插入当前的用户的登陆名和用户id,更新的时候同样自动插入当前的用户名和用户id。可以把这一部分也完全都抽取出来。

(1)写一个AOP,拦截Mapper的insert和update方法,往参数中注入当前的用户信息。当然这里就要求mapper的方法命名必须要遵循insert和update这样的规则。

(2)写一个mybatis插件,修改insert和update语句。

这样就做到了对开发人员完全的透明。

AOP:

@Aspect
@Component
public class CommonDataInject {

    private static Log logger = LogFactory.getLog(CommonDataInject.class);

    @Pointcut("execution(* com.chrhc.projects..*.mapper.*Mapper.insert*(..))")
    private void insertCutMethod() {
    }

    @Pointcut("execution(* com.chrhc.projects..*.mapper.*Mapper.update*(..))")
    private void updateCutMethod() {
    }

    @Around("insertCutMethod()")
    public Object doInsertAround(ProceedingJoinPoint pjp) throws Throwable {
        Object[] args = pjp.getArgs();
        for (Object arg : args) {
            logger.debug("[insert]"+arg);
        }
        Object o = pjp.proceed();
        return o;
    }

    @Around("updateCutMethod()")
    public Object doupdateAround(ProceedingJoinPoint pjp) throws Throwable {
        Object[] args = pjp.getArgs();
        for (Object arg : args) {
            logger.debug("[update]"+arg);
		}
        Object o = pjp.proceed();
        return o;
    }
}

你可能感兴趣的:(java)