[トリック]の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方式では筆跡を費やさない.
話が多くて役に立たない.ダイレクトコード
では、具体的にどのように書くのか、私はc#の拡張方法を採用して、Ibatisを拡張しました.Net標準のSqlMapper機能は、Ibatisに似ているように見えます.Netの元の生態の機能、しかしまたIbatisのソースコードを破壊していないで、このようなプラグイン式、元のIbatisにいかなるBugを導入しません.
園友たちが直接持ってきて使いたいなら、添付ファイルをダウンロードして、Ibatisを引用することができます.Netのdllと同時に、プロジェクトにSqlMapperExtensionというファイルを追加すれば、呼び出しが容易になります.この方法はIbatis.Net1.62バージョンでは、MSSQLを使用してテスト検証に合格しました.OK、ページング機能を使いたくない場合は、次の方法を使用します.
これにより、sqlmapperのxmlにSQL文を書くだけで、すべてのレコードとページングレコード(総本数を含む)を取得する2つのことができます.
いいと思ったら、忘れないでね、ほほほ.
そのため、私はわざわざreflectでIbatisを見ました.Netのソースコード.彼の処理ロジックに基づいてSqlMapperのインタフェースを拡張し,IList
ページ分けの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つのことができます.
いいと思ったら、忘れないでね、ほほほ.