前言
对于一个工具的使用,学起来是很容易,浅尝辄止可不行,至少学过一个工具需要有点个人观点才行。
Java 1.5 支持注解方式,到现在注解+反射已经被用烂了,ORMLITE同样使用这种方式进行对象和数据库字段对应。只是 ORMLITE为了支持多平台使用的是 JavaxPersistence
1. 对象如何才能写入到sqlite
2. 数据表和对象Bean映射方式,如何读取映射关系
下面分析OpenHelper
- package dragger2.nuoyuan.com.myapplication.db;
-
- ...
- ...
-
- public class DatabaseHelper extends OrmLitesqliteOpenHelper {
-
- private Map<String,Dao> daos = new HashMap<String,Dao>();
- ...
- ...
-
- public synchronized Dao getDao(Class clazz) throws sqlException {
- Dao dao = null;
- String className = clazz.getSimpleName();
-
- if (daos.containsKey(className)) {
- dao = daos.get(className);
- }
- if (dao == null) {
- dao = super.getDao(clazz);
- daos.put(className,dao);
- }
- return dao;
- }
-
- ...
- ...
-
- }
首先介绍这个核心类 OrmLitesqliteOpenHelper extends sqliteOpenHelper ,很明显就是对系统Api进行再封装
上篇已经提到过,也就是所有对数据库的操作都会通过这个 sqliteOpenHelper 来执行。
1.那么首先介绍 ORMlite 是如何知道那些是表名,那些是表字段名。
肯定有地方提供一个声明,不错声明的地方是在Bean中
- @DatabaseTable(tableName = "tb_student")
- public class Student extends BaseDaoEnabled<Student,Integer> {
- @DatabaseField(generatedId = true)
- private int id;
-
- @DatabaseField(dataType = DataType.STRING)
- private String name;
-
- public Student() {
- }
-
- @DatabaseField(generatedId = true)
- @DatabaseTable(tableName = "tb_student")
- @DatabaseField(dataType = DataType.STRING)
-
- 当然不止这三个。
-
- @Target(TYPE)
- @Retention(RUNTIME)
- public @interface DatabaseTable {
-
- String tableName() default "";
-
-
- Class<?> daoClass() default Void.class;
- }
字段注解
看上面的GetDao()方法中的 dao = super.getDao(clazz); 对就是在这个方法中进行注解读取以及缓存,具体操作类 DatabaseTableConfig
,DatabaseFieldConfig 请自行翻阅查看这里不进行展开
对象到数据库的映射
还有一些只得注意的API用法
- xxxBuilder
- create:插入一条数据
-
- createIfNotExists:如果不存在则插入
-
- createOrUpdate:如果指定id则更新
-
- queryForId:更具id查找
-
- update 查找出数据
-
- refresh的解释:If you want to use other elds in the Account,you must call refresh on the accountDao class to get the Account object lled in.
-
- delte 删除数据
-
- queryBuilder() 创建一个查询生成器:进行复杂查询
-
- deleteBuilder() 创建一个删除生成器,进程复杂条件删除
-
- updateBuilder() 创建修条件生成器,进行复杂条件修改
条件查找器DeleteBuilder,QueryBuilder,UpdateBuilder
不得不提醒一下事务操作,虽然一般公司很少用到!!!
Eg:
public int deleteByName(String name) {
try {
//int result = userDaoOpe.executeRaw(“DELETE FROM tb_student WHERE name=?”,name);
- Where where = userDaoOpe.deleteBuilder().where().eq("name",name);
- userDaoOpe.deleteBuilder().setWhere(where);
- int result = userDaoOpe.deleteBuilder().delete();
- return result;
- } catch (sqlException e) {
- e.printStackTrace();
- }
- return -1;
}
事务操作
在我们的Dao中直接写如下代码:
- //事务操作
- TransactionManager.callInTransaction(helper.getConnectionSource(),new Callable<Void>()
- {
-
- @Override
- public Void call() throws Exception
- {
- return null;
- }
- });
引用
Ormlite使用: http://blog.163.com/chunhai127@126/blog/static/9497131720121171629974/