ORMLite 映射分析

前言

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

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 请自行翻阅查看这里不进行展开

读取注解+反射很耗时,这里进行缓存是很好做法。


注解读取与缓存只是关键步骤中的一步,接下来就需要执行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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灯塔@kuaidao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值