为什么用dw做的网站打不开,陕西建设网站官方,87网站一起做,舆情分析报告怎么写自定义注释自定义注解指定xml文件模式上一篇文章详细阐述了xml配置文件的各种标签及其含义。其实从标签开始#xff0c;每一个标签都对应一个实体类。context.class对应标签#xff0c;而每一个子标签都对应一个属性#xff1b;如图#xff1a;标签与实体类的对应关系。有了…自定义注释自定义注解指定xml文件模式上一篇文章详细阐述了xml配置文件的各种标签及其含义。其实从标签开始每一个标签都对应一个实体类。context.class对应标签而每一个子标签都对应一个属性如图标签与实体类的对应关系。有了实体类的关系那么自定义起来还不是易如反掌。自定义添加注释以用数据库中字段的注释作为Model属性的注释为例针对注解的标签是,对应的接口实体类是CommentGenerator,该类中封装了针对GetterComment、SetterComment、FieldComment、ClassComment以及xml中的注解这些方法在生成实体类时会通过Context被调用该接口默认有默认的实现类DefaultCommentGenerator。切入点就是该DefaultCommentGenerator:去除原始的Getter、Setter方法的默认注释只要实现addSetterComment、addGetterComment方法返回为空原生注释就不会再生成实现addFieldComment方法(管控Model属性的注释内容)具体如下 Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { StringBuffer sb new StringBuffer(); field.addJavaDocLine(/**); field.addJavaDocLine(*); // 获取表的名称 sb.append(* TableName: introspectedTable.getFullyQualifiedTable() ); //获取该表中属性的名称 sb.append(* ColumnName: introspectedColumn.getActualColumnName() ); sb.append(* ); //该字段的comment 信息 sb.append(* introspectedColumn.getRemarks()); field.addJavaDocLine(sb.toString()); field.addJavaDocLine(*); field.addJavaDocLine(**/); }解释:addFieldComment方法有重载意思是是否标注当前属性对应数据库的那个字段看个人需要选择性实现。IntrospectedTable实体类封装了数据库表对应的原始信息相应的IntrospectedColumn则是封装了表中字段的原始信息所有我们通过该对象获取到字段的注释在添加到实体类的属性上.(我这个地方没有封装源码中是封装了生成所有注释的通用方法实际运用中可统一封装)。MyBatis将java中类、方法、接口、枚举、内部类、内部类枚举抽象成JavaElement对象而Field则是针对类中属性的封装。本人感觉xml文件中的注释多余就实现addComment方法不做任何的实现去除xml中的原生注释自定义注解在目前我们开发中注解使用的非常广发大大简化了我们的开发比如LomBook针对实体类对象各种注解最常用的Data(Setter,Getter)、NoArgsConstructor等。那能否再Model上自动添加上我们需要的注解呢我们知道Spring Boot中Mapper接口对应的注解是Repository注解但原生生成时不会有该注解的那要一个一个类手动添加吗针对以上需求我们详细聊聊PluginAdapter。通过Idea查看该类的结构可以看到该中方法非常之多但可分为clientxxxx相关的方法控制Mapper接口生成规则细粒度到每个能够生成的方法上sqlMapxxxx相关方法控制xml文件生成的方式细粒度到每个能够生成的方法上modelxxxx相关方法控制Model类的生成规则。model类的生成规则有三种所以model相关的方法也是关于三种规则生成时的相关方法针对以上需求我们逐个击破生成的Model上增加Lombook相关的注释继承PluginAdapter类重写modelBaseRecordClassGenerated方法具体如下:Override public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { javaTypes().forEach(item-topLevelClass.addImportedType(item)); addAnnons().forEach(item-topLevelClass.addAnnotation(item)); return super.modelBaseRecordClassGenerated(topLevelClass, introspectedTable); } //注解对应的完整的类路径 private List javaTypes(){ List javaTypes new ArrayList(2); javaTypes.add(new FullyQualifiedJavaType(lombok.Data)); javaTypes.add(new FullyQualifiedJavaType(lombok.NoArgsConstructor)); return javaTypes; } //需要添加的注解 private List addAnnons(){ List annons new ArrayList(2); annons.add(Data); annons.add(NoArgsConstructor); return annons; }通过上面方法在生成Model时会自动添加上相应的注解再比如Spring Boot的Swagger也是通过注解如果返回前端的实体类也是通过Mybatis Generator自动生成那么就可以将ApiModel以及ApiModelProperty注解添加到生成的类中是不是特别的方便xml文件的两种模式在MyBatis生成的xml默认是append的方式比如随着需求版本的迭代数据库中的字段改变对应的实体类以及xml需要重新生成那么默认新生成的xml内容会追加到旧的版本中这时启动项目会报错(resultMap标签重复)所以这时需要将旧的覆盖掉此时我们要干预xml文件的生成方式那么继承PluginAdaptor重写sqlMapGenerated方法。该方法中GeneratedXmlFile参数是封装xml文件的所有属性其中私有属性isMergeable即是否合并的意思默认为false那么我们现在就要改变该属性的值。可惜的是该属性没有公开需要通过反射改变具体如下 Override public boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable) { try { Field field sqlMap.getClass().getDeclaredField(isMergeable); field.setAccessible(true); field.setBoolean(sqlMap, false); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } return true; }在生成时就会覆盖原来的旧文件。那如果自定义的sql也写在该文件那么也会被覆盖目前我实践的解决方案有两种通过版本管理工具控制。比如git,被覆盖掉的方法都会有提示或者能够重新回退到最近的一个版本方法就可以再找回来分两个xml文件同一个Mapper接口对应两个xml一个是自动生成的永远保存自动生成的另外在创建一个自定义的sql语句的xml文件。个人推荐第二种最不易出错。