对于自动生成的sql,默认不需要任何annotaton,类名对应于表名(通过NameConverstion类),getter方法的属性名对应于列明(也是通过NameConverstion类),但有些情况还是需要anntation。
@AssignID()
public Long getId() {
return id;
}
代码设定主键允许像@AssignID 传入id的生成策略以自动生成序列,beetl默认提供了一个snowflake算法,一个用于分布式环境的id生成器(https://github.com/twitter/snowflake)
@AssignID("simple")
public Long getId() {
return id;
}
simple 是beetlsql提供的一个默认的snowflake实现,你可以通过sqlManager自己注册id生成器
sqlManager.addIdAutonGen("uuid2", new IDAutoGen(){
@Override
public Object nextID(String params) {
return "hi"+new Random().nextInt(10000);
}
});
@AssignID("uuid2")
public Long getId() {
return id;
}
对于属性名为id的自增主键,不需要加annotation,beetlsql默认就是@AutoID
备注
- 对于支持多种数据库的,这些annotation可以叠加在一起
@Tail作用于类上,表示该对象是混合模型,参考下一章混合模型,sql查询无法在pojo映射的列或者结果集将使用Tail指定的方法
BeetlSql提供InsertIgnore,UpdateIgnore俩个注解,作用于属性字段或者getter方法,前者用于内置插入的时候忽略,后者用于内置更新的时候忽略。
@UpdateIgnore
public Date getBir(){
return bir;
}
在beetlsql较早版本提供了ColumnIgnore, 提供insert或者update属性用来忽略
@ColumnIgnore(insert=true,update=false)
public Date getBir(){
return bir;
}
如上例子,插入的时候忽略bir属性(往往是因为数据库指定了默认值为当前时间),更新的时候不能忽略 @ColumnIgnore的insert默认是true,update是false,因此也可以直接用 @ColumnIgnore()
对于Entity使用了枚举作为属性值,可以再枚举类上定义EnumMapping,指出如何将枚举与数据库值互相转化,有四种方法
@EnumMapping("value")
public enum Color {
RED("RED",1),BLUE ("BLUE",2);
private String name;
private int value;
private Color(String name, int value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
beetlsq 会获取枚举的value属性(调用getValue)来获取枚举属性值
标签 @Table(name="xxxx") 告诉beetlsql,此类对应xxxx表。比如数据库有User表,User类对应于User表,也可以创建一个UserQuery对象,也对应于User表
@Table(name="user")
public class QueryUser ..
注:可以为对象指定一个数据库shcema,如name="cms.user",此时将访问cms库(或者cms用户,对不同的数据库,称谓不一样)下的user数据表
@DateTemplate(accept="minDate,maxDate",compare=">=,<")
public Date getDate() {
}
在模板查询的时候,将会翻译成
@if(!isEmpty(minDate)){
and date>=#minDate#
@}
@if(!isEmpty(maxDate)){
and date<#maxDate#
@}
注意
minDate,maxDate 是俩个额外的变量,需要定义到pojo类里,DateTemplate也可以有默认值,如果@DateTemplate(),相当于@DateTemplate(accept="min日期字段,max日期字段",compare=">=,<")
Mapper 是将sql模板文件映射成一个具体的Dao方法类,这样方位代码开发和维护
Mapper中的注解,包括常用的 SqlStatement ,SqlStatementType ,Sql,Param 还有不常用的 RowSize ,RowStart,具体参考Mapper
beetlsql 支持在实体类上增加ORMQuery注解,这样对于实体的查询,会触发懒加载,从而实现ORM 查询功能,具体参考ORM 查询一章
注解@Version作用在类型为int,long的属性或者getter方法上,用于乐观锁实现。
public class Credit implements Serializable{
private Integer id ;
private Integer balance ;
@Version
private Integer version ;
当调用内置的updateById,或者updateTemlateById的时候,被@Version注解的字段将作为where条件的一部分
┏━━━━━ Debug [credit._gen_updateTemplateById] ━━━
┣ SQL: update `credit` set `balance`=?, `version`=`version`+1 where `id` = ? and `version` = ?
┣ 参数: [15, 1, 5]
┣ 位置: org.beetl.sql.test.QuickTest.main(QuickTest.java:38)
┣ 时间: 4ms
┣ 更新: [1]
┗━━━━━ Debug [credit._gen_updateTemplateById] ━━━
BeetlSQL 也支持悲观锁实现,即采用select for update 方式,只要调用SQLManager.lock(Class cls,Object key)就可以对cls对应的的表的主键为key的记录使用行锁。只有事务结束后才,才释放此锁