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

网站建设技术公司柳州网站建设33

网站建设技术公司,柳州网站建设33,环球资源网站什么时候做的,烟台城发建设集团网站文章目录背景方案一使用方案二方案二原理介绍背景 如果仅仅只是标题所列的目标#xff0c;那么mybatis-plus 中可以通过设置 mybatis-plus.global-config.db-config.field-strategyignored 来忽略null判断#xff0c;达到实体字段为null时也可以更新数据为null 但是一旦使用… 文章目录背景方案一使用方案二方案二原理介绍背景 如果仅仅只是标题所列的目标那么mybatis-plus 中可以通过设置 mybatis-plus.global-config.db-config.field-strategyignored 来忽略null判断达到实体字段为null时也可以更新数据为null 但是一旦使用了这个策略就相当于所有业务代码都会按照这个策略执行。 但是我们的业务往往需要如下支持 1、支持null字段全部更新 2、支持非null更新 3、支持指定null字段更新 所以单独设置某一个策略是很难满足实际的业务场景因此我们需要在写具体业务代码的时候能够根据需要选择合适的方式。 mybatis-plus字段的四种策略 default 默认的,一般只用于注解里 在全局里代表 NOT_NULL在注解里代表 跟随全局 ignored 忽略判断not_empty 非空判断not_null 非NULL判断 这四种策略既可以配置全局也可以在实体的注解上配置但是配置之后就是死的玩意无法动态。 一般默认情况下都是not_null如果此时要更新为null那么用lambdaUpdateWrapper手动设置哪些字段需要更新为null 如将userName字段更新为null userService.update(Wrappers.lambdaUpdate(user).set(User::getUserName, null).eq(User::getId,0001));很显然字段较少时这个方案还能说的过去但是我们既有很少字段的情况也有大批量字段的情况 所以此时使用这种方案很明显的使用起来非常难受那么有没有方案既能支持有值更新又能支持指定更新还能 支持全量更新呢 答案是有的提供一个最低成本的适配方案如下 方案一 全局设置字段策略为not_null 因为本身LambdaUpdateWrapper 已经满足了单个设置的需求所以我们在写个方法把全部字段组装起来即可 当然此处的全部字段肯定也不是真的全部字段比如一些比较特别的字段就不能被更新为null 公共的字段创建时间更新时间逻辑删除字段等等。 public class WrappersFactory {private final static ListString ignoreList new ArrayList();static {ignoreList.add(CommonField.available);ignoreList.add(CommonField.create_time);ignoreList.add(CommonField.create_username);ignoreList.add(CommonField.update_time);ignoreList.add(CommonField.update_username);ignoreList.add(CommonField.create_user_code);ignoreList.add(CommonField.update_user_code);ignoreList.add(CommonField.deleted);}public static T LambdaUpdateWrapperT updateWithNullField(T entity) {UpdateWrapperT updateWrapper new UpdateWrapper();ListField allFields TableInfoHelper.getAllFields(entity.getClass());MetaObject metaObject SystemMetaObject.forObject(entity);for (Field field : allFields) {if (!ignoreList.contains(field.getName())) {Object value metaObject.getValue(field.getName());updateWrapper.set(StringUtils.camelToUnderline(field.getName()), value);}}return updateWrapper.lambda();}}使用 userService.update(WrappersFactory.updateWithNullField(user).eq(User::getId,0001));方案二 此方案采用的是常规的mybatis-plus扩展 实际就是实现 IsqlInjector 定义个方法 public class UpdateWithNull extends AbstractMethod {Overridepublic MappedStatement injectMappedStatement(Class? mapperClass, Class? modelClass, TableInfo tableInfo) {//具体的字段逻辑在这里处理,实际上就是在这里构造一个新的statementreturn null;} }定义个CommonMapper继承自BaseMapper然后让你的所有Mapper继承自CommonMapper public interface CommonMapper T extends BaseMapperT {/*** 根据 whereEntity 条件更新记录** param entity 实体对象 (set 条件值,可以为 null)* param updateWrapper 实体对象封装操作类可以为 null,里面的 entity 用于生成 where 语句*/int updateWithNull(Param(Constants.ENTITY) T entity, Param(Constants.WRAPPER) WrapperT updateWrapper);} 声明一个IsqlInjector然后将其配置为spring的bean即可 public class CustomSqlInjector extends AbstractSqlInjector {Overridepublic ListAbstractMethod getMethodList() {return Stream.of(new Insert(),new Delete(),new DeleteByMap(),new DeleteById(),new DeleteBatchByIds(),new Update(),new UpdateWithNull(),new UpdateById(),new SelectById(),new SelectBatchByIds(),new SelectByMap(),new SelectOne(),new SelectCount(),new SelectMaps(),new SelectMapsPage(),new SelectObjs(),new SelectList(),new SelectPage()).collect(toList());} } 方案二个人认为没有什么必要这种扩展方式是为了增加一些mybatis-plus未支持的定式需求。而我们的目标相对简单所以使用方案一更高效。 方案二原理介绍 TableFieldInfo#getSqlSet public String getSqlSet(final String prefix) {final String newPrefix prefix null ? EMPTY : prefix;// 默认: columnString sqlSet column EQUALS;if (StringUtils.isNotEmpty(update)) {sqlSet String.format(update, column);} else {sqlSet SqlScriptUtils.safeParam(newPrefix el);}sqlSet COMMA;if (fieldFill FieldFill.UPDATE || fieldFill FieldFill.INSERT_UPDATE) {// 不进行 if 包裹return sqlSet;}return convertIf(sqlSet, newPrefix property);}可以看到这段代码的逻辑中有一行fieldFill判断为update或者insert_update时不进行if包裹。我们能可以利用这个特性。直接将需要的非公共字段全部设置为FieldFill.UPDATE即可。 final ListTableFieldInfo fieldList tableInfo.getFieldList();for (final TableFieldInfo tableFieldInfo : fieldList) {final Class? extends TableFieldInfo aClass tableFieldInfo.getClass();try {final Field fieldFill aClass.getDeclaredField(fieldFill);fieldFill.setAccessible(true);fieldFill.set(tableFieldInfo, FieldFill.UPDATE);} catch (final NoSuchFieldException e) {log.error(获取fieldFill失败, e);} catch (final IllegalAccessException e) {log.error(设置fieldFill失败, e);}}所以这里的具体逻辑为 Slf4j public class UpdateWithNull extends AbstractMethod {Overridepublic MappedStatement injectMappedStatement(Class? mapperClass, Class? modelClass, TableInfo tableInfo) {SqlMethod sqlMethod SqlMethod.UPDATE;final ListTableFieldInfo fieldList tableInfo.getFieldList();for (final TableFieldInfo tableFieldInfo : fieldList) {final Class? extends TableFieldInfo aClass tableFieldInfo.getClass();try {final Field fieldFill aClass.getDeclaredField(fieldFill);fieldFill.setAccessible(true);fieldFill.set(tableFieldInfo, FieldFill.UPDATE);} catch (final NoSuchFieldException e) {log.error(获取fieldFill失败, e);} catch (final IllegalAccessException e) {log.error(设置fieldFill失败, e);}}String sql String.format(sqlMethod.getSql(), tableInfo.getTableName(),sqlSet(true, true, tableInfo, true, ENTITY, ENTITY_DOT),sqlWhereEntityWrapper(true, tableInfo));SqlSource sqlSource languageDriver.createSqlSource(configuration, sql, modelClass);return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);} }
http://www.hkea.cn/news/14263274/

相关文章:

  • 小程序企业网站源码网站设计风格有几种
  • 天津设计师网站建筑工程公司需要什么资质
  • 网站举报网页设计模板设计
  • 关于学校的网站模板免费下载学校网站建设报价是多少
  • 建行网站企业网银阿里巴巴跨境电商平台
  • 医学网站建设方案中国建设摩托车
  • 三河网站seo为网站做seo需要什么
  • 大型门户网站是这样炼成的源代码加强文明网站内容建设
  • 绵阳 网站开发 公司网站插件代码
  • 北京网站建设z亿玛酷1专注网站设计联盟
  • 个人做房产网站t天津建设工程信息网
  • 做邮箱网站青岛网络营销网络推广介绍
  • 地方志网站建设自查报告wordpress 语言文件
  • 电影网站开发需要多少钱wordpress nextapp
  • 网站什么时候恢复彩色wordpress 网上商城
  • 专业网站设计制作怎么弄自己的小程序
  • 企业集团网站源码重庆网站建设招聘
  • 厦门小羽佳网站建设开发初学者网站建设
  • 网站 设计案例石家庄做网站排名公司哪家好
  • 微信服务号可以做万网站么公交车网站怎么做留言板
  • 网站开发项目技能比赛获奖报道wordpress 页脚插件
  • 会员网站模板建设网站所需要的基础知识
  • 怎么在社保网站上做员工减少电影资源分享网站怎么做的
  • chokstick wordpress泰州整站优化
  • 公司网站建设需要要求什么wordpress用户名怎么设置
  • wordpress 读取数据库wordpress视频优化
  • 30个免费货源网站海淀网站开发公司
  • dedecms 音乐网站模板加快公司网站建设
  • p2p理财网站开发框架建立网站的基本过程
  • 建设网站备案不通过怎么办有专做高端折扣女装的网站吗