ActiveJdbc中关于插入数据的一些分析

常用的数据插入方法

  • save
    仅保存,但不抛出异常
  • saveIt
    保存,能抛出异常
  • create
    仅设置值,但不保存,需在使用后调用save()或saveIt()
  • createIt
    设置值,同时也保存

但需要注意的是,在官网有这么一句话

Usually you do not set ID of a model. ActiveJDBC will manage that. If you find setting ID of a model, stop and question what you are doing. If you indeed decide to do this, keep in mind that ActiveJDBC uses ID presence to determine if it needs to generate INSERT or UPDATE statements.

大致的意思是,请在插入数据的时候不要对ID设置值,如果要设置,请使用其他方法。
这个其他方法他也提供了,代码如下:

Apple apple = new Apple();
apple.set("apple_type", "sweet");
apple.setId(1);
apple.insert();

Apple apple1 = new Apple();
apple1.set("apple_type", "sour");
apple1.setId(2);
apple1.insert();

所以如果我们使用createIt(),却写了如下代码,将不会往数据库中写入数据。

Apple.createIt("id",1,"name","Apple1");

那么createIt()到底做了什么,为什么会这样,我们认为的create是创建,怎么会创建不了数据。让我们分析下他的源码。


源码分析

先看看Model这个类,这个类属于org.javalite.activejdbc包

public static <T extends Model> T create(Object... namesAndValues) {
    return ModelDelegate.create(modelClass(), namesAndValues);
}

public static <T extends Model> T createIt(Object... namesAndValues) {
    return ModelDelegate.createIt(modelClass(), namesAndValues);
}

public boolean saveIt() {
    boolean result = this.save();
    ......
}

public boolean save() {
    ......
}

然后来看看ModelDelegate这个类,这个类属于org.javalite.activejdbc包

public static <T extends Model> T create(Class<T> clazz, Object... namesAndValues) {
    try {
        return ((Model)clazz.newInstance()).set(namesAndValues);
    } catch ......
}

public static <T extends Model> T createIt(Class<T> clazz, Object... namesAndValues) {
    Model model = create(clazz, namesAndValues);
    model.saveIt();
    return model;
}

从上面可以看出,create()没有调用saveIt()的方法,所以在使用后需要手工调用save,而createIt()调用了saveIt()的方法,所以不需要手工调用save

而且createIt()中调用了create()方法。

createIt()中调用的是saveIt(),saveIt()调用的是save(),所以我们看一下save()的代码,在Model类中

public boolean save() {
    if(this.frozen) {
        throw new FrozenException(this);
    } else {
        this.fireBeforeSave();
        this.validate();
        if(this.hasErrors()) {
            return false;
        } else {
            boolean result;
            if(this.getId() == null && !this.compositeKeyPersisted) {
                result = this.insert();
            } else {
                result = this.update();
            }

            this.fireAfterSave();
            return result;
        }
    }
}

其中 if(this.getId() == null && !this.compositeKeyPersisted) 表明了只有不设置ID,且没有联合主键,才做insert操作,不然就做update操作

因此官网才会提醒不要再调用createIt()时设置ID。

最后提醒一下:
在插入数据时可以调用insert()方法,但更新数据是却不能使用update()方法,因为它是private

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值