# 注解的应用

框架基本都是通过注解进行配置声明,了解所用的注解非常重要,所用注解大部分都是JPA规范定义的,少部分是本框架增加。 如果你使用过Hibernate或Spring-Data-Jpa,那么你应该对以下注解十分熟悉,有属性的注解,以下标属性出来的才有效,其它无效

# 标准JPA注解

# javax.persistence.Entity

声明一个类为实体类,实体类必须注解

# javax.persistence.Table(name=?, catalog=?, schema=?)

声明实体类的table属性,非必要,默认表名为实体类名的驼峰转下划线,如StudentProfile -> student_profile,如果要覆盖,填属性name即可

# javax.persistence.Column(name=?,insertable=?,updatable=?)

声明属性为字段列,非必要
name对应表字段名,默认表名为属性名的驼峰转下划线
insertable是否可插入,如果字段在新增阶段不需要插入的,可以设为false
updatable是否可更新,如果字段在更新阶段不需要插入的,可以设为false,例如创建人,创建时间不可更新,注:ID属性默认不会更新

# javax.persistence.Id

声明属性为ID字段列
目前只支持单字段ID

# javax.persistence.GeneratedValue(strategy=?,generator=?)

声明ID的构建方式
详细见后面主键生成器章节说明

# javax.persistence.Transient

声明一个属性为非字段名
只要没有Transient、及关联关系OneToOne等声明的属性都会映射为表字段,如果希望属性不被认为是一个表字段,添加此注解。
使用@OneToOne, @OneToMany, @ManyToMany, @ManyToOne作为引用属性声明时,不要加@Transient

# javax.persistence.OneToOne(targetEntity=?,mappedBy=?)

声明一对一的关系,有此注解的属性不会被认为是当前实体的表字段,不能与Transient混用,下面关联注解类同
mappedBy不为空时,指对方实体的属性名,使用对方实体属性上配置的关系信息
当mappedBy为空时,需要添加@JoinColumn注解,声明关联字段信息
targetEntity 目标实体类,如果当前关联属性不是一个实体类,就需要指明对应的实体类

# javax.persistence.JoinColumn(name=?,referencedColumnName=?)

声明关联字段信息
name 对应本实体映射表的字段名,注意是字段名,不是属性名,必填 referencedColumnName 被引用的字段名,即对方表的字段,可不填,默认为对方的ID

# javax.persistence.ManyToOne(targetEntity=?)

声明一个多对一关系,有此注解的属性不会被认为是当前实体的表字段
targetEntity 目标实体类,如果当前关联属性不是一个实体类,就需要指明对应的实体类
必须结合@JoinColumn注解声明才有作用

# javax.persistence.OneToMany(targetEntity=?,mappedBy=?)

声明一对多的关系
mappedBy不为空时,指对方实体的属性名,使用对方实体属性上配置的关系信息
当mappedBy为空时,需要添加@JoinColumn注解,声明关联字段信息
targetEntity 目标实体类,如果当前关联属性不是一个实体类,就需要指明对应的实体类

# javax.persistence.ManyToMany(targetEntity=?,mappedBy=?)

声明多对多的关系
mappedBy不为空时,指对方实体的属性名,使用对方实体属性上配置的关系信息
当mappedBy为空时,需要添加@JoinTable注解,声明关联字段信息
targetEntity 目标实体类,如果当前关联属性不是一个实体类,就需要指明对应的实体类

# javax.persistence.JoinTable(name=?,joinColumns=@JoinColumn(name=?,referencedColumnName=?),inverseJoinColumns=joinColumns=@JoinColumn(name=?,referencedColumnName=?))

声明中间表关联信息
配置较为复杂,要搞清楚
name 中间表表名,可为空,如果为空,则为本方表名+"_"+对方表名,建议设定。
joinColumns.name 中间表字段,即关联本方的字段名,必填
joinColumns.referencedColumnName 本方字段名,可不填,默认为本方ID
inverseJoinColumns.name 中间表字段,即关联对方的字段名,必填 inverseJoinColumns.referencedColumnName 对方字段名,可不填,默认为对方ID

# 本框架增加注解

# com.yuehuanghun.mybatis.milu.annotation.NamingQuery

声明Mapper方法是一个命名式查询接口
详细见后面查询创建器章节说明

# com.yuehuanghun.mybatis.milu.annotation.StatementOptions(selects=?,exselects=?,asExpression=?,lockModelType=?)

在一个@NamingQuery接口上声明,其它接口无效,表示查询的指定操作
selects 选择的属性,多个属性用半角逗号隔开。默认单表查询时,会选择所有属性,可以使用此声明要选择属性
exselects 不选择的属性,多个属性用半角逗号隔开。默认单表查询时,会选择所有属性,可以使用此声明排除的选择属性
lockModelType 使用的锁模式类型,默认为NONE

# com.yuehuanghun.mybatis.milu.annotation.AttributeOptions(exampleQuery=?,filler=?,updateMode=?,conditionMode=?,typeHandler=?,jdbcType=?,logicDelete)

在实体类的属性上声明附加操作
exampleQuery 见后面ExampleQuery注解说明
filler 见后面Filler注解说明
updateMode 属性被更新时,值为什么情况可被更新 conditionMode 属性作为查询条件时,值为什么情况时可被作为查询条件
typeHandler 设置类型处理器,一般自定义org.apache.ibatis.type.TypeHandler实现时使用
jdbcType 指定jdbc类型,一般情况下不需要指定,框架会在未检测到时自动设置
logicDelete 指定此属性为一个逻辑删除标识字段,com.yuehuanghun.mybatis.milu.annotation.LogicDelete,@LogicDelete也可以直接注解在实体属性上

# com.yuehuanghun.mybatis.milu.annotation.alias.attr.Contains

注解在实体类属性上

等同于@AttributeOptions(exampleQuery = @ExampleQuery(matchType = MatchType.CONTAIN))

# com.yuehuanghun.mybatis.milu.annotation.LogicDelete(value = ?, resumeValue = ?, provider = ?, main = ?)

逻辑删除标识属性声明
可以作为@AttributeOptions的属性使用,也可以直接注解在实体属性上
value 标识为逻辑删除时的值,默认值为1,当使用logicDeleteXxxx方法时,属性即被设置为此值
resumeValue 标识为正常数据时的值,默认值为0,当使用resumeLogicDeleteXxxx方法时,属性即被设置为此值
provider 设置逻辑删除值的提供者,如果设置了此参数,则value、resumeValue的设置无效
main 是否为主逻辑删除属性。允许有多个属性使用@LogicDelete,但只允许有一个被设置为主逻辑删除属性

# com.yuehuanghun.mybatis.milu.annotation.ExampleQuery(matchType=?, startKeyName=?, startValueContain=?, endKeyName=?, endValueContain=?, inKeyName=?)

在exampleQuery时的配置
matchType 在exampleQuery作为查询条件时值匹配方式,默认为=
startKeyName 属性作为范围时条件(值开始)时,传值的键名,例如createTimeBegin,可以使用半角句号表达式如params.createTimeBegin
startValueContain 是否包含开始值,即匹配时是>=还是>,默认为true
endKeyName 属性作为范围时条件(值结束)时,传值的键名,例如createTimeEnd
endValueContain 是否包含开始值,即匹配时是<=还是<,默认为true
inKeyName 使用IN范围匹配时,传值的键名,注意,传值对象可以为Collection、数组或以半角逗号隔开的字符串。

# com.yuehuanghun.mybatis.milu.annotation.Filler(attributeValueSupplier=,fillOnInsert=,fillOnUpdate=)

自动填充值声明,在插入数据时使用
详情看后面自动填充说明

# com.yuehuanghun.mybatis.milu.annotation.EntityOptions(fetchRefs=?, filterLogicDeletedData=?)

实体类的附加声明

fetchRefs 引用属性加载(select值)设置。在findByExample、findAll等基础查询中,默认只查当前单表数据,可以通过此设置在这些查询中同时查询哪些引用属性(关联表)
filterLogicDeletedData 是否过滤掉已逻辑删除的数据,默认true。对非Criteria查询有效。

# com.yuehuanghun.mybatis.milu.annotation.EntityOptions.FetchRef(group=?, refAttrs=?, joinMode=?)

引用属性加载(select值)设置,可作为@EntityOptions的属性使用,也可以直接注解在实体类上
group 分组,默认值为default,在example查询中可指定加载引用属性的分组
refAttrs 需要加载的引用属性(关联表)
joinMode 联结模式