当前位置: 首页 > news >正文

网站一个月客户开发软件工具

网站一个月,客户开发软件工具,网站开发技术书籍,佛山建设网站公司哪家好背景介绍 在实际项目开发中,我们经常需要处理一些公共字段的自动填充,比如: createTime (创建时间)updateTime (更新时间)createUser (创建人)updateUser (更新人) 这些字段在每个表中都存在,如果每次都手动设置会很麻烦。下面介绍三种常用的解决方案。 方案一#xff1a;M…背景介绍 在实际项目开发中,我们经常需要处理一些公共字段的自动填充,比如: createTime (创建时间)updateTime (更新时间)createUser (创建人)updateUser (更新人) 这些字段在每个表中都存在,如果每次都手动设置会很麻烦。下面介绍三种常用的解决方案。 方案一MyBatis AOP方式 这种方式通过自定义注解和切面来实现自动填充。 代码实现 添加AOP 和 MyBatis依赖 SpringMVC !-- mybatis-spring -- dependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion3.0.3/version /dependency !-- AOP-spring -- dependencygroupIdorg.springframework/groupIdartifactIdspring-aspects/artifactIdversion6.1.12/version/dependencySpringBoot !--mybatis起步依赖-- dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion3.0.3/version /dependency !-- AOP -- dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId /dependency自定义枚举类 /*** 数据库操作类型*/ public enum OperationType {UPDATE, //更新操作INSERT //插入操作}自定义注解 Target(ElementType.METHOD) // 作用于方法上 Retention(RetentionPolicy.RUNTIME) public interface AutoFill {OperationType value(); // INSERT/UPDATE }切面类实现 Aspect Component Slf4j public class AutoFillAspect {/*** 切入点*/Pointcut(execution(* com.sky.mapper.*.*(..)) annotation(com.sky.annotation.AutoFill))public void autoFillPointcut() {}/*** 前置通知在通知中进行公共字段的赋值*/Before(autoFillPointcut())public void autoFill(JoinPoint joinPoint) throws NoSuchMethodException {log.info(开始公共字段自动填充...);//获取当前被拦截的方法上的数据库操作字段MethodSignature signature (MethodSignature) joinPoint.getSignature(); // 方法签名对象AutoFill autoFill signature.getMethod().getAnnotation(AutoFill.class); // 获取方法上的注解对象OperationType value autoFill.value(); // 获取数据库的操作类型值//获取当前被拦截的方法上的参数 -- 实体对象 默认约定需要自动填充的方法将实体对象放在第一个Object[] args joinPoint.getArgs();if (args null || args.length 0) {return;}Object entity args[0];// 准备赋值的数据LocalDateTime now LocalDateTime.now();Long currentId BaseContext.getCurrentId();// 根据当前不同的操作类型为对应的属性通过反射来赋值if (value OperationType.INSERT){// 为4个公共字段赋值try {Method setCreateTime entity.getClass().getDeclaredMethod(setCreateTime, LocalDateTime.class);Method setCreateUser entity.getClass().getDeclaredMethod(setCreateUser, Long.class);Method setUpdateTime entity.getClass().getDeclaredMethod(setUpdateTime, LocalDateTime.class);Method setUpdateUser entity.getClass().getDeclaredMethod(setUpdateUser, Long.class);// 通过反射为对象属性赋值setCreateTime.invoke(entity, now);setCreateUser.invoke(entity, currentId);setUpdateTime.invoke(entity, now);setUpdateUser.invoke(entity, currentId);} catch (Exception e) {e.printStackTrace();}} else if (value OperationType.UPDATE) {// 为4个公共字段赋值try {Method setUpdateTime entity.getClass().getDeclaredMethod(setUpdateTime, LocalDateTime.class);Method setUpdateUser entity.getClass().getDeclaredMethod(setUpdateUser, Long.class);// 通过反射为对象属性赋值setUpdateTime.invoke(entity, now);setUpdateUser.invoke(entity, currentId);} catch (Exception e) {e.printStackTrace();}}}}定义常量类可选 其中setCreateTime直接硬编码容易出错并且不够优雅可以将其定义为常量类 /*** 公共字段自动填充相关常量*/ public class AutoFillConstant {/*** 实体类中的方法名称*/public static final String SET_CREATE_TIME setCreateTime;public static final String SET_UPDATE_TIME setUpdateTime;public static final String SET_CREATE_USER setCreateUser;public static final String SET_UPDATE_USER setUpdateUser; }在Mapper中对应需要进行公共字段自动填充的方法上加上注解 AutoFill(value OperationType.UPDATE) void update(Category category)AutoFill(value OperationType.INSERT) void insert(Category category)优缺点 优点: 灵活性强,可自定义复杂的填充逻辑可以统一管理所有需要自动填充的字段 缺点: 实现相对复杂需要编写较多代码需要手动添加注解 方案二MyBatis-Plus方式 MyBatis-Plus提供了更简便的实现方式。 代码实现 添加AOP 和 MP依赖 SpringBoot3 !--springboot2整合MybatisPlus-- !--MybatisPlus起步依赖-- dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.3.1/version /dependency!--springboot3整合MybatisPlus-- !--MybatisPlus起步依赖-- dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-spring-boot3-starter/artifactIdversion3.5.5/version /dependency!-- Spring Boot AOP依赖 -- dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId /dependency实现 MetaObjectHandler接口 需要定义一个类需要实现 MetaObjectHandler然后实现里面的 insertFill() 和 updateFill() 方法分别代表在执行插入操作和更新操作时执行对应的方法而方法内部去实现你需要注入的字段的值 Component Slf4j public class MyMetaObjectHandler implements MetaObjectHandler {Overridepublic void insertFill(MetaObject metaObject) {log.info(start insert fill ....);// 设置插入时的字段this.setFieldValByName(createTime, LocalDateTime.now(), metaObject);this.setFieldValByName(updateTime, LocalDateTime.now(), metaObject);this.setFieldValByName(createUser, BaseContext.getCurrentId(), metaObject);this.setFieldValByName(updateUser, BaseContext.getCurrentId(), metaObject);}Overridepublic void updateFill(MetaObject metaObject) {log.info(start update fill ....);// 设置更新时的字段this.setFieldValByName(updateTime, LocalDateTime.now(), metaObject);this.setFieldValByName(updateUser, BaseContext.getCurrentId(), metaObject);} } 实体类字段添加TableField注解 TableField(fill FieldFill.INSERT) // 执行插入时自动填充 private LocalDateTime createTime;TableField(fill FieldFill.INSERT) private Long createUser;TableField(fill FieldFill.INSERT_UPDATE) // 执行插入和更新时自动填充 private LocalDateTime updateTime;TableField(fill FieldFill.INSERT_UPDATE) private Long updateUser;TableField(fill FieldFill.INSERT) 执行插入时自动填充 TableField(fill FieldFill.INSERT_UPDATE) 执行插入和更新时自动填充 还有其他的属性可以根据业务需求自行添加 优缺点 优点: 使用简单,代码量少开箱即用,无需复杂配置与MyBatis-Plus无缝集成 缺点: 填充逻辑相对固定扩展性较差 方案三数据库默认值 直接在数据库表设计时设置默认值。 SQL实现 CREATE TABLE table_name (id bigint NOT NULL AUTO_INCREMENT,create_time datetime DEFAULT CURRENT_TIMESTAMP,update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id) ) ENGINEInnoDB;优缺点 优点: 实现最简单不需要额外代码数据库层面保证字段有值 缺点: 只能处理简单的默认值场景无法获取当前登录用户等业务信息不同数据库实现可能不一样 方案选择建议 对于简单的时间字段(createTime/updateTime): 建议使用数据库默认值可以保证数据的一致性 需要记录操作人等业务字段: 推荐使用MyBatis-Plus方式简单高效,满足大部分需求 有特殊业务逻辑: 考虑使用AOP方式可以实现更复杂的填充逻辑 实际项目中可以组合使用: 时间字段用数据库默认值业务字段用MyBatis-Plus或AOP 总结 三种方案各有优劣,需要根据实际需求选择推荐优先使用MyBatis-Plus方式,简单且功能足够特殊场景再考虑其他方案可以组合使用不同方案,扬长避短
http://www.hkea.cn/news/14397935/

相关文章:

  • 网站建设常用的英文wordpress标题图片
  • 制作介绍的网站模板免费下载沈阳seo公司
  • 在哪个网站做游戏视频好做er图的网站
  • 可信网站代码房房网
  • 对整个网站做词频分析网站入口
  • 腾讯云如何建设网站如何实现网站开发手机验证码
  • 昆明app外包优化网站公司价格是多少钱
  • 北京网站技术开发公司如何推广微信小程序
  • 港巢网站建设网站外链内链怎么做
  • 建设品牌网站的好处代理上海建站公司注册
  • 潼南网站建设wordpress 路由器
  • 这个百度的网站怎么做的php网站中水印怎么做的
  • wordpress diy插件seo技术大师
  • 做一个网站需要多少钱 怎么做响应式网站wordpress摄影
  • 郑州制作网站的基本流程oa系统建设方案
  • 外国人在中国做视频网站网站建设公司推荐互赢网络
  • 广西建设网站网址多少钱网页免费游戏
  • 小企业网站建设服务wordpress跳转指定模板
  • 网站怎么做图片链接wordpress设置新页面跳转
  • 建官方网站的公司个人网站开发的背景
  • 滨海做网站哪家好做seo排名好的公司
  • 网站建设目标 优帮云天津设计公司联系方式
  • 龙岩百度贴吧沈阳关键词优化价格
  • 电子商务网站建设报告怎么写咸阳网站建设方案
  • 中药材网站开发百度智能小程序入口官网
  • 做防水怎么注册网站网络科技公司企业简介
  • 服装网站的建设方案洛阳 网站建设
  • 沙漠风网站建设6郑州知名网站建设服务公司
  • 虚拟主机怎么做网站下载织梦做网站软件
  • 高校校园网站建设项目的要求企业营销型网站seo推广