[翻译] ORMLite document -- How to Use Part (二)
前言
此文档翻译于第一次学习 ORMLite 框架,如果发现当中有什么不对的地方,请指正。若翻译与原文档出现任何的不相符,请以原文档为准。原则上建议学习原英文文档。
----------------------------------------------------------------------------------------------
二、如何使用
2.7 表的创建
ORMLite 提供了一些工具类为您存储在数据库中的类创建 table 和 schema。
2.7.1 TableUtils 类
TableUtils类提供了大量帮助创建和删除 table,以及提供 schema 声明的静态方法。请参阅 TableUtils Class
- createTable(ConnectionSource, Class)
- createTableIfNotExists(ConnectionSource, Class)
- createTable(ConnectionSource, DatabaseTableConfig)
- createTableIfNotExists(ConnectionSource, DatabaseTableConfig)
- dropTable(ConnectionSource, Class, boolean ignoreErrors)
- dropTable(ConnectionSource, DatabaseTableConfig, boolean ignoreErrors)
- getCreateTableStatements(ConnectionSource, Class)
- clearTable(ConnectionSource, Class)
- clearTable(ConnectionSource, DatabaseTableConfig)
2.7.2 TableCreator Class
TableCreator 这个类虽然是为使用Spring框架设计的,但是在其他的配置方面是很有用的。它配置 ConnectionSource 和被程序使用的 DAO 列表。
如果系统属性ormlite.auto.create.tables设置成true值,他会自动创建和这些DAO相关的表。如果系统属性ormlite.auto.drop.tables设置成true值,它也会自动删除创建的表。这在测试的时候特别有用:你开始使用取得最新schema的测试数据库,但是实际生产过程中你需要手动改变一个具体的schame。你可以在你运行测试脚本的时候设置系统属性,但是在运行实际脚本时要关闭它
List<Dao<?, ?>> daoList = new ArrayList<Dao<?, ?>>();
daoList.add(accountDao);
… TableCreator creator =
new TableCreator(connectionSource, daoList);
// create the tables if the right system property is set
creator.maybeCreateTables();
… // later, we may want to drop the tables that were created
creator.maybeDropTables();
2.8 唯一标识
数据库行可以由特定的列定义为标识列的标识。行不需要具有标识列,但很多 DAO 操作 (更新、 删除、 刷新) 要求标识列。这个标识可以由用户提供,或者可以由数据库自动生成。如果你想要查询的 id,删除、 刷新或更新使用 DAO 的特定行,必须存在一个对表的每一行来说唯一值。要将一个字段配置为标识字段,您应该使用一个 (且只有一个) 从 @DatabaseField 以下的三种设置: id、 generatedId 或 generatedIdSequence。
2.8.1 Id
在我门的示例 Account中,字符串name字段已经标明id = true。这意味着 name 为对象的标识字段。存储在数据库中的每个 Account 必须有一个唯一的值为name字段 — — 你不能有两行"John Smith"这个名字。
public class Account {
@DatabaseField(id = true)
private String name;
…
}
当您使用 DAO 来查找具有特定名称的帐户时,您将使用标识字段在数据库中查找Account对象:
Account account = accountDao.queryForId("John Smith");
if (account == null) {
// the name "John Smith" does not match any rows
}
注:如果你需要更改一个对象标识字段的值,你必须使用 Dao.updateId() 方法。ORMLite 首先按其旧的 ID 找到对象,然后更新它为新的 ID。请参阅updateId.
2.8.2 generatedId
你可以配置一个 long 或 integer 类型的字段为标识列,这个标识列将被自动数据库字段生成。
public class Order {
@DatabaseField(generatedId = true)
private int id;
…
}
当传递一个 Order 对象到 create 方法,存储到数据库,这个标识字段的值将被数据库返回并且通过 ORMLite 设置给 object。在大多数数据库中,这个值生成的值从1开始,每次+1。
// build our order object without an id
Order order = new Order("Jim Sanders", 12.34);
…
orderDao.create(order);
System.out.println("Order id " + order.getId() +
" was persisted to the database");
// query for the order with an id of 1372
order = orderDao.queryForId(1372);
if (order == null) {
// none of the order rows have an id of 1372
}
在上面的代码示例中,命令构造具有 name 和 amount (例如)。当它被传递给 DAO 的 create 方法时,id 字段未设置。它已保存到数据库后,生成 id 将在 id 字段上被 ORMLite 设值,并且在 create 方法返回的 order 对象上调用 getId() 时将可用。
注:此外可以生成其他特殊字段类型如UUID 。请参阅UUID.
注:您可以使用allowGeneratedIdInsert字段设置,以允许插入对象到一个表或没有 id 已经设置。请参阅allowGeneratedIdInsert.
2.8.2 generatedIdSequence
某些数据库使用的序列发生器提供生成的 id 值。如果您使用 generatedId = true,那些数据库序列名称将由 ORMLite 自动生成。如果,你需要设置的名称在现有的 schema 中存在,你可以使用 generatedIdSequence 值的序列的字符串名称。
public class Order {
@DatabaseField(generatedIdSequence = "order_id_seq")
private int id;
…
}
在上面的示例中, id 值自动重新生成但使用名称order_id_seq的序列。如果您正在使用一个数据库,它不支持序列,这将引发异常。
2.9 DAO 的使用
下面通过使用DAO方法简单完成数据库操作
- 创建并且持久化对象到数据库。
用对象插入一条记录到数据库中。Account account = new Account();
account.name = "Jim Coakley";
accountDao.create(account); - 通过 ID 查询
如果对象有通过注解定义的 ID 成员变量,我们可以通过它的 ID 在数据库中查找这个对象。Account account = accountDao.queryForId(name);
if (account == null) {
account not found handling …
} - 更新与该对象关联的数据
如果你在内存中改变一个对象的成员变量,你必须调用update把它持久化到数据库。这需要一个 ID 字段account.password = "_secret";
accountDao.update(account); - 刷新数据库有改变的对象
如果一些与内存中对象相关的数据库实体发生了改变,你就需要刷新来得到最新的存储对象。这需要一个 ID 字段。accountDao.refresh(account);
- 从数据库中删除数据
从数据库删除与对象关联的记录。一旦对象从数据库删除,你可以继续使用内存中的对象但是任何的更新或者刷新都很可能失败。这需要一个 ID 字段。accountDao.delete(account);
- 遍历表中所有记录
DAO也有迭代器,所以你可以简单的执行数据库中所有的记录。// page through all of the accounts in the database
for (Account account : accountDao) {
System.out.println(account.getName());
}注意:你必须遍历迭代器所有的条目来关闭底层的SQL对象。如果你没有通过循环走所有的途径,那么ORMLite不知道关闭底层对象,并且一个到数据库的连接可能泄露,如果更迟一些垃圾回收器才获得它,那么它将被迫关闭,这会在你的代码中产出漏洞。使用下面的try ... finally模板包住迭代器。
例如,下面的for循环是一个非常坏的模式。for (Account account : accountDao) {
if (account.getName().equals("Bob Smith")) {
// you can't return, break, or throw from here
return account;
}
}如果退出循环则会引发异常,因此不应在这些情况下使用
for循环,这也可能发生。这也是懒加载集合的情况。请参见lazy collection iterator. - 直接使用迭代器
您还可以使用迭代器直接因为for循环不是最佳。这使您可以使用try ... finally这是一个很多更好的模式。CloseableIterator<Account> iterator =
accountDao.closeableIterator();
try {
while (iterator.hasNext()) {
Account account = iterator.next();
System.out.println(account.getName());
}
} finally {
// close it at the end to close underlying SQL statement
iterator.close();
} - 获得一个包装的迭代器
你也可以使用"wrapped iterable",它允许你在finally中使用close而一直使用循环。CloseableWrappedIterable<Account> wrappedIterable =
accountDao.getWrappedIterable();
try {
for (Account account : wrappedIterable) {
…
}
} finally {
wrappedIterable.close();
}
2.10 索引字段
ORMLite 为 POJO 中的多个字段的索引提供一些有限的支持。首先,它重点指明任何被标记成 ID 的成员属性被编入索引。被 ID 标记的成员属性不再需要创建额外的索引,如果被指定的话,某些数据库可能会发生错误。
对非主键字段添加索引你需要添加注解 @DatabaseField(index=true), 请参阅 index。这将会在表被创建时创建一个非唯一的索引给成员变量并且如果表被删除那么将删除索引。索引用于帮助优化查询并且在查询媒介中数据量大的表时显著优化了查询时间。
public class Account {
@DatabaseField(id = true)
private String name;
// this indexes the city field so queries on city
// will go faster for large tables
@DatabaseField(index = true)
private String city;
…
}
本示例在 Account 表上创建索引 account_city_idx 。如果你想要使用一个不同的名称,则可以使用 indexName = "othername", 允许你指定的索引的名称。
如果你经常需要一起查询 city 和 state 在一条 SQL 语句上,这种情况下你可能想要在这两个字段上创建索引。ORMLite 支持多个字段创建索引通过指定相同的 indexName 值为每个您想要在索引的成员属性上。
@DatabaseField(indexName = "account_citystate_idx")
private String city;
@DatabaseField(indexName = "account_citystate_idx")
private String state;
这个示例会为 city 和 state 成员输出创建同一个索引。注意,单独通过 city 查询是没有查询优化的,只有同时在 city 和 state 两个字段做多关键字查询时才会被优化。在某些数据库上,查询 city 和 state 时对每个字段单独建立索引,让数据库同时使用两个索引,可能是更好的选择。对于另一些数据库,推荐在多个成员变量上创建一个索引。你可能需要尝试使用SQL EXPLAIN命令来查明你的数据库是怎么使用你的索引的。
创建一个唯一的索引,uniqueIndex = true 和 uniqueIndexName ="othername" 在 @DatabaseField 注解中都是有效的。这些操作和上面的设置一样,只是创建唯一索引来确保没有任何两条记录的索引有相同的值。
-----------------------------------------------------------------------------
由于本文档篇幅过长,之后的部分请参阅[翻译] ORMLite document -- How to Use Part (三)
[翻译] ORMLite document -- How to Use Part (二)的更多相关文章
- [翻译] ORMLite document -- How to Use Part (一)
前言 此文档翻译于第一次学习 ORMLite 框架,如果发现当中有什么不对的地方,请指正.若翻译与原文档出现任何的不相符,请以原文档为准.原则上建议学习原英文文档. ----------------- ...
- [翻译] ORMLite document -- Getting Started
前言 此文档翻译于第一次学习 ORMLite 框架,如果发现当中有什么不对的地方,请指正.若翻译与原文档出现任何的不相符,请以原文档为准.原则上建议学习原英文文档. ----------------- ...
- 【翻译】MongoDB指南/CRUD操作(二)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...
- 翻译《Writing Idiomatic Python》(二):函数、异常
原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...
- 【翻译】MVC Music Store 教程-概述(二)
1. 文件->新建项目 软件安装 此篇将从运用免费的Visual Web Developer 2010Express来创建ASP.NET MVC3开始,逐步的添加一些功能来创建一个完整的应用程序 ...
- [翻译]NUnit---TearDown and SetUpFixture and Test Attributes(二十)
TearDownAttribute (NUnit 2.0 / 2.5) 本特性在TestFixture内部使用,每个测试方法执行后调用的方法集.也可以在SetUpFixture中使用,在同一命名空间或 ...
- WebGL入门教程(二)-webgl绘制三角形
前面已经介绍过了webgl,WebGL入门教程(一)-初识webgl(http://www.cnblogs.com/bsman/p/6128447.html),也知道了如何绘制一个点,接下来就用web ...
- 《Writing Idiomatic Python》前两部分的中文翻译
汇总了一下这本小书前两部分的内容: 翻译<Writing Idiomatic Python>(一):if语句.for循环 翻译<Writing Idiomatic Python> ...
- 翻译《Writing Idiomatic Python》(三):变量、字符串、列表
原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...
随机推荐
- “fatal error C1010”错误解决的三种方法
尝试写了一个简单的类文件,但在编译的时候提示错误,具体错误信息如下: fatal error C1010: unexpected end of file while looking for preco ...
- ios app的版本号
ios其实有3个版本号 version 就是ios的版本号 (只能分3段,并且都是数字) build 是ios构建内部版本时的版本号 (可以分4段) 而提交到appstore时, 还是要创建一个sku ...
- 常用vim插件的安装、使用和管理
1.Ctags Ctags工具是用来遍历源代码文件生成tags文件,这些tags文件能被编辑器或者其他工具用来快速查找定位源代码中的符号,入变量名,函数名等.比如,tags文件就是Taglist和 ...
- 如何利用谷歌浏览器快速的通过方法名来确定多个js文件中的某一具体文件;
- 高性能MySQL(五):查询性能优化
当向MySQL 发送一个请求的时候MySQL 到底做了什么? 1.客户端发送一条查询给服务器 2.服务器先检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果.否则进入下一阶段 3.服务器端进行 ...
- scenejs的一点Cameras小笔记
视图模式: 一如官网所见,这个cameras 是控制的视口的东西. 他有如下4个模式 1.orbit模式 鼠标拖中物体,切换视口观察物体,鼠标滚轮变换, 放大缩小可视范围. 2.orbit/spin模 ...
- 排序之----插入排序(C#实现)
算法步骤:(从小到大) 1:将第一个元素与第二个元素比较大小,如果第一个元素小于等于第二个元素,不做处理,继续比较第二个元素和第三个元素. 如果第三个元素小于第二个元素,保存要移动的元素(第三个元素) ...
- 「C++11」Lambda 表达式
维基百科上面对于 lambda 的引入是如下描述的: 在标准 C++,特别是当使用 C++ 标准程序库算法函数诸如 sort 和 find.用户经常希望能够在算法函数调用的附近定义一个临时的述部函数( ...
- Ubuntu 安装php+mysql 环境
新系统安装完毕后,首先运行apt-get update 更新apt库. 然后安装ssh,输入apt-get install openssh-server,安装ssh是为了可以远程操作,不然坐在机房实在 ...
- 序列化,反序列化和transient关键字
一.序列化和反序列化的概念 序列化:指把java对象转换为字节序列的过程. 反序列化:指把字节序列恢复为java对象的过程. 对象的序列化主要有两种用途: 1) 把对象的字节序列保存到硬盘上,通常存放 ...