对于一个工具的使用,学起来是很容易,浅尝辄止可不行,至少学过一个工具需要有点个人观点才行。
Java 1.5 支持注解方式,到现在注解+反射已经被用烂了,ORMLITE同样使用这种方式进行对象和数据库字段对应。只是 ORMLITE为了支持多平台使用的是 JavaxPersistence
下面分析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 请自行翻阅查看这里不进行展开
读取注解+反射很耗时,这里进行缓存是很好做法。 注解读取与缓存只是关键步骤中的一步,接下来就需要执行sql语句了,既然ORM肯定不会让我们手动敲打 具体sql语法,而是封装过了 调用链还有一些只得注意的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
查找器是帮助拼接条件语句的.比如查找器中有 where()方法 and()方法 eq()方法 lt()方法 qt()方法 between方法这些方法很直观..很容易都明了什么意思 最后使用prepare()方法生成条件使用DAO.query || DAO.delete|| DAO.update 方法执行 可以使用查找生成器QueryBuilder 的 orderby limit offset 方法进行排序,分页,不得不提醒一下事务操作,虽然一般公司很少用到!!!
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/
注解: http://blog.csdn.net/bao19901210/article/details/17201173
鸿洋orm:http://blog.csdn.net/lmj623565791/article/details/39122981