一、概述

  在上次greenDao第一篇文章中,我们对greenDao的使用步骤和基本用法给大家做了介绍,文章链接:http://www.cnblogs.com/jerehedu/p/4304766.html

  现在将继续深入学习greenDAO。数据查询展示是应用中最常用的功能之一,greenDAO为我们提供了强大的查询支持,并且采用完全面向对象的方式,即使一点都不懂SQL也没有问题。

二、功能实现

  首先按照上文所述过程生成java实体类和dao类,并插入测试数据,主要代码如下:

  生成器代码:

    public static void main(String[] args) throws IOException, Exception {
//创建schema对象
Schema scheme = new Schema(1, "com.jredu.entity");
scheme.setDefaultJavaPackageDao("com.jredu.dao");
//添加Employee实体
Entity employee= scheme.addEntity("Employee");
employee.addIdProperty();
employee.addStringProperty("name");
employee.addStringProperty("sex");
employee.addDateProperty("birthday");
employee.addDateProperty("hireDate");
employee.addLongProperty("deptno");
//创建java类
new DaoGenerator().generateAll(scheme, "E:\\android_space\\JREDU_GREENDAO\\src");
}

  插入测试数据:

List<Employee> list = new ArrayList<Employee>();
list.add(new Employee(null, "张三", "男", new Date(), new Date(), 1l));
list.add(new Employee(null, "李四", "男", new Date(), new Date(), 1l));
list.add(new Employee(null, "王五", "男", new Date(), new Date(), 1l));
list.add(new Employee(null, "章章", "女", new Date(), new Date(), 1l));
list.add(new Employee(null, "赵六", "女", new Date(), new Date(), 2l));
list.add(new Employee(null, "赵七", "男", new Date(), new Date(), 1l));
employeeDao.insertInTx(list);

  准备工作完成后,我们看看如何使用greenDAO进行数据查询,DAO类除了提供load系列方法外,还通过QueryBuilder对象可以进行复杂查询。

  Load系列方法如下:

public T load(K key):根据主键加载实体对象

public T loadByRowId(long rowId):根据rowId加载实体对象

public List<T> loadAll():加载所有有效实体对象。

  Load系列方法比较简单,在此不做赘述,下面我们主要研究如何通过QueryBuilder对象进行查询。

  QueryBuilder是greenDAO提供的专门用于构建查询的类,使用此类,在查询时我们可以不用使用SQL,比如查询所有员工信息,我们可以使用如下代码:

    //查询所有员工信息
QueryBuilder<Employee> employeeQuerBuilder= employeeDao.queryBuilder();
employeeQuerBuilder.list();

  通过logcat,可查看生成的SQL。

  那么如何进行条件查询?QueryBuilder为我们提供了用于构造查询条件的方法,方法原型如下:

1、public QueryBuilder<T> where(WhereCondition cond, WhereCondition... condMore):使用and连接多个查询条件。

2、public QueryBuilder<T> whereOr(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore):使用or连接多个查询条件。

3、public QueryBuilder<T> orderDesc(Property... properties):排序

4、public WhereCondition or(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore):使用or构成查询条件

5、public WhereCondition or(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore):使用and构成查询条件

  通过以上方法,我们可以看出使用以上方法需要构建WhereCondition对象,通过查看文档我们可以通过Dao类中生成的对应实体的Property对象进行构造,

  property部分源码如下:

/** Creates an "equal ('=')" condition  for this property. */
public WhereCondition eq(Object value) {
return new PropertyCondition(this, "=?", value);
} /** Creates an "not equal ('<>')" condition for this property. */
public WhereCondition notEq(Object value) {
return new PropertyCondition(this, "<>?", value);
} /** Creates an "LIKE" condition for this property. */
public WhereCondition like(String value) {
return new PropertyCondition(this, " LIKE ?", value);
} /** Creates an "BETWEEN ... AND ..." condition for this property. */
public WhereCondition between(Object value1, Object value2) {
Object[] values = { value1, value2 };
return new PropertyCondition(this, " BETWEEN ? AND ?", values);
} /** Creates an "IN (..., ..., ...)" condition for this property. */
public WhereCondition in(Object... inValues) {
StringBuilder condition = new StringBuilder(" IN (");
SqlUtils.appendPlaceholders(condition, inValues.length).append(')');
return new PropertyCondition(this, condition.toString(), inValues);
}

  通过源码我们可以看出,property类中提供了大量构造WhereCondition的方法,这些方法都是用于构造sql语句内容的。下面我们使用一些例子用来说明如何使用:

三、案例实现

例1:查询部门1中所有员工

employeeQuerBuilder.where(EmployeeDao.Properties.Deptno.eq(1l));
employees = employeeQuerBuilder.list();

例2:查询部门1中男性员工和部门2中女性员工

WhereCondition whereCondition1=
employeeQuerBuilder.and(Properties.Deptno.eq(1l),Properties.Sex.eq("男"));
WhereCondition whereCondition2=
employeeQuerBuilder.and(Properties.Deptno.eq(2l),Properties.Sex.eq("女"));
employees =employeeQuerBuilder.whereOr(whereCondition1, whereCondition2).list();

  实际上QueryBuilder对象每次调用list方法查询时都是先创建了一个Query对象,Query对象最终用于查询数据库。通过文档和源码,我们知道Query是一个可重复使用的用于查询返回实体的查询对象。比如例子2中,我们将条件改为查询部门1中的女性员工和部门2中的男性员工,重用例子2中的Query对象,这样要比每次都使用QueryBuilder的list方法更加高效

Query<Employee> query= employeeQuerBuilder.whereOr(whereCondition1, whereCondition2).build();
query.setParameter(0, 1l);
query.setParameter(1, "女");
query.setParameter(2, 2l);
query.setParameter(3, "男");
employees = query.list();

android_orm框架之greenDAO(二)的更多相关文章

  1. android_orm框架之greenDAO(一)

    目录: 一.概述 二.下载并解压greenDAO相关资源 三.应用greenDAO框架 1.创建Java工程 2.添加类库支持 3.创建类 四.代码分析 五.使用greenDAO 六.源码下载 一.概 ...

  2. Android开发数据库之第三方ORM框架(GreenDao)

    移动APP追求追求功能实现的同一时候,用户体验很重要.開始APP的同一时候.要时刻的切换开发人员的角色,如你开发的时候.是 站在APP的开发角色,处于生产者的位置:当你測试的时候.你应该把自己放在用户 ...

  3. Yii PHP 框架分析(二)

    Yii PHP 框架分析(二)作者:wdy http://hi.baidu.com/delphiss/blog/item/54597af595085ad3f3d38552.html Yii是基于组件( ...

  4. Android系统--Binder系统具体框架分析(二)Binder驱动情景分析

    Android系统--Binder系统具体框架分析(二)Binder驱动情景分析 1. Binder驱动情景分析 1.1 进程间通信三要素 源 目的:handle表示"服务",即向 ...

  5. Golang 网络爬虫框架gocolly/colly 二 jQuery selector

    Golang 网络爬虫框架gocolly/colly 二 jQuery selector colly框架依赖goquery库,goquery将jQuery的语法和特性引入到了go语言中.如果要灵活自如 ...

  6. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  7. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(2 配置spring-dao和测试)

    用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 搭建目录环境和依赖) 四:在\resources\spring 下面 ...

  8. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 构建目录环境和依赖)

    引言:在用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建一   的基础上 继续进行项目搭建 该部分的主要目的是测通MyBatis 及Spring-dao ...

  9. 自己写一个java的mvc框架吧(二)

    自己写一个mvc框架吧(二) 自己写代码的习惯 写一个框架吧,如果这个框架会用到一些配置上的东西,我自己习惯是先不用考虑这个配置文件应该是怎样的,什么形式的,先用一个java对象(比如叫 Config ...

随机推荐

  1. 第2篇:用as3.0制作一个滚动条组件

    本实例演示了实现一个滚动条基本功能的制作方法,没有添加改变皮肤,修改滚动条视框大小等功能,有兴趣的朋友可根据自己要求自行添加.使用时只需要通过以下一行代码创建滚动条组件: var myScrollba ...

  2. java String/StringBuilder 方法

    String 定义的对象不能被修改,修改其实是创建了一个新的对象. 如 : String s1 = "1"; s1 = s1+ "2"; 本来s1 是指向”1“ ...

  3. Java电器商场小系统--简单的java逻辑

    //商场类public class Goods { int no; //编号 String name; //商品名称 double price; //商品价格 int number; //商品数量 / ...

  4. Luogu T7152 细胞(递推,矩阵乘法,快速幂)

    Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每 ...

  5. 判断DataRow中是否包含某列

    DataRow dr = new DataRow(); if (dr!=null && dr.Table.Columns.Contains("errormesg") ...

  6. Java设计模式学习笔记,一:单例模式

    开始学习Java的设计模式,因为做了很多年C语言,所以语言基础的学习很快,但是面向过程向面向对象的编程思想的转变还是需要耗费很多的代码量的.所有希望通过设计模式的学习,能更深入的学习. 把学习过程中的 ...

  7. JPush 使用教程

    JPush 使用教程 自己使用的一些经验,为了方便直接从这里复制过去就行. 就当做个笔记,防止长时间忘记之后,还需要去官网看文档. 主要思路: sdk文件 + 三方依赖系统库 + 头文件 + 添加代理 ...

  8. Spring源码情操陶冶-AbstractApplicationContext#obtainFreshBeanFactory

    前言-阅读源码有利于陶冶情操,本文承接前文Spring源码情操陶冶-AbstractApplicationContext 约束: 本文指定contextClass为默认的XmlWebApplicati ...

  9. 初学 Python(十四)——生成器

    初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 ...

  10. Charles录制App的接口har文件

    Charles录制App的接口har文件 如果我们想录制我们自己App后台请求接口的信息,并生成har文件,要怎么做呢?其实很简单,就是通过Charles,让手机的访问请求走这个Charles代理就行 ...