概述 核心概述 包类的自动扫描(AutoScan) 依赖注入(IoC) 方法拦截(AOP) 记录类属性状态 (PropertyState) 事件服务(Event) 模块(Module) 国际化(I18N) Lang 配置体系概述 配置体系目录结构及配置 示例一:解析XML配置 示例二:解析Properties配置 配置体系模块更多操作 日志概述 日志模块配置 使用示例 JDBC持久化概述及模块配置 数据源(DataSource) 数据实体(Entity) 自动生成实体类(方式一) 自动生成实体类(方式二) 事务(Transaction) 会话(Session) 数据实体操作 结果集(ResultSet) 查询(Query) 存储器(Repository) 高级特性—多表查询及自定义结果集数据处理 高级特性—存储过程调用与结果集数据处理 高级特性—数据库锁操作 插件概述 插件工厂 自定义插件工厂 插件结构 插件的实现及使用 服务概述 服务端(Server)示例 客户端(Client)示例 客户端和服务端对象的使用 验证概述 默认验证器及参数说明 默认国际化资源文件内容 验证框架使用示例 自定义验证器 缓存概述 缓存模块配置 缓存模块使用示例 WebMVC概述 模块初始化及配置说明 控制器(Controller) 控制器参数(Parameter) 环境上下文对象(WebContext) 文件上传(Upload) 视图(View) 验证(Validation) 缓存(Cache) 拦截器(Intercept) Cookies操作 国际化(I18N) 约定模式(Convention Mode) 高级特性—控制器请求处理器 高级特性—异常错误处理器

概述

YMP在线手册

浏览13637
更新时间2022-04-11
多表查询及自定义结果集数据处理

JDBC模块提供的ORM主要是针对单实体操作,实际业务中往往会涉及到多表关联查询以及返回多个表字段,在单实体ORM中是无法将JDBC结果集记录自动转换为实体对象的,这时就需要对结果集数据自定义处理来满足业务需求。

若想实现结果集数据的自定义处理,需要了解以下相关接口和类:

  • IResultSetHandler接口:结果集数据处理接口,用于完成将JDBC结果集原始数据的每一行记录进行转换为目标对象,JDBC模块默认提供了该接口的三种实现:

    EntityResultSetHandler:采用实体类存储结果集数据的接口实现,此类已经集成在ISession会话接口业务逻辑中,仅用于处理单实体的数据转换;

    MapResultSetHandler:采用Map存储结果集数据的接口实现;

    ArrayResultSetHandler:采用Object[]数组存储结果集数据的接口实现;

  • ResultSetHelper类:数据结果集辅助处理工具,用于帮助开发人员便捷的读取和遍历结果集中数据内容,仅支持由 ArrayResultSetHandler 和 MapResultSetHandler 产生的结果集数据类型;

下面通过简单的多表关联查询来介绍IResultSetHandler接口和ResultSetHelper类如何配合使用:

示例代码一:使用ArrayResultSetHandler或MapResultSetHandler处理结果集数据;

    IResultSet<Object[]> _results = JDBC.get().openSession(new ISessionExecutor<IResultSet<Object[]>>() {
        public IResultSet<Object[]> execute(ISession session) throws Exception {
            // 通过查询对象创建SQL语句:
            //
            // SELECT u.id id, u.username username, ue.money money 
            //          FROM user u LEFT JOIN user_ext ue ON u.id = ue.uid
            //
            Select _uSelect = Select.create(User.class, "u")
                    .join(Join.left(UserExt.TABLE_NAME).alias("ue")
                            .on(Cond.create()
                                    .opt("u", User.FIELDS.ID, Cond.OPT.EQ, "ue", UserExt.FIELDS.UID)))
                    .field(Fields.create()
                            .add("u", User.FIELDS.ID, "id")
                            .add("u", User.FIELDS.USER_NAME, "username")
                            .add("ue", UserExt.FIELDS.MONEY, "money"));

            // 执行查询并指定采用Object[]数组存储结果集数据,若采用Map存储请使用:IResultSetHandler.MAP
            return session.find(SQL.create(_uSelect), IResultSetHandler.ARRAY);
        }
    });

    // 采用默认步长(step=1)逐行遍历
    ResultSetHelper.bind(_results).forEach(new ResultSetHelper.ItemHandler() {
        public boolean handle(ResultSetHelper.ItemWrapper wrapper, int row) throws Exception {
            System.out.println("当前记录行数: " + row);

            // 通过返回的结果集字段名取值
            String _id = wrapper.getAsString("id");
            String _uname = wrapper.getAsString("username");

            // 也可以通过索引下标取值
            Double _money = wrapper.getAsDouble(2);

            // 也可以直接将当前行数据赋值给实体对象或自定义JavaBean对象
            wrapper.toEntity(new User());

            // 当赋值给自定义的JavaBean对象时需要注意返回的字段名称与对象成员属性名称要一一对应并且要符合命名规范
            // 例如:对象成员名称为"userName",将与名称为"user_name"的字段对应
            wrapper.toObject(new User());

            // 返回值将决定遍历是否继续执行
            return true;
        }
    });

    // 采用指定的步长进行数据遍历,此处step=2
    ResultSetHelper.bind(_results).forEach(2, new ResultSetHelper.ItemHandler() {
        public boolean handle(ResultSetHelper.ItemWrapper wrapper, int row) throws Exception {
            // 代码略......
            return true;
        }
    });

示例代码二:使用自定义IResultSetHandler处理结果集数据;

    // 自定义JavaBean对象,用于封装多表关联的结果集的记录
    public class CustomUser {

        private String id;

        private String username;

        private Double money;

        // 忽略Getter和Setter方法
    }

    // 修改示例一的代码,将结果集中的每一条记录转换成自定义的CustomUser对象
    IResultSet<CustomUser> _results = JDBC.get().openSession(new ISessionExecutor<IResultSet<CustomUser>>() {
        public IResultSet<CustomUser> execute(ISession session) throws Exception {
            Select _uSelect = Select.create(User.class, "u")
                    .join(Join.left(UserExt.TABLE_NAME).alias("ue")
                            .on(Cond.create()
                                    .opt("u", User.FIELDS.ID, Cond.OPT.EQ, "ue", UserExt.FIELDS.UID)))
                    .field(Fields.create()
                            .add("u", User.FIELDS.ID, "id")
                            .add("u", User.FIELDS.USER_NAME, "username")
                            .add("ue", UserExt.FIELDS.MONEY, "money"));

            // 通过实现IResultSetHandler接口实现结果集的自定义处理
            return session.find(SQL.create(_uSelect), new IResultSetHandler<CustomUser>() {
                public List<CustomUser> handle(ResultSet resultSet) throws Exception {
                    List<CustomUser> _results = new ArrayList<CustomUser>();
                    while (resultSet.next()) {
                        CustomUser _cUser = new CustomUser();
                        _cUser.setId(resultSet.getString("id"));
                        _cUser.setUsername(resultSet.getString("username"));
                        _cUser.setMoney(resultSet.getDouble("money"));
                        //
                        _results.add(_cUser);
                    }
                    return _results;
                }
            });
        }
    });

相关视频

更多

免费

php8,我来也
初级php8,我来也

34万次学习

收藏

免费

Thinkphp6.0正式版视频教程
中级Thinkphp6.0正式版视频教程

39.6万次学习

收藏

免费

细说PHP第一季
中级细说PHP第一季

31万次学习

收藏

精品课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

64.9万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

41.2万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

76.6万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

64.1万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

24.3万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

36.2万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

133.1万人学习

热门下载

更多
phpStudy 2018最新版
phpStudy 2018最新版

集成PHP7,16种组合,超全大合集

下载

VC9 32位
VC9 32位

VC9 32位 phpstudy集成安装环境运行库

下载

VC11 32位
VC11 32位

VC11 32位 phpstudy集成安装环境运行库​

下载

php程序员工具箱完整版
php程序员工具箱完整版

程序员工具箱 v1.0 php集成环境

下载

VC14 32位
VC14 32位

VC14 32位 phpstudy安装环境运行库

下载

SublimeText3汉化版
SublimeText3汉化版

中文版,非常好用

下载

Notepad++ Windows版
Notepad++ Windows版

Notepad++ 8.9.7 Windows版官方安装包,适合 Windows 用户进行代码编辑、文本处理、语法高亮和插件扩展配置。

下载