[トリック]のIBatis.Netシステムページング問題の解決

9580 ワード

庭でみんなが関心を持っているIbatisを解決したい.Netページングの実装に関する問題.実は私もIbatisを探しました.Netページングの解決策、庭の中にいくつかあって、どうして私が望んでいる方式を発見していないで、大部分の策略は2回SQL Statementを呼び出して、第1回、条件によって総記録の条数を問合せて、第2回、条件によって第N行からM行のデータの集合を問合せて、このような条件を満たすことができないのではありませんて、正反対に、このような書き方は、完全に既存のプロジェクトの需要を満たすことができて、SQLのチューニングスペースも備えていますが、1つのクエリーで何度も書く弊害があります.多重化が難しい.とても違和感を感じて、私は検索の多いシステムの中で見たことがあって、至る所このページのSQL文にあふれて、もう一つ、もともと私達はただ業務のデータを取得することを実現することに関心を持っていればいいので、毎回機能を実現する基礎の上で、またページのSQL文を加えて、もとの可能性の複雑な文を、更に複雑で理解しにくいことになります.
そのため、私はわざわざreflectでIbatisを見ました.Netのソースコード.彼の処理ロジックに基づいてSqlMapperのインタフェースを拡張し,IListQueryForListWithPageという機能を追加した.注入で実現しようとしたが、Javaを見た筒たちが注入で済ませたことがある.残念だなNetはこのような方法を発見しなかった(私は浅く、見つけられなかったかもしれない).MyBatisがサポートしているようです.しかし、実践したことがない.このコードは、Ibatis 1.62バージョンおよびMSSQLデータベースのみを使用します.もしこの考えが悪くないと感じたら、私のソースコードは共有滴で、完全にソースコードをダウンロードすることができて、あなたが望んでいる他の方法に改造することができます.
ページ分けのSQLについては、個人的にrow_が好きです.numberという方法は,他のページングストレージプロセスのように,TOP方式では筆跡を費やさない.
話が多くて役に立たない.ダイレクトコード
 //      (    GetStudentList sql,  id                 )

 var list = mapper.QueryForListWithPage<T>("GetStudentList", paras, "id asc", 80, 100, ref count);

では、具体的にどのように書くのか、私はc#の拡張方法を採用して、Ibatisを拡張しました.Net標準のSqlMapper機能は、Ibatisに似ているように見えます.Netの元の生態の機能、しかしまたIbatisのソースコードを破壊していないで、このようなプラグイン式、元のIbatisにいかなるBugを導入しません. 
    public static class SqlMapperExtension

    {

        private const string PageSql =

            "with cte as( select id0=row_number() over(order by {0}),* from  ({1}) as cte1) select * from cte where id0 between @beginNo and @endNo";



        private const string CountSql = "select count(*) {0}";



        /// <summary>

        ///     

        /// </summary>

        /// <typeparam name="T">  </typeparam>

        /// <param name="mapper">mapper</param>

        /// <param name="tag">SQL Statement id</param>

        /// <param name="paramObject">  </param>

        /// <param name="orderby"></param>

        /// <param name="beginNo">    </param>

        /// <param name="endNo">    </param>

        /// <param name="totalCount">   </param>

        /// <returns>    </returns>

        public static IList<T> QueryForListWithPage<T>(this ISqlMapper mapper, string tag, object paramObject,string orderby, int beginNo, int endNo, ref int totalCount)

        {

            bool flag = false;

            ISqlMapSession sqlMapSession = mapper.LocalSession;

            if (sqlMapSession == null)

            {

                sqlMapSession = mapper.CreateSqlMapSession();

                flag = true;

            }

            try

            {

                IMappedStatement mappedStatement = mapper.GetMappedStatement(tag);

                IStatement statement = mappedStatement.Statement;

                RequestScope request = statement.Sql.GetRequestScope(mappedStatement, paramObject, sqlMapSession);

                string statementsql = request.PreparedStatement.PreparedSql;

                string cmdPageSql = string.Format(PageSql, orderby, statementsql);

                string cmdCountSql = string.Format(CountSql,statementsql.Substring(statementsql.ToLower().IndexOf("from")));



                request.PreparedStatement.PreparedSql = cmdPageSql;

                request.IDbCommand = new DbCommandDecorator(sqlMapSession.CreateCommand(statement.CommandType), request);

                ApplyParameterMap(sqlMapSession, request.IDbCommand, request, statement, paramObject);

                totalCount = GetCount(request, sqlMapSession, cmdCountSql);

                request.IDbCommand.CommandText = request.PreparedStatement.PreparedSql;

                AddCommandParameters(beginNo, endNo, request);

                IList<T> result = RunQueryForList<T>(statement, request, sqlMapSession, paramObject, null, null);

                return result;

            }

            finally

            {

                if (flag)

                {

                    sqlMapSession.CloseConnection();

                }

            }

        }

    }

園友たちが直接持ってきて使いたいなら、添付ファイルをダウンロードして、Ibatisを引用することができます.Netのdllと同時に、プロジェクトにSqlMapperExtensionというファイルを追加すれば、呼び出しが容易になります.この方法はIbatis.Net1.62バージョンでは、MSSQLを使用してテスト検証に合格しました.OK、ページング機能を使いたくない場合は、次の方法を使用します.  
         var listall = mapper.QueryForList<T>(statementName, paras);


これにより、sqlmapperのxmlにSQL文を書くだけで、すべてのレコードとページングレコード(総本数を含む)を取得する2つのことができます.
いいと思ったら、忘れないでね、ほほほ.