数据库对象
创建及修改数据库对象
Java 应用程序使用 new 操作符来实例化对象,并使用赋值操作符来修改对象的值。要在数据库中存储对象,需在事务中调用 Connection 方法 insert()。例如:
@Persistent // Class Record will be stored in SmartEDB database
class Record
{
@Indexable(unique=true) // Create unique (tree) SmartEDB index by "id" field
int id;
public String str;
}
...
Connection con = new Connection(db);
con.startTransaction(Database.TransactionType.ReadWrite); // Start RW transaction
Record rec = new Record();
rec.id = 3;
rec.str = "Record 3";
con.insert(rec);
con.commitTransaction();
要更新一个对象,首先使用游标导航找到该对象,然后修改其字段,并使用对象句柄调用游标的 update() 方法。例如:
cursor = new Cursor<Record>(con, "id");
// find record with id == 3
rec = cursor.find(3);
rec.str = "Updated string";
cursor.update();
cursor.close(); //release cursor
con.CommitTransaction();
要从数据库中删除一个对象,首先使用游标导航找到该对象,然后调用游标的 remove() 方法并传入对象句柄。例如:
cursor = new Cursor<Record>(con, "id");
// find record with id == 3
rec = cursor.Find(3);
cursor.remove(); // remove current object (pointed to by the cursor)
cursor.close(); //release cursor
con.CommitTransaction();
字符串和数组
字符串字段的 Length 属性可用于确定其实际字节大小。此外,由于向量(也称为动态数组)在中只是用原生语言的数组语法声明的,所以字段的 Length 属性给出了向量元素的数量。 在 Java 应用程序中,向量(数组)字段的元素是通过使用常规的数组元素操作符 [] 并指定所需元素的索引来访问的。
可空字段
在 Java 类字段中,可以使用 @nullable 注解明确声明其可为空。例如:
class Record
{
@Indexable(Unique=true) // Create unique (tree) SmartEDB index by "id" field
public int id;
@Nullable
public int weight;
}
在此,字段权重可能为空值。 有关索引中包含的可为空字段的行为说明,请参阅“可为空字段和索引”页面。
Blob支持
Java应用程序使用@Blob字段注释来定义BLOB字段。
日期时间字段
正如“日期时间字段”页面中所解释的那样,类型为 datetime 的字段(实际上映射到 java.util.Date 类)是一个 64 位整数值,用于在数据库中存储日期和时间,而 Datetime 值的精度由运行时参数 DATETIME_PRECISION 决定,该参数表示每秒的滴答数。DATETIME_PRECISION 的默认值为 1000,这意味着数据库将 Datetime 值存储为自纪元(即 1970 年 1 月 1 日 00:00:00 UTC)以来的毫秒数。
例如,以下代码片段定义了一个 Datetime 类型的字段 d 和一个 Datetime 值的序列 sd:
@Persistent
class T
{
Date d;
@Sequence(type=Sequence.Type.DateTime)
UnorderedSequence sd;
};
日期字段的精度可以通过应用程序在运行时选项 RT_OPTION_DATETIME_PRECISION 中进行更改。DATETIME_PRECISION 可以设置为 1 以存储秒数,或者设置为 1000000(1,000,000)以存储微秒数。例如:
Database db = new Database(config);
db.SetRuntimeOption(Database.RT_OPTION_DATETIME_PRECISION, 1000000);
以下代码片段演示了如何使用 Java 本地接口存储和加载 Date 值:
T t = new T();
t.d = new Date(...);
...
con.insert(t)
...
Cursor<T> cursor = new Cursor<T>(con, T.class, ...);
for (T t : cursor)
{
System.out.println(t.d);
}
以下代码片段演示了如何使用 SQL 存储和加载日期值:
Date d = new Date(...);
Date sd = new Date[N];
<create sd elements>
con.executeStatement("INSERT INTO T VALUES(?,?)", d, sd);
...
SqlResultSet result = con.executeQuery("SELECT d, sd FROM T");
for (SqlTuple tuple: result)
{
Date d = (Date) tuple.get(0);
Date[] sd = new Date[1];
SequenceIterator seq = (SequenceIterator)tuple.get(1);
System.out.println("d : " + d);
while (seq.get(sd) > 0)
{
System.out.println(" sd : " + sd[0]);
}
}
result.close();