マルチテーブルジョイントクエリを実装します
または、David.mybatis.modelパッケージの下に新しいWebサイトクラスを作成して、データを持続し、対応するtoString()メソッドを書き換えて、テストプログラムの使用を容易にします。
パッケージDavid.mybatis.model; Import java.text.simpledateformat; Import java.util.date; public class webサイト{private int id;プライベート文字列名; private int visitorid;プライベートINTステータス;プライベートデートCreateTime;個人訪問者の訪問者。 public webサイト(){// dodo auto-enerated constructor stub createtime = new date(); Visitor = new Visitor(); } public Webサイト(String name、int VisitorID){this.name = name; this.visitorid = visitorid; Visitor = new Visitor();ステータス= 1; createTime = new Date(); } public int getId(){return id; } public void setid(int id){this.id = id; } public Visitor getVisitor(){return visitor; } public void setVisitor(訪問者訪問者){this.visitor = visitor; } public string getname(){return name; } public void setName(string name){this.name = name; } public int getStatus(){return status; } public void setStatus(int status){this.status = status; } public date getCreatetime(){return createTime; } public void setCreatetime(date createTime){this.createtime = createTime; } public int getVisitorId(){int id = 0; if(visitor == null)id = visitorid; else id = visitor.getId(); IDを返します。 } public void setvisitorid(int visitorid){this.visitorid = visitorid; } @Override public String toString(){StringBuilder sb = new StringBuilder(String.Format( "webサイト=> {id:%d、name:%s、createtime:%s}/r/n"、id、name、new simpledateformat( "yyyymm-dd hh:mm:ss")。 if(visitor!= null)sb.append(string.format( "visitor =>%s"、visitor.toString())); return sb.tostring(); }}David.mybatis.demoの下に対応する操作インターフェイスを作成します:
パッケージDavid.mybatis.demo; Import java.util.list; Import David.mybatis.model.website; public interface iwebsiteoperation {public int add(webサイトWebサイト); public int delete(int id); public int Update(WebサイトWebサイト);パブリックウェブサイトクエリ(int id); public List <website> getList(); }Mapperフォルダーに新しいwebsitemapper.xmlマッピングファイルを作成し、前のファイルを参照して、テストデータを作成できるように、単一のテーブル操作構成を追加、削除、変更、およびチェックします。次のように
<?xml version = "1.0" encoding = "utf-8"?> <!doctype mapper public " - // mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd <sql id = "getListsQl"> Select id、name、visitorid、status、createTime from where status> 0 </sql> <id = "add" parametertype = "webサイト" usegeneratedkeys = "true" keyproperty = "id"> website(name、visiterid、createTime、#{nam #{createTime})</insert> <delete id = "delete" parametertype = "int"> delete where where status> 0および#{id} </delete> <uppated parametertype = "website"> uppated website name = {name}ここで、ステータス> resultmap = "websiters"> select website.id siteid、website.name sitename、visitor.id visitorid、visitorid.name visitorname、website.status sitestatus、website.createtime sitecreatetime from webサイト。 id = "websiters"> <id column = "siteid" property = "id" /> <result column = "sitename" property = "name" /> <result column = "sitestatus" property " /> <result column =" sitecreatetime "property =" createtime " /> <association property =" visitor "javatitor" visitor "visitiTor" type = "Visitor" ID = "VisitOrrs"> <id column = "VisitorId" Property = "id" /> <result column = "visitorname" property = "name" /> < /< /resultmap> <select id = "getList" resultmap = "websitebyvisitoridrs"> <includ refid = "getListsql" />今日主に話しているのは検索です。次に、ウェブサイトを照会し、対応する訪問者情報を一緒に取り出したいと思います。それをする方法は?構成のクエリを参照し、リンクテーブルクエリのSQLを書き留めることができます。
ここで注意すべき主なことは、Webサイトエンティティと訪問エンティティのIDと名前の2つのプロパティが同じであるということです。したがって、マッピングエラーを回避するために、対応するクエリの結果を異なるエイリアスでリストして、バインディング時に回避できるようにします。
次のように構成したら何が得られますか?
<選択id = "query" parametertype = "int" resultmap = "websiters"> select website.id、website.name sitename、visitor.id、visitor.name visitorname、website.createtime sitecreatetime from website inner join visitor on visitorid = visitor = visitor.id website.id =#{id} < /select> <resultmap type = "website" id = "websiters"> <id column = "id" property = "id" /> <result column = "sitename" property = "name" /> <result column = "sitestatus" property = "status" /> <result column = "sitectime" /"visiTeTime" " resultMap = "VisitOrrs" /> < /resultmap> <resultmap type = "visitor" id = "visitorrs"> <id column = "id" property = "id" /> <result column = "visitorname" property = "name" /> < /resultmap> <訪問者のIDも2になっていることに気づきましたか?実際、SQLステートメントクエリの結果が両方になったため、デフォルトでWebサイトIDをマッピングします。 website.idとvisit.idの場所を切り替えると、結果が再び魔法のように変化したことがわかります。
したがって、この状況を避けるためにエイリアスを提供する必要があるため、実際には1つの真実しかないことがわかります。これは次のとおりです。
マルチテーブル処理結果マップの方法は、単一のテーブルの方法と同じであることがわかります。 Javabean属性の名前をリストすることにすぎません。 Webサイトの<sultsMap>ノードのフロントデスクに別の結果マップがあることがわかります。これは、訪問エンティティによってマッピングする必要があるエンティティを表します。次の方法を使用して、関連付けを行うことができます。
<Association Property = "Visitor" Javatype = "Visitor" resultmap = "VisitOrrs" />
訪問者は、Webサイトエンティティの訪問フィールド名です。名前は一貫している必要があります。それ以外の場合、「クラスDavid.mybatis.model.website」に「xxx」という名前のプロパティのゲッターがありません。これは前の章で説明されています。もちろん、ネストマップをネストしないことが問題ないと思う場合、ネストはこの構成を他の場所で使用できるという事実によるものであり、抽出されます。これも抽象的なアイデアです。 IDを使用して<sultsMap>で結果を使用して、公式Webサイトからの対応する違いを見つけます:http://mybatis.github.io/mybatis-3/sqlmap-xml.html#result_maps
このようにして、シンプルなマルチテーブルジョイントクエリが発表されます。より複雑なクエリのビジネス料金がある場合、これに基づいていくつかの変更が行われます。
ページネーション効果ロジック
私たちが話したいのは、ビジネス上の問題でよく遭遇するページネーションの問題です。 Webプロジェクトを開発するときは、リストディスプレイを使用します。一般的に、データテーブルなどの一般的に使用されるリストコントロール(私は個人的に非常に気分が良い)や、Easy UIの下でカプセル化されたテーブルコントロールを使用します。
アイデア:これらのコントロールでのページングの効果を実現するために、通常、2つのパラメーターを渡します。 1つ目は、現在のページのインデックス(通常0から始まる)を表すことです。2番目は、現在のページに表示されるビジネスレコードの数を表し、対応するパラメーターをリスト<t> getList(pagenateargs args)メソッドに渡すことです。最終的にデータベースにページングを実装すると、ページングにLimitキーワード(MySQL)を使用できます。 OracleまたはSQL Serverの場合、それらはすべて使用する独自のRownum関数を持っています。
上記のアイデアに対処するには、最初に、Demo.mybatis.modelの下でPagenateargsという名前の新しいページパラメーターエンティティクラスを作成する必要があります。 (pagestart = pageindex*pagesize)制限キーワードの使用は[制限開始番号(含まれていない)を表す、いくつかのアイテムを取得]、Orderfieldstrソートフィールド、OrderDirectionStrソート方向であるため、特定の作成は次のとおりです。
パッケージdavid.mybatis.model;
/ * * Pagination Parameter Entity Class */public class pagenateargs {private int pageindex; Private int Pagesize; Private Int Pagestart; Private String OrderfieldStr; Private String OrderDirectionStr; public pagenateargs(){// todo auto-enerated constructor stub} public pagenateargs(int pageindex、int pagesize、string orderfieldstr、string orderdirectionstr){this.pageindex = pageindex; this.pagesize = pagesize; this.OrderFieldStr = OrderFieldStr; this.OrderDirectionStr = OrderDirectionStr; pagestart = pageindex * pagesize; } public int getPageIndex(){return pageindex; } public int getPagestart(){pagestartを返します。 } public int getPagesize(){return pagesize; } public string orderfieldstr(){return orderfieldstr; } public string getOrderDirectionStr(){return orderDirectionStr; }} package david.mybatis.model;/ * * sort enum */public Enum sortdirectionEnum {/ * * ascending */asc、/ * * descending */desc}上記の手順を完了した後、メソッドパブリックリスト<ビジター> getListBypagenate(Pagenateargs args)をivisitoroperationインターフェイスクラスに追加し続けます。前の章では、実際には既にGetListメソッドがあります。このページネーションは、実際にはこれに基づいて少し変更されています。 Ivisitoroperationインターフェイスクラスが変更された後、次のとおりです。
Package David.mybatis.demo; Import java.util.list; Import david.mybatis.model.pagenateargs; Import david.mybatis.model.visitor; import david.mybatis.model.visitorwithrn; public interface ivisitoroperation { /** basic visit int id(int id); /**訪問者を追加*/ public int add(訪問者訪問者); /** visitorを削除*/ public int delete(int id); /**訪問者の更新*/ public int update(訪問者訪問者); /**クエリ訪問者*/パブリックビジタークエリ(int id); / * *クエリリスト */ public List <visitor> getList(); / * * Pagination Query List */ public List <Visitor> getListBypagenate(Pagenateargs args); }次に、visitormapper.xml構成ファイルの変更を開始し、新しい<select>ノードIDとパラメータータイプを追加して、前の章に従って構成する必要があります。ここに追加された新しいIDは、getListBypagenateです。構成後、次のものです
<?xml version = "1.0" encoding = "utf-8"?> <!doctype mapper public " - // mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd <! - useGeneratedKeys = "true"は、自己成長シーケンスを使用するかどうかを意味します。KeyProperty= "ID"は、どの列が自己成長列であるかを指定します。 keyProperty = "id">訪問者(名前、電子メール、ステータス、createtime)値(#{name}、#{email}、#{status}、#{createtime})</inserte> <delete "delete" parametertype = "int"> delete delete delete delete> delete> delete> parametertype = "Visitor">更新訪問者Set name =#{name}、email =#{email}、status =#{status} where id =#{id}およびstatus> 0; </update> <id = "query" parametertype = "int" resultType = "visitor"> select id、name、email、status、createTime from Id =#{id}およびstatus> 0注文</select> <"basic query" parametertype = "int" restertytor = "bisid> </select> <select id = "getList" resultMap = "visitOrrs"> <included refid = "getListsQl"/> </select> <sql id = "getListsQl"> select * select * select * select> section> 0 </sql> <! - 次のものはパジネーションの新しい部分です。 OrderBysQlは、後で再利用されます - > <resultmap type = "visitor" id = "visitorrs"> <id column = "id" property = "id" /> <result column = "name" property = "name" /> <result column = "email" property = "email" /> <result column = "column =" status "=" /> <createTime " /> < id = "getListBypagenate" parametertype = "pagenateargs" resultType = "visitor"> select * from(<includ refid = "getlistql" /> <inclid = "orderbysql" />)t < test = "pagestart> -1 and pagesize> -1"> limit#{pagestart}、#{pagesize} </if> </select> <sql id = "orderbysql"> rodder {orderfieldstr} $ {orderdirectionstr} </sql> </sql> </mapper>下の図にも同様の構成があります。ここでのフィールド属性はすべて、Pagenateargsパラメータークラスの属性名と一致しています。
<test = "pagestart> -1およびpagesize> -1"> limit#{pagestart}、#{pagesize} </if>Demorunクラスでテスト方法を作成します。
/**ページネーションパラメーター*/public static void queryvisitorlistwithpagenate(int pageindex、int pagesize、string orderfield、string orderdire){pagenateargs args = new pagenateargs(pageindex、pagesize、orderfield、orderdire); sqlsession session = mybatisutils.getsqlsession(); ivisitoroperation voperation = session.getMapper(ivisitoroperation.class);リスト<ビジター> Visitors = voperation.getListBypagenate(args); for(訪問者訪問者:訪問者){System.out.println(訪問者); } mybatisutils.closessession(session); mybatisutils.showmessages(crud_enum.list、visitors.size());}demorun.QueryVisitorListWithPagenate(0、100、 "id"、sortdirectionEnum.desc.toString());
実行後、テスト結果はIDで逆順序でソートされます。訪問者テーブルには14のレコードがあります。
2ページで5つのピースを撮影し、次の6〜10枚のデータを実行するため、パラメーターを渡すだけです。
Demorun.QueryVisitorListWithPagenate(1、5、 "id"、sortdirectionEnum.desc.toString());
結果は次のとおりです。
これは、私が自分で実装したページングロジック〜^0^です。ここで注意する必要があるのは、ここでOrderfieldStrフィールドで判断を下していないということです。理論的には、間違った列名が渡されないようにするために対処する必要があります。ただし、インターネットに既製のカプセル化が必要なので、Googleにアクセスすることもできます。 MyBatisページングの使用方法を示す方法は次のとおりです。
これを完了した後、MySQLであるため、クエリ結果に独自のRownumシーケンスIDがありません。したがって、テストデータをチェックするときは明らかではないかもしれません。急いでいる必要がない場合は、食べ物や衣服を補って上記の方法を変えるために自分でそれをすることができます。ここでは、モデルパッケージに完全に同一の訪問者を作成し、次のようにRownumパラメーターの永続性によって返される追加のRownum IDをもたらします。
パッケージDavid.mybatis.model; Import java.text.simpledateformat; import java.util.date; public class visitorwithrn {private int id;プライベート文字列名;プライベート文字列メール;プライベートINTステータス;プライベートデートCreateTime; Private int rownum; public visitorwithrn(){// todo auto-enerated constructor stub createtime = new date(); } public Visitorwithrn(string name、string email){this.name = name; this.email = email; this.setstatus(1); this.createtime = new date(); } public int getId(){return id; } public void setName(string name){this.name = name; } public string getname(){return name; } public void setemail(string email){this.email = email; } public string getemail(){return email; } public date getCreatetime(){return createTime; } public int getStatus(){return status; } public void setStatus(int status){this.status = status; } public int getRownum(){return rownum; } public void setrounum(int rownum){this.rownum = rownum; } @Override public String toString(){// todo auto-feenated method stub return string.format( "{rownum:%d、id:%d、name:%s、createtime:%s}"、rownum、id、name、new simpledateformat( "yyyymm-dd hh:mm:ss"); "ss"); }}Ivisitoroperationでは、public List <visitorwithrn> getListByPagenateWithRn(Pagenateargs args)と呼ばれる新しい方法を作成します。同様に、VisitorMapperで対応する<select>ノードとスクリプトを構成する必要があります。ここでの唯一の違いは、次のようにSQLスクリプトを変更する必要があることです。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype mapper public " - // mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd <! - useGeneratedKeys = "true"は、自己成長シーケンスを使用するかどうかを意味します。KeyProperty= "ID"は、どの列が自己成長列であるかを指定します。 keyProperty = "id">訪問者(名前、電子メール、ステータス、createtime)値(#{name}、#{email}、#{status}、#{createtime})</inserte> <delete "delete" parametertype = "int"> delete delete delete delete> delete> delete> parametertype = "Visitor">更新訪問者Set name =#{name}、email =#{email}、status =#{status} where id =#{id}およびstatus> 0; </update> <id = "query" parametertype = "int" resultType = "visitor"> select id、name、email、status、createTime from Id =#{id}およびstatus> 0注文</select> <"basic query" parametertype = "int" restertytor = "bisid> < /select> Select id = "getList" resultMap = "visitOrrs"> <included refid = "getListsQl" /> < /select> <sql id = "getListsQl"> select * select * select * select * select * select * select> 0 < /sql> <resultmap type = "visitor" id = "visitors"列= "email" property = "email" /> <result column = "status" property = "property =" status " /> <result column =" createtime "property =" createtime " /> < /resultmap> <select id =" getListByteAnate "parametertype =" pagenateargs "resulttype =" defid = "OrderBysQl"/>)t < id = "Orderbysql"> Order by $ {OrderfieldStr} $ {OrderDirectionStr} < /sql> <! - rownumを使用してSQLスクリプトを書き込む方法 - > <resultmap型= "visitorwithrn" id = "visitorwithrnrs"> <id column = "id" " /> <colum =" " /> <colum =" " /> <colummプロパティ= "email" /> <result column = "status" property = "status" /> <result column = "createtime" property = "createtime" /> <result column = "rownum" property " /> < /resultmap> <select id ="出力はエスケープ操作を実行せず、自分で転送する - > Select T.Rownum、T.Id、T.Name、T.Email、T.Status、T.Createtime(<inflide refid = "getlistsqlcontainsrn" /> <inclute refid = "orderbysql" />) #{Pagesize} </if> </select> <sql id = "getListsQlContainsrn"> Select @Rownum:= @rownum+1 rownum、result.id、result.name、result.email、result.status、result.createTime次に残っているのは、DeMorunの下にテスト方法を追加することです。そのため、ここにマップを貼り付けません。完了後、6〜10個のデータが次のようになることがわかります。