IBATIS 2知識点2:IBATIS 2を放出する.3.4.8--IBATIS 2を守る


長々と話して、私はブログでIBATIS 2の欄を開いて、IBATIS 2を守る同僚に自信を持って、盲目的に風の技術に従ってはいけなくて、トンボは水を点けます(結局残したプロジェクトのアップグレードは容易ではありません)!
IBATIS 2は欠陥がありますが、SQL MAPとして開発され、それを持つには十分です!IBATIS 3は最適化、調整を行い、完全にIBATIS 2に互換性がない状態にあるが、SQL MAPモードとして、コード再構築、dynamic sqlの最適化にとどまれば、私たちがフォローする価値もない!
私がIBATISというSQL MAPモデルを力説したのは、「ワンストップ」のORMフレームワークに及ばないアプリケーション環境(eg.局外者の観点から、ライブラリテーブルの設計に介入せず、DAO層の規範化サービスを完全に透明化する)を提供するためであり、詳細は博文IBATIS 2序:T[.WOLF]オープニングテーマを参照してください.
IBATISの欠陥について、皆さんが多く話しているのは以下の点かもしれません.
1データベース移植性のサポートが悪い;
2 sqlを自分で作成し、開発速度に影響を与えなければならない.
③データベース接続プールが足りない;
④関連1:M/M:NにN+1選択の問題があることを解決していない;
⑤ページングは論理ページングを採用し、ビッグデータ量の選択をサポートせず、さらにページング関連機能の失効を招く.
......
相対論の観点から見ると、これらの問題は大きな問題ではありません.
①データベース移植性のサポートが悪い.複数のデータベースをサポートする必要があるプロジェクトはどれくらいありますか?特にバックグラウンド型プロジェクト!
②sqlを自分で作成し、開発速度に影響を与える.「君子性は異ではなく、善偽は物にある」.なぜツールや自分でコードジェネレータを書かないのですか?自分でsqlを書いて、実はこれもSQL MAPの柔軟性の核心です!
③データベース接続プールでは不十分です.この問題については、Springで補うことができます.Spring接着剤の優位性を十分に発揮しましょう.
④関連1:M/M:NにN+1選択の問題は解決していない.この問題はIBATIS 2にある.2.0 groupByのキーワードを借りてすべて解決しました.まだ解決していないと思っている友达がいるのは、中国語のドキュメントの更新がタイムリーに誤導されたためだと思います.公式に提供されている中国語のドキュメントiBATIS-SqlMaps-2_cn.pdfの更新は2004年6月17日で、問題解決の英語ドキュメントiBATIS-SqlMaps-2_en.pdf更新は2006年8月9日です!(注:N+1問題の解決が常に最良であるのではなく、総合的に考慮しなければならない.怠け者のロードが適しているかもしれない)
⑤ページングは論理ページングを採用し、ビッグデータ量の選択をサポートせず、ページング関連機能の失効を招く.これは確かに硬傷だが、救いようがないわけではない.ネット上には、SqlExecutorを継承することで物理的なページングを実現し、アプリケーション内の実際のsqlアクチュエータを反射する友人がたくさんいます(詳細はhttp://pengfeng.iteye.com/blog/200772またはhttp://blog.csdn.net/cyoubunketu/archive/2009/06/06/4246676.aspxを参照してください.googleに行ったばかりです).
 
多くの友达が⑤忙しいためにIBATIS 2の守护者になるのを见て、今日私の⑤に対する解决策を放して、友达のやり方と大同小異で、以下は简単に紹介します.
リリース:iBatis 2.3.4.8;『添付ファイルを参照』
ベース:iBatis 2ターミネーター(V 2.3.4.726)
解決する問題:1データベースの物理ページング選択をサポートする;②インタフェースPaginatedList及び実装クラスPaginatedDataListの古い注釈を削除する.注意:1 Oracleデータベースを使用している場合は、調整する必要がなく、完全に透明です.②MySQLデータベースを使用している場合は、dialectを変更する必要があります.propertiesプロパティファイル;ファイルの場所:com/ibatis/ext/sqlmap/engine/dialect/dialect.properties修正方法:dialectClass=com.ibatis.ext.sqlmap.engine.dialect.Dialect 4 OracleはdialectClass=comに変更されました.ibatis.ext.sqlmap.engine.dialect.Dialect 4 MySQL③他のデータベースを使用する場合は、インタフェースcomを実装する必要があります.ibatis.ext.sqlmap.engine.dialect.Dialect、②を押してdialectを変更します.propertiesプロパティファイル.Oracle版のDialectインタフェース実装コード:
package com.ibatis.ext.sqlmap.engine.dialect;

public class Dialect4Oracle implements Dialect {

 public boolean supportPhysicLimit() {
  return true;
 }
 public String sqlLimitWrapper(String sql, long offset, long maxsize) {
  if (sql.indexOf("select") == -1)
   throw new RuntimeException(
     "the parameter sql of Dialect4Oracle.sqlWrapper is not a valid select sql:
" + sql); sql = sql.trim(); /* get fields of raw sql,if your ibatis version is lower than version2.2.0 or the ibatis version does not support more columns selected than mapped in conf.xml String sqlFields = sql .substring("select".length(), sql.indexOf("from")); */ // construct rule sql StringBuffer dSQL = new StringBuffer(sql.length() + 100); //dSQL.append("select").append(sqlFields).append("from ("); dSQL.append("select").append(" * ").append("from ("); dSQL.append("select tab_.*,rownum rownum_ from (").append(sql).append( ")"); dSQL.append(" tab_ where rownum<=").append(offset + maxsize); dSQL.append(")"); dSQL.append(" where rownum_>").append(offset); //System.out.println(dSQL.toString()); return dSQL.toString(); } }

ページングコールコードフラグメント(WEBモード以外):
PaginatedDataList pagerList = (PaginatedDataList) service.userDaoIntf.queryForPaginatedList("selectUserList", aUser, 10);
do {
 if(!pagerList.isEmpty()) {
  Iterator itr = pagerList.iterator();
  while(itr.hasNext()) {
   //do something,for example as follows
   System.out.println(((User)itr.next()).getUsername());
  }
 }
} while(pagerList.nextPage());

IBATIS 3がまだ成熟していない、まだ多くの支持を得ていない、まだ優秀な特徴を表現していない前に、まず落ち着いて、IBATIS 2を一緒に守ってください.これも私が先ごろIBATIS 2欄を開いてIBATIS 2の基礎知識、ベストプラクティスを紹介しようとした初心です.
 
特にヒント:Hibernateに代表されるワンストップORMの考え方はIBTISというSQL Map方式の半自動化のORMとは異なり、両者にはそれぞれ千秋があり、誰を選ぶか&誰を使うかは実際のプロジェクトの状況によって異なり、これは私が一貫して考えていることです.この2つのフレームワークに関する知識は、知識を共有し、交流するために紹介されます.