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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容