ORMLite 映射分析

前端之家收集整理的这篇文章主要介绍了ORMLite 映射分析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前言

对于一个工具的使用,学起来是很容易,浅尝辄止可不行,至少学过一个工具需要有点个人观点才行。

Java 1.5 支持注解方式,到现在注解+反射已经被用烂了,ORMLITE同样使用这种方式进行对象和数据库字段对应。只是 ORMLITE为了支持多平台使用的是 JavaxPersistence

1. 对象如何才能写入到sqlite

2. 数据表和对象Bean映射方式,如何读取映射关系

下面分析OpenHelper

  1. package dragger2.nuoyuan.com.myapplication.db;
  2.  
  3. ...
  4. ...
  5.  
  6. public class DatabaseHelper extends OrmLitesqliteOpenHelper {
  7.  
  8. private Map<String,Dao> daos = new HashMap<String,Dao>();
  9. ...
  10. ...
  11.  
  12. public synchronized Dao getDao(Class clazz) throws sqlException {
  13. Dao dao = null;
  14. String className = clazz.getSimpleName();
  15.  
  16. if (daos.containsKey(className)) {
  17. dao = daos.get(className);
  18. }
  19. if (dao == null) {
  20. dao = super.getDao(clazz);
  21. daos.put(className,dao);
  22. }
  23. return dao;
  24. }
  25.  
  26. ...
  27. ...
  28.  
  29. }

首先介绍这个核心类 OrmLitesqliteOpenHelper extends sqliteOpenHelper ,很明显就是对系统Api进行再封装
上篇已经提到过,也就是所有对数据库的操作都会通过这个 sqliteOpenHelper 来执行。

1.那么首先介绍 ORMlite 是如何知道那些是表名,那些是表字段名。

肯定有地方提供一个声明,不错声明的地方是在Bean中

  1. @DatabaseTable(tableName = "tb_student")
  2. public class Student extends BaseDaoEnabled<Student,Integer> {
  3. @DatabaseField(generatedId = true)
  4. private int id;
  5.  
  6. @DatabaseField(dataType = DataType.STRING)
  7. private String name;
  8.  
  9. public Student() {
  10. }
  11.  
  12. @DatabaseField(generatedId = true)
  13. @DatabaseTable(tableName = "tb_student")
  14. @DatabaseField(dataType = DataType.STRING)
  15.  
  16. 当然不止这三个。
  17.  
  18. @Target(TYPE)
  19. @Retention(RUNTIME)
  20. public @interface DatabaseTable {
  21.  
  22. String tableName() default "";
  23.  
  24.  
  25. Class<?> daoClass() default Void.class;
  26. }

字段注解

  1. 有了这些注解和数据库属性,字段属性一一映射关系,剩下的就是读取注解信息进行操作(当然这是很复杂),那么在什么时机读?
  2. 读过后又怎么处理呢?

看上面的GetDao()方法中的 dao = super.getDao(clazz); 对就是在这个方法中进行注解读取以及缓存,具体操作类 DatabaseTableConfig
,DatabaseFieldConfig 请自行翻阅查看这里不进行展开

  1. 读取注解+反射很耗时,这里进行缓存是很好做法。
  2.  
  3.  
  4. 注解读取与缓存只是关键步骤中的一步,接下来就需要执行sql语句了,既然ORM肯定不会让我们手动敲打 具体sql语法,而是封装过了
  5.  
  6.  
  7. 调用

对象到数据库的映射

还有一些只得注意的API用法

  1. xxxBuilder
  2. create:插入一条数据
  3.  
  4. createIfNotExists:如果不存在则插入
  5.  
  6. createOrUpdate:如果指定id则更新
  7.  
  8. queryForId:更具id查找
  9.  
  10. update 查找出数据
  11.  
  12. 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.
  13.  
  14. delte 删除数据
  15.  
  16. queryBuilder() 创建一个查询生成器:进行复杂查询
  17.  
  18. deleteBuilder() 创建一个删除生成器,进程复杂条件删除
  19.  
  20. updateBuilder() 创建修条件生成器,进行复杂条件修改

条件查找器DeleteBuilder,QueryBuilder,UpdateBuilder

  1. 查找器是帮助拼接条件语句的.比如查找器中有 where()方法 and()方法 eq()方法 lt()方法 qt()方法 between方法这些方法很直观..很容易都明了什么意思
  2.  
  3. 最后使用prepare()方法生成条件使用DAO.query || DAO.delete|| DAO.update 方法执行
  4.  
  5. 可以使用查找生成QueryBuilder orderby limit offset 方法进行排序,分页,

不得不提醒一下事务操作,虽然一般公司很少用到!!!

Eg:

public int deleteByName(String name) {
try {
//int result = userDaoOpe.executeRaw(“DELETE FROM tb_student WHERE name=?”,name);

  1. Where where = userDaoOpe.deleteBuilder().where().eq("name",name);
  2. userDaoOpe.deleteBuilder().setWhere(where);
  3. int result = userDaoOpe.deleteBuilder().delete();
  4. return result;
  5. } catch (sqlException e) {
  6. e.printStackTrace();
  7. }
  8. return -1;

}

事务操作

在我们的Dao中直接写如下代码

  1. //事务操作
  2. TransactionManager.callInTransaction(helper.getConnectionSource(),new Callable<Void>()
  3. {
  4.  
  5. @Override
  6. public Void call() throws Exception
  7. {
  8. return null;
  9. }
  10. });

引用

Ormlite使用: http://blog.163.com/chunhai127@126/blog/static/9497131720121171629974/

注解: http://www.jb51.cc/article/p-wpfmfpes-bbw.html

鸿洋orm:http://www.jb51.cc/article/p-ypmmlbob-kp.html

猜你在找的Sqlite相关文章