Fonctionnalités avancées : requêtes multi-tables et traitement des données d'ensembles de résultats personnalisés


Requête multi-tables et traitement des données d'ensemble de résultats personnalisés

L'ORM fourni par le module JDBC est principalement destiné aux opérations à entité unique. Les activités réelles impliquent souvent des requêtes liées à plusieurs tables et le retour de plusieurs champs de table dans un ORM à entité unique. les enregistrements de l'ensemble de résultats JDBC ne peuvent pas être automatiquement convertis en objets d'entité. Dans ce cas, un traitement personnalisé des données de l'ensemble de résultats est requis pour répondre aux besoins de l'entreprise.

Si vous souhaitez mettre en œuvre un traitement personnalisé des données de l'ensemble de résultats, vous devez connaître les interfaces et classes associées suivantes :

  • Interface IResultSetHandler : interface de traitement des données de l'ensemble de résultats, utilisée pour terminer la conversion de chaque ligne de l'ensemble de résultats JDBC. données originales dans l'objet Target, le module JDBC fournit trois implémentations de cette interface par défaut :

    EntityResultSetHandler : une implémentation d'interface qui utilise des classes d'entité pour stocker les données de l'ensemble de résultats. Cette classe a été intégrée dans la logique métier de l'interface de session ISession et est. utilisé uniquement pour traiter la conversion de données ;

    MapResultSetHandler : une implémentation d'interface qui utilise Map pour stocker les données de l'ensemble de résultats ;

    ArrayResultSetHandler : une implémentation d'interface qui utilise un tableau Object[] pour stocker les données de l'ensemble de résultats ;

    Classe ResultSetHelper : un outil de traitement auxiliaire pour les ensembles de résultats de données, utilisé Pour aider les développeurs à lire et parcourir facilement le contenu des données dans l'ensemble de résultats, seuls les types de données d'ensemble de résultats générés par ArrayResultSetHandler et MapResultSetHandler sont pris en charge 
  • Les introductions suivantes ; comment l'interface IResultSetHandler et la classe ResultSetHelper sont utilisées ensemble via une simple requête d'association multi-table :

  • Exemple de code 1 : utilisez ArrayResultSetHandler ou MapResultSetHandler pour traiter les données de l'ensemble de résultats 

    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;
        }
    });

Exemple de code deux : utilisez IResultSetHandler personnalisé pour traiter les données de l'ensemble de résultats ;