Foxnic-SQL (8) —— DAO 特性 : 数据查询

LeeFJ
• 阅读 427

Foxnic-SQL (8) —— DAO 特性 : 数据查询

概述

  Foxnic-SQL 的 DAO 对象包含了非常丰富的查询功能,可以查询记录、数据实体(Po对象)、单值。针对不同的数据库 DAO 对象已经实现了默认的分页功能。DAO 中所有的查询方法都支持 SQL 字符串查询、SQL 对象查询。下面我们来具体看一下这些功能。
  本文中的示例代码均可在 https://gitee.com/LeeFJ/foxnic-samples 项目中找到。

查询记录集

  默认情况下,JDBC 查询返回的是 ResultSet(游标),由于打开的 ResultSet 会占用资源,所以 DAO 会先把数据转存至 RcdSet 。RcdSet 就是记录集,在没有 Po 模型时,直接使用 RcdSet 是非常方便的。本节并不对 RcdSet 进行展开,我们后面的章节会单独讲解 RcdSet 的使用方法。
记录集查询包含分页和不分页两种查询的模式,我们先来看看常规的不分页的查询模式:

/**
* 1、查询不分页记录集
* */
public static void queryRcdSetNoPage() {
    // 通过 DBInstance 拿到 DAO 对象
    Date date= DateUtil.addDays(new Date(),-1000);
    DAO dao= DBInstance.DEFAULT.dao();
    // 执行查询
    RcdSet rs=dao.query("select * from sys_role where create_time>?",date);
    int i=0;
    // 遍历数据
    for (Rcd r : rs) {
        System.out.println(i+" - "+r.toJSONObject());
        i++;
    }

    // DAO 创建查询语句进行查询
    rs=dao.select().from("sys_role").where("create_time>?",date).top().query();
    i=0;
    // 遍历数据
    for (Rcd r : rs) {
        System.out.println(i+" - "+r.toJSONObject());
        i++;
    }
}

  下面的例子是分页查询记录集:

/**
* 2、查询分页记录集
* */
public static void queryRcdSetPaginated() {
    // 通过 DBInstance 拿到 DAO 对象
    Date date= DateUtil.addDays(new Date(),-1000);
    DAO dao= DBInstance.DEFAULT.dao();
    // 指定分页大小
    Integer pageSize=10;
    // 模拟翻页动作:常规方式查询
    for (int pageIndex = 0; pageIndex < 10; pageIndex++) {
        // 执行分页查询
        RcdSet rs=dao.queryPage("select * from sys_resourze where create_time>?",pageSize,pageIndex,date);
        int i=0;
        // 遍历数据
        for (Rcd r : rs) {
            System.out.println("page "+pageIndex+"."+i+" - "+r.toJSONObject());
            i++;
        }
        // 输出分页信息
        System.out.println("total rows = "+rs.getTotalRowCount()+" ; total pages = "+rs.getPageCount()+"; pageIndex = "+rs.getPageIndex()+" ; pageSize = "+rs.getPageSize());
    }

    // 模拟翻页动作,QueryableSQL 方式查询
    for (int pageIndex = 0; pageIndex < 10; pageIndex++) {
        // 执行分页查询,QueryableSQL 方式
        RcdSet rs=dao.expr("select * from sys_resourze where create_time>?",date).queryPage(pageSize,pageIndex);
        int i=0;
        // 遍历数据
        for (Rcd r : rs) {
            System.out.println("page "+pageIndex+"."+i+" - "+r.toJSONObject());
            i++;
        }
        // 输出分页信息
        System.out.println("total rows = "+rs.getTotalRowCount()+" ; total pages = "+rs.getPageCount()+"; pageIndex = "+rs.getPageIndex()+" ; pageSize = "+rs.getPageSize());
    }
}

  上面的两个例子中都是用了 QueryableSQL 方式查询,QueryableSQL 是一个可查询的 SQL 对象接口,所有实现 QueryableSQL 接口的类,均可执行与查询相关的方法。

查询单记录

  很多场合下,我们需要查询单个记录,例如按ID查询。DAO 对象在查询单个记录时,如果 SQL 语句返回多行,则默认第一行返回。示例如下:

/**
* 3、查询单个记录
* */
public static void querySingleRcd() {
    // 通过 DBInstance 拿到 DAO 对象
    DAO dao= DBInstance.DEFAULT.dao();
    String roleId="631081950060216320";
    // 常规方式查询
    Rcd r=dao.queryRecord("select * from sys_role where id=?",roleId);
    System.out.println("role-1 = "+r.toJSONObject());
    // QueryableSQL 方式查询
    r=dao.select().from("sys_role").where("id=?",roleId).top().queryRecord();
    System.out.println("role-2 = "+r.toJSONObject());
}

查询单一值

  除了返回单个记录,有些时候我们也希望返回单个值,例如 count 统计等。DAO 对象在查询单个值时,如果 SQL 语句返回多行多列,则默认第一行第一列的值。示例如下:

/**
* 4、查询单个值
* */
public static void querySingleValue() {
    // 通过 DBInstance 拿到 DAO 对象
    DAO dao= DBInstance.DEFAULT.dao();
    String roleId="631081950060216320";
    // 常规方式查询
    Integer count=dao.queryInteger("select count(1) from sys_role where id=?",roleId);
    System.out.println("count-1 = "+count);
    // QueryableSQL 方式查询
    count=dao.select().select("count(1)").from("sys_role").where("id=?",roleId).top().queryInteger();
    System.out.println("count-2 = "+count);
}

查询实体集

  如果,项目里已经创建了Po对象(手动或自动均可),那么就直接通过 DAO 查询 Po 会显得更加方便和易于使用。当然 Po 对象和记录比各有优势,Po 是固化的模型,利于编程,记录则主要体现它的动态性,适合一些配置复杂的场景,大家可按实际场景选择。
实体查询同样支持分页和不分页,我们先来看看不分页的查询:

/**
* 5、查询不分页实体集
* */
public static void queryPoListNoPage() {
    // 通过 DBInstance 拿到 DAO 对象
    Date date= DateUtil.addDays(new Date(),-1000);
    DAO dao= DBInstance.DEFAULT.dao();
    // 执行查询
    List<Address> list=dao.queryEntities(Address.class,"select * from example_address where create_time>?",date);
    int i=0;
    // 遍历数据
    for (Address address : list) {
        System.out.println(i+" - "+ JSON.toJSONString(address));
        i++;
    }

    // DAO 创建查询语句进行查询
    list=dao.select().from("example_address").where("create_time>?",date).top().queryEntities(Address.class);
    i=0;
    // 遍历数据
    for (Address address : list) {
        System.out.println(i+" - "+ JSON.toJSONString(address));
        i++;
    }
}

  下面的例子是分页查询实体集:

/**
* 6、查询分页实体集
* */
public static void queryPoListPaginated() {
    // 通过 DBInstance 拿到 DAO 对象
    Date date= DateUtil.addDays(new Date(),-1000);
    DAO dao= DBInstance.DEFAULT.dao();
    // 指定分页大小
    Integer pageSize=10;
    // 模拟翻页动作:常规方式查询
    for (int pageIndex = 0; pageIndex < 10; pageIndex++) {
        // 执行分页查询
        PagedList<Address> list=dao.queryPagedEntities(Address.class,pageSize,pageIndex,"select * from sys_resourze where create_time>?",date);
        int i=0;
        // 遍历数据
        for (Address address : list) {
            System.out.println(i+" - "+ JSON.toJSONString(address));
            i++;
        }
        // 输出分页信息
        System.out.println("total rows = "+list.getTotalRowCount()+" ; total pages = "+list.getPageCount()+"; pageIndex = "+list.getPageIndex()+" ; pageSize = "+list.getPageSize());
    }

    // 模拟翻页动作,QueryableSQL 方式查询
    for (int pageIndex = 0; pageIndex < 10; pageIndex++) {
        // 执行分页查询,QueryableSQL 方式
        IPagedList<Address> list=dao.expr("select * from sys_resourze where create_time>?",date).queryPagedEntities(Address.class,pageSize,pageIndex);
        int i=0;
        // 遍历数据
        for (Address address : list) {
            System.out.println(i+" - "+ JSON.toJSONString(address));
            i++;
        }
        // 输出分页信息
        System.out.println("total rows = "+list.getTotalRowCount()+" ; total pages = "+list.getPageCount()+"; pageIndex = "+list.getPageIndex()+" ; pageSize = "+list.getPageSize());
    }
}

查询单实体

  单实体查询和单记录查询相似,直接上代码:

/**
* 7、查询单个实体
* */
public static void querySinglePo() {
    // 通过 DBInstance 拿到 DAO 对象
    DAO dao= DBInstance.DEFAULT.dao();
    String addressId="651345265952817152";
    // 常规方式查询
    Address address=dao.queryEntityById(Address.class,addressId);
    System.out.println("address-1 = "+JSON.toJSONString(address));
    // QueryableSQL 方式查询
    address=dao.select().from("sys_role").where("id=?",addressId).top().queryEntity(Address.class);
    System.out.println("address-2 = "+JSON.toJSONString(address));
    // Sample 方式查询
    address=new Address();
    address.setId(addressId);
    address=dao.queryEntity(address);
    System.out.println("address-3 = "+JSON.toJSONString(address));
}

小结

  本节主要介绍了 Foxnic-SQL 中使用 DAO 对象查询记录、实体、单一值的方法。同时,DAO 已适配不同数据库的分页查询。记录集(RcdSet)是 DAO 查询最初的数据载体,关于 RcdSet 更多特性,将在后续章节进行介绍。

相关项目

  https://gitee.com/LeeFJ/foxnic
  https://gitee.com/LeeFJ/foxnic-web
  https://gitee.com/lank/eam
  https://gitee.com/LeeFJ/foxnic-samples

官方文档

  http://foxnicweb.com/docs/doc.html

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java中的VO DTO DAO
VO是跟数据库里表的映射,一个表对应一个VODAO是用VO来访问真实的表,对数据库的操作都在DAO中完成BO是业务层,做逻辑处理的VO,PO,BO,QO,DAO,POJOO/RMapping是ObjectRelationalMapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示
Stella981 Stella981
3年前
Mybatis 通用Crud
更新日志<!20161113更新start1新增批量操作数据方法:批量插入,根据条件删除,根据条件更新指定的列名字段值。2新增高级查询方法:可设置查询列,查询条件,排序,分页。3根据1、2更新接口。4更改dao接口方法实现方式,统一采用GeneralMapper.xml编写sql,弃用General
Stella981 Stella981
3年前
Action层, Service层 和 Dao层的功能区分
1.Action/Service/DAO简介:Action是管理业务(Service)调度和管理跳转的。 Service是管理具体的功能的。 Action只负责管理,而Service负责实施。 DAO只完成增删改查,虽然可以1n,nn,11关联,模糊、动态、子查询都可以。但是无论多么复杂的查询,dao
Stella981 Stella981
3年前
Spring 对 DAO 的支持
一、Spring的DAO理念DAO(DataAccessObject)是用于访问数据的对象,虽然在大多数情况下将数据保存在数据库中,但这并不是唯一的选择,也可以将数据存储到文件中或LDAP中。DAO不但屏蔽了数据存储的最终介质的不同,也屏蔽了具体的实现技术的不同。早期,JDBC是访问数据库的主流选择。近几年,数据持久化技术获
Wesley13 Wesley13
3年前
Hibernate(五)——面向对象查询语言和锁
Hibernate做了数据库中表和我们实体类的映射,使我们不必再编写sql语言了。但是有时候查询的特殊性,还是需要我们手动来写查询语句呢,Hibernate框架为了解决这个问题给我们提供了HQL(Hibernate Query  Language)面向对象的查询语言,和QBC(QuerybyCriteria)完全面向对象的
Stella981 Stella981
3年前
Hibernate反射DAO模式
在持久层框架中,如果我们要像简单的JDBC连接数据库那样写一个通用的Dao方法的话,那么把JDBC简单的业务逻辑搬到hibernate持久层框架中,当然是不可能的,这里主要的问题就在于hibernate持久层框架中,因为它不是像JDBC那样简单的增删改查的编写,而是要针对实体类映射配置文件来对照数据库表字段进行操作,而且操作是面向对象的查询,不是简单的sql
LeeFJ LeeFJ
2年前
Foxnic-SQL (5) —— 创建与初始化DAO
DAO对象是FoxnicSQL执行语句并返回结果的核心对象。它包含了众多方法,包括语句的执行、查询、序列、存储过程,元数据等。本文中的示例代码均可在https://gitee.com/LeeFJ/foxnicsamples项目中找到。
LeeFJ LeeFJ
2年前
Foxnic-SQL (6) —— DAO 特性 : 基本信息与元数据
DAO对象创建后就可以使用DAO对象了,DAO最基本的特性就是获取数据库的一些基础信息,这些信息有利于开发者在某些场景下做出正确的判断。本文中的示例代码均可在https://gitee.com/LeeFJ/foxnicsamples项目中找到。
LeeFJ LeeFJ
2年前
Foxnic-SQL (7) —— DAO 特性 : 执行 SQL 语句
FoxnicSQL支持多种语句执行方式,包括直接执行SQL字符串、执行SQL对象,SQL对象自执行,多语句执行与批量执行。FoxnicSQL显著的特征是DAO对象既可以执行字符串的SQL语句,也可以执行对象化的SQL语句。
LeeFJ LeeFJ
2年前
Foxnic-SQL (11) —— DAO 特性 : 事务管理
事务管理是任何一个数据层工具所必须的,FoxnicSQL既然是基于SpringJDBC的自然默认就支持@Transactional注解,另外FoxnicSQL的DAO对象还支持手动事务。本文中的示例代码均可在https://gitee.com/LeeFJ/foxnicsamples项目中找到。手动事务手动事务通过DAO对象的beginTransaction()方法、commit()方法、rollback()方法完成,下面是一个手动事务的例子: