Ciri lanjutan—pertanyaan berbilang jadual dan pemprosesan data set hasil tersuai


Pertanyaan berbilang jadual dan pemprosesan data set hasil tersuai

ORM yang disediakan oleh modul JDBC adalah terutamanya untuk operasi entiti tunggal selalunya melibatkan pertanyaan berkaitan berbilang jadual dan mengembalikan berbilang medan jadual. ia adalah rekod set hasil JDBC tidak boleh ditukar secara automatik kepada objek entiti Dalam kes ini, pemprosesan tersuai data set hasil diperlukan untuk memenuhi keperluan perniagaan.

Jika anda ingin melaksanakan pemprosesan tersuai bagi data set hasil, anda perlu mengetahui antara muka dan kelas berkaitan berikut:

  • Antara muka IResultSetHandler: Antara muka pemprosesan data set hasil, digunakan untuk melengkapkan penukaran setiap baris set hasil JDBC data asal ke dalam objek Sasaran, modul JDBC menyediakan tiga pelaksanaan antara muka ini secara lalai:

    EntityResultSetHandler: pelaksanaan antara muka yang menggunakan kelas entiti untuk menyimpan data set hasil Kelas ini telah disepadukan ke dalam logik perniagaan antara muka sesi ISession hanya digunakan untuk memproses penukaran data;

    MapResultSetHandler: pelaksanaan antara muka yang menggunakan Map untuk menyimpan data set hasil;

    Kelas ResultSetHelper: alat pemprosesan tambahan untuk set hasil data, digunakan Untuk membantu pembangun membaca dan melintasi kandungan data dengan mudah dalam set hasil, hanya jenis data set hasil yang dijana oleh ArrayResultSetHandler dan MapResultSetHandler disokong

    yang berikut cara antara muka IResultSetHandler dan kelas ResultSetHelper digunakan bersama-sama melalui pertanyaan perkaitan berbilang jadual yang mudah :
  • Sampel kod satu: Gunakan ArrayResultSetHandler atau MapResultSetHandler untuk memproses data set hasil

  •     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;
            }
        });
    dua
Result

Gunakan kod

Result

tersuai

Result
ResultSetHandler; proses data set keputusan;