nutz mysql 关键词_关于主键

本文详细介绍了Nutz.Dao中如何处理主键,包括整数型主键@Id、字符型主键@Name、复合主键@PK的使用方式,以及主键的自增、手动设置和不同生成策略,如@Prev配合EL表达式实现灵活的主键生成。
摘要由CSDN通过智能技术生成

简要介绍

为使用 Dao 接口的 fetch(Class>, long) 以及 fetch(Class>, String),需要为一个 POJO 指明它的主键。

主键可以是整数型的,也可以是字符型的。同时它也可以支持复合主键。整数型主键

注解 @Id

声明在字段上

字符型主键

注解 @Name

声明在字段上

复合主键

注解 @PK

声明在类上

注意: 对于一个 POJO,你可以同时为其声明 @Id 和 @Name,它们都能正常工作。你只需要保证 @Name 对应的字段

在数据库里有唯一性约束即可。 但是通常, Nutz.Dao 并没有假设你同时在一个 POJO 里应用 @Id, @Name 和 @PK,如果你

这么做了,可能会引发一些奇怪的问题。事实上,你也不可能这么做,不是吗?

TIPS:注解 @Id 与注解 @Name 声明的字段不需要另外加上注解 @Column;

在注解 @PK 里面声明的对应复合主键的字段不需要另外加上注解 @Column。

整数型主键

@Id与主键属性名称id没有强制性,只是惯例叫id,你可以起名为abc的.

@Table("t_pet")

public class Pet{

@Id

private int id;

...

通过 @Id 声明了一个整数型主键后,你可以:

Pet pet = dao.fetch(Pet.class,23);

默认自增

默认的,Nutz.Dao 认为一个整数型主键默认就是自增的。所以他会在:

dao.insert(pet);

之后,为你插入的对象执行

SELECT MAX(id) FROM t_pet;

// 如果您使用的数据库支持主键返回(例如MySQL),那么上述sql不会出现.

并设置到 pet 对象中。当然,不同的数据库,获得自增值的方式是不一样的,请参看 在插入前后的为字段设值

里面描述了,通过 @Next 注解,声明数据库本地方言,来获取自增值。

注意!! 这里的自增是由数据库表来实现的,而非NutDao的内部自增机制!!

手工设值

由于默认的,@Id 字段被认为是自增的,所以在插入时,Nutz.Dao 会忽略这个字段。但是,有些时候,你的整数主键不是自增的,

你希望手工为其设值,怎么办呢? 你可以给 @Id 设一个属性: auto=false

@Table("t_pet")

public class Pet{

@Id(auto=false)

private int id;

...

Nutz.Dao 在插入对象时,就不会忽略你这个主键的值了。

快速插入

无论你是不是 @Id(auto=false),通过 Dao.fastInsert ,都不会执行 SELECT MAX(id)

dao.fastInsert(pet)

它只会单纯的拼出一条 INSERT XXX,然后执行。 在一个循环里,一次插入多个对象时,很适合使用。

字符型主键

@Table("t_pet")

public class Pet{

@Name

private String name; // 属性名称可任意指定,并非强制叫name

...

通过 @Name 声明了一个字符型主键后,你可以:

Pet pet = dao.fetch(Pet.class,"XiaoBai");

忽略大小写

@Table("t_pet")

public class Pet{

@Name(casesensitive=false)

private String name;

...

因此

Pet pet = dao.fetch(Pet.class,"XiaoBai");

//同

Pet pet = dao.fetch(Pet.class,"xiaobai");

//运行的结果就会没有区别

复合主键

@Table("t_pet")

@PK( {"masterId", "petId"} )

public class Pet{

private int masterId

private int petId;

...

通过 @PK 声明了复合主键,你就可以:

通过变参获取和删除

获取

Pet pet = dao.fetchx(Pet.class, 23, 12);

删除

Pet pet = dao.deletex(Pet.class, 23, 12);

注意这里你给的变参的顺序必须按照你 @PK 里声明的顺序。

是 fetchX 和 deleteX

其他操作

至于 update, clear, insert 则和平常的对象一样。 不过 Update 的时候,你的 POJO 所有的复合主键字段需要被设上值,

才能正确被更新。

主键生成器

通过@Prev的灵活使用,可以配置不同的主键生成策略,以满足各种场景. 虽然叫"主键生成器",但事实上可以作用于任意属性

数据库自增. Oracle环境下,通过dao.create创建的表会带seq和触发器

@Id

private int id;

使用自定义的Oracle的seq序列

@Id // 1.r.58之前的版本需要设置为false

@Prev(@SQL(value="select xxx_seq.nextval from dual", db=DB.ORACLE))

private int id;

调用pojo自身的方法生成

@Id(auto=false)

@Prev(els=@EL("$me.nextId()"))

private int id;

public int nextId() {

return System.currentTimeMillis();//仅供演示!!!

}

走UUID

通过EL内置的全局方法uuid(), 它的实现类是org.nutz.el.opt.custom.MakeUUID

@Name //注意,字符串主键用@Name,与属性名称无关!!!

@Prev(els=@EL("uuid(32)")) // 可以是 uuid() uuid(32)

private String id;

完全自定义

自己写了个很棒的id生成方法?想集成第三方id生成器? 实现RunMethod接口即可, 然后将其注册到EL全局.

// 首先, 做一个类,实现RunMethod

@IocBean

public class MySuperIdGenerator implements RunMethod {

@Aop("redis")

public Object run(List fetchParam) {

// 用redis实现自增

return jedis().incr("ig:"+fetchParam.get(0).toString());

}

public String fetchSelf() {

return "ig";

}

}

// 然后, 在MainSetup.init方法或dao操作之前执行一次注册, 一次就可以哦.

// CustomMake.me().register("ig", ioc.get(MySuperIdGenerator.class)));

// 用法:

@Id(auto=false)

@Prev(els=@EL("ig(view.tableName)")) // view.tableName 相当于 dao.getEntity(pojo.getClass()).getTableName()

private int id;

EL表达式中可用的变量

$me -- 当前Pojo对象

view -- 当前Pojo对象的Entity实例, 可以拿到各种元数据,例如表名. 相当于 dao.getEntity(pojo.getClass())

field -- 当前属性, 相当于 dao.getEntity(pojo.getClass()).getField("id/name/...")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值