实体类注解

这部分属于 mybatis-mapper/provider 核心部分提供的基础注解,可以直接配合 mapper 使用。

3.1 注解方法介绍

注解提供了大量的配置属性,详细介绍看代码注释:

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target({ElementType.TYPE, ElementType.METHOD})
  3. public @interface Entity {
  4. /**
  5. * 对应实体类
  6. */
  7. Class<?> value();
  8. /**
  9. * 表名
  10. */
  11. @Retention(RetentionPolicy.RUNTIME)
  12. @Target(ElementType.TYPE)
  13. @interface Table {
  14. /**
  15. * 表名,默认空时使用对象名(不进行任何转换)
  16. */
  17. String value() default "";
  18. /**
  19. * 备注,仅用于在注解上展示,不用于任何其他处理
  20. */
  21. String remark() default "";
  22. /**
  23. * 使用指定的 <resultMap>
  24. */
  25. String resultMap() default "";
  26. /**
  27. * 自动根据字段生成 <resultMap>
  28. */
  29. boolean autoResultMap() default false;
  30. /**
  31. * 属性配置
  32. */
  33. Prop[] props() default {};
  34. }
  35. /**
  36. * 属性配置
  37. */
  38. @interface Prop {
  39. /**
  40. * 属性名
  41. */
  42. String name();
  43. /**
  44. * 属性值
  45. */
  46. String value();
  47. /**
  48. * 属性值类型,支持 String, Integer, Long, Boolean, Double, Float 六种类型
  49. */
  50. Class type() default String.class;
  51. }
  52. /**
  53. * 列名
  54. */
  55. @Retention(RetentionPolicy.RUNTIME)
  56. @Target(ElementType.FIELD)
  57. @interface Column {
  58. /**
  59. * 列名,默认空时使用字段名(不进行任何转换)
  60. */
  61. String value() default "";
  62. /**
  63. * 备注,仅用于在注解上展示,不用于任何其他处理
  64. */
  65. String remark() default "";
  66. /**
  67. * 标记字段是否为主键字段
  68. */
  69. boolean id() default false;
  70. /**
  71. * 排序方式,默认空时不作为排序字段,只有手动设置 ASC 和 DESC 才有效
  72. */
  73. String orderBy() default "";
  74. /**
  75. * 可查询
  76. */
  77. boolean selectable() default true;
  78. /**
  79. * 可插入
  80. */
  81. boolean insertable() default true;
  82. /**
  83. * 可更新
  84. */
  85. boolean updatable() default true;
  86. /**
  87. * 数据库类型 {, jdbcType=VARCHAR}
  88. */
  89. JdbcType jdbcType() default JdbcType.UNDEFINED;
  90. /**
  91. * 类型处理器 {, typeHandler=XXTypeHandler}
  92. */
  93. Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class;
  94. /**
  95. * 小数位数 {, numericScale=2}
  96. */
  97. String numericScale() default "";
  98. /**
  99. * 属性配置
  100. */
  101. Prop[] props() default {};
  102. }
  103. }

3.2 @Entity.Table 注解

这个注解除了可以设置表名外,还有下面几个属性:

  • remark:备注,仅用于在注解上展示,不用于任何其他处理
  • resultMap:使用指定的 <resultMap>
  • autoResultMap:自动根据字段生成 <resultMap>
  • props: 属性配置,没有明确的作用,实体类上的配置信息会写入 EntityTable.props

备注只是展示,没有真正的作用。真正有用的是后两个字段,通过 resultMap 可以指定在其他地方定义好的 <resultMap>, 可以直接在 XML 中定义好,这里直接使用。autoResultMapresultMap 相反,但功能相同, 这个配置会自动根据当前字段的配置生成 <resultMap>,所有查询方法都会使用生成的 <resultMap>, 这样就能支持查询结果中的 jdbcTypeTypeHandler 等配置的应用。

这部分的示例如下:

  1. //autoResultMap 自动生成 <resultMap> 结果映射,支持查询结果中的 typeHandler 等配置
  2. @Entity.Table(value = "sys_user", remark = "系统用户", autoResultMap = true,
  3. props = {
  4. //deleteByExample方法中的Example条件不能为空,默认允许空,另外两个配置类似
  5. @Entity.Prop(name = "deleteByExample.allowEmpty", value = "false", type = Boolean.class),
  6. @Entity.Prop(name = "updateByExample.allowEmpty", value = "false", type = Boolean.class),
  7. @Entity.Prop(name = "updateByExampleSelective.allowEmpty", value = "false", type = Boolean.class)
  8. })
  9. public class User {
  10. //忽略其他
  11. }

3.3 @Entity.Column 注解

列的注解包含了大量的属性,这些属性涉及到了查询列、插入列、更新列,以及所有可能出现在 <result>#{} 中的参数。 这些参数的含义直接看代码注释。

下面是一个示例:

  1. //autoResultMap 自动生成 <resultMap> 结果映射,支持查询结果中的 typeHandler 等配置
  2. @Entity.Table(value = "sys_user", remark = "系统用户", autoResultMap = true)
  3. public class User {
  4. @Entity.Column(id = true, remark = "主键", updatable = false, insertable = false)
  5. private Long id;
  6. @Entity.Column(value = "name", remark = "帐号")
  7. private String name;
  8. @Entity.Column(value = "is_admin", remark = "是否为管理员", updatable = false)
  9. private boolean admin;
  10. @Entity.Column(remark = "顺序号", orderBy = "DESC")
  11. private Integer seq;
  12. @Entity.Column(numericScale = "4", remark = "积分(保留4位小数)")
  13. private Double points;
  14. @Entity.Column(selectable = false, remark = "密码")
  15. private String password;
  16. @Entity.Column(value = "when_created", remark = "创建时间", jdbcType = JdbcType.TIMESTAMP)
  17. private Date whenCreated;
  18. @Entity.Column(remark = "介绍", typeHandler = StringTypeHandler.class)
  19. private String info;
  20. //不是表字段
  21. private String noEntityColumn;
  22. //省略其他
  23. }