ActiveJdbc中关于插入数据的一些分析
2016-09-28 13:03
274 查看
常用的数据插入方法
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的
相关文章推荐
- 关于数据分析的一些看法——林培东
- Challenge2关于数据分析的图形的一些总结
- 关于Mysql数据库longblob格式数据的插入com.mysql.jdbc.PreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V问题分析
- 关于若干数据库数据插入性能的对比分析
- 年末的一些思考--关于电商,关于数据分析
- 做的一些测试数据的分析 一个是直接循环插入数据库 一个是循环好了放在数组里 在插入数据库
- 一些关于数据分析的言论
- 关于数据分析的一些注意点
- 关于双向链表的一些分析
- 数据结构中关于树的一些基本概念--随时更新 推荐
- 数据结构中关于图的一些基本概念
- 关于oracle中LONG数据类型使用上的一些总结
- 关于(webabcd兄的在GridView中插入新记录)的手动绑定数据做法
- 关于C++和C#的自定义数据类型转换的一些思考
- 关于注册的一些简单流程分析图
- 关于递归的一些分析
- 关于一张表数据插入到另一张表保持数据唯一,不重复
- 关于数据挖掘(协同过滤、关联推荐、聚类分类)一些资料
- 近期整理的关于数据存储和备份的一些资料
- 处理Clob数据(转)关于oracle中大对象处理的一些方法和实例