一.公共字段自动填充1.问题分析业务表中有公共字段,create_time,create_user,update_time,update_user:设置员工表中和菜品表中的这些字段需要大量的set方法代码冗余不便于后期维护。2.实现思路当修改create_time和create_user这两个字段是对应的Mapper层执行的操作类型是insert当修改update_time和update_user这两个字段是时对应的Mapper层执行的操作类型是insert或者是update。这四个字段的操作时机是不一样的我们目前明确了操作类型对于这些公共的字段我们的设计思路是统一来处理。即AOP,使用切面这种方式处理。假设我们需要执行对Mapper层的插入一条数据那我们可以使用切面拦截这种操作对所需要的公共字段进行赋值。但是我们不需要对持久层的所有方法都进行拦截和处理比如查询和删除的方法就不需要。所以我们需要一个字段或者标记来判断是否需要对方法进行拦截对公共字段进行处理。这里我们引入注解自定义注解AutoFuil来进行标识。同时我们自定义一个切面类AutoFillAspect统一拦截加入了AutoFill注解的方法通过反射为公共字段赋值。因此我们在Mapper方法上加入AutoFill注解。3.代码开发1自定义注解AutoFill和枚举类这里我们自定义注解AutoFill用于标识方法需要进行公共字段填充Target表明注解的应用范围是在方法上Retention表明注解会在运行时保留方便切面读取。OperationType value()用来指定数据库操作类型可以是insert 或 update这个值将在切面中用来判断当前方法是插入操作还是更新操作。。(2)自定义切面类AutoFillAspect首先通过pointcut注解定义了切入点execution会拦截com.sky.mapper包下所有类的所有方法annotation(com.sky.annotation.AutoFill)会拦截Autofill注解标识的所有方法。这里我们使用前置通知的方式对公共字段进行处理在执行数据库操作前自动填充公共字段joinPoint是AOP提供的对象用于访问正在执行的方法的相关信息。可以通过它获取方法签名、参数等。我们使用joinPoint.getSignature()方法返回当前方法的签名信息它包含方法的名字、返回类型、参数等信息将其转换为MethodSignature类型。getMethod()获取当前执行的方法对象getAnnotation(AutoFill.class)获取方法上的AutoFill注解对象autoFill.value()获取注解中的操作类型即数据库操作类型INSERT或UPDATE。joinPoint.getArgs()获取正在执行的方法的参数假设方法的第一个参数是实体对象那么就从arg[]数组中取出这个对象。最后根据操作类型INSERT或UPDATE为字段赋值以插入操作为例子通过反射首先使用getDeclaredMethod获取实体对象中的 setter 方法根据字段名称然后使用invoke方法调用这些方法传入相应的值当前时间和当前用户 ID。(3)在Mapper的方法上加入AutoFill注解4在对应的实现类注释相关内容
苍穹外卖-公共字段填充
一.公共字段自动填充1.问题分析业务表中有公共字段,create_time,create_user,update_time,update_user:设置员工表中和菜品表中的这些字段需要大量的set方法代码冗余不便于后期维护。2.实现思路当修改create_time和create_user这两个字段是对应的Mapper层执行的操作类型是insert当修改update_time和update_user这两个字段是时对应的Mapper层执行的操作类型是insert或者是update。这四个字段的操作时机是不一样的我们目前明确了操作类型对于这些公共的字段我们的设计思路是统一来处理。即AOP,使用切面这种方式处理。假设我们需要执行对Mapper层的插入一条数据那我们可以使用切面拦截这种操作对所需要的公共字段进行赋值。但是我们不需要对持久层的所有方法都进行拦截和处理比如查询和删除的方法就不需要。所以我们需要一个字段或者标记来判断是否需要对方法进行拦截对公共字段进行处理。这里我们引入注解自定义注解AutoFuil来进行标识。同时我们自定义一个切面类AutoFillAspect统一拦截加入了AutoFill注解的方法通过反射为公共字段赋值。因此我们在Mapper方法上加入AutoFill注解。3.代码开发1自定义注解AutoFill和枚举类这里我们自定义注解AutoFill用于标识方法需要进行公共字段填充Target表明注解的应用范围是在方法上Retention表明注解会在运行时保留方便切面读取。OperationType value()用来指定数据库操作类型可以是insert 或 update这个值将在切面中用来判断当前方法是插入操作还是更新操作。。(2)自定义切面类AutoFillAspect首先通过pointcut注解定义了切入点execution会拦截com.sky.mapper包下所有类的所有方法annotation(com.sky.annotation.AutoFill)会拦截Autofill注解标识的所有方法。这里我们使用前置通知的方式对公共字段进行处理在执行数据库操作前自动填充公共字段joinPoint是AOP提供的对象用于访问正在执行的方法的相关信息。可以通过它获取方法签名、参数等。我们使用joinPoint.getSignature()方法返回当前方法的签名信息它包含方法的名字、返回类型、参数等信息将其转换为MethodSignature类型。getMethod()获取当前执行的方法对象getAnnotation(AutoFill.class)获取方法上的AutoFill注解对象autoFill.value()获取注解中的操作类型即数据库操作类型INSERT或UPDATE。joinPoint.getArgs()获取正在执行的方法的参数假设方法的第一个参数是实体对象那么就从arg[]数组中取出这个对象。最后根据操作类型INSERT或UPDATE为字段赋值以插入操作为例子通过反射首先使用getDeclaredMethod获取实体对象中的 setter 方法根据字段名称然后使用invoke方法调用这些方法传入相应的值当前时间和当前用户 ID。(3)在Mapper的方法上加入AutoFill注解4在对应的实现类注释相关内容