プロジェクト開発では、テーブル内のフィールド名と対応するエンティティクラスの属性名がまったく同じではない状況に遭遇することがよくあります。次の編集者は、この場合、さまざまなフィールド名とエンティティクラスの競合問題を解決する方法を示します。興味のある友達は一緒に学びます。
1.デモンストレーションに使用するテーブルとデータを準備する
テーブルオーダーを作成します(Order_id int primary key auto_increment、order_no varchar(20)、order_price float);挿入注文(order_no、order_price)値( 'aaaa'、23)
2。エンティティクラスを定義します
packed me.gacl.domain;/*** @author gacl*注文テーブルに対応するエンティティクラスを定義します*/public class order {/***テーブルオーダーを作成する(order_id int int int int int int int int int art_price varath()、order_price float);*/// // id ===> order_idprivate string orderno; // orderno ===> order_noprivateフロート価格。 // price ===> order_pricepublic int getid(){return id;} public void setid(int id){this.id = id;} public string getOrderno(){return orderno;} public void setorderno(string orderno){this.orderno = ordno;} public float getprice( {this.price = price;}@overridepublic string toString(){return "order [id =" + id + "、orderno =" + orderno + "、price =" + price + "];}}} 3.テストコードを書きます
3.1。 SQL XMLマッピングファイルを書き込みます
1. OrderMapper.xmlファイルを作成します。 OrderMapper.xmlのコンテンツは次のとおりです。
<?xmlバージョン= "。" encoding = "utf-"?> <!doctype mapper public " - // mybatis.org//dtd mapper .//en" "http://mybatis.org/dtd/mybatis--mapper.dtd">< !--このマッパー用の一意の名前空間を指定します。名前空間の値は、従来、パッケージ名 + SQLマップファイル名に設定されているため、名前空間の値が一意であることが保証されます。たとえば、namespace = "me.gacl.mapping.ordermapper" is me.gacl.mapping(パッケージ名) + ordermapper(ordermapper.xmlファイル削除接尾辞) - > <mapper namespace = "me.gacl.mapping.ordermapper"> <! -
IDクエリに基づいて、注文オブジェクトが取得されます。このクエリを使用すると、必要な結果を照会できません。これは主に、エンティティクラスの属性名がデータベースのフィールド名に対応していないため、対応するレコードを照会できないためです。
- > <select id = "getOrderByID" parameterType = "int" resultType = "me.gacl.domain.order"> select * select * orders_id = {id} </select> <! - IDクエリに基づいて、注文オブジェクトが取得されます。このクエリを使用して、通常、必要な結果を照会できます。
これは、エンティティクラス属性名と同じ属性名を持つクエリエイリアスを指定するため、クエリ結果のエンティティクラスの属性名とフィールド名が1対1に対応できるためです。
- > <選択id = "selectorder" parametertype = "int" resultType = "me.gacl.domain.order"> select order_id id、order_no orderno、order_price rice from orders_id = {id} </select> <! - IDクエリによると、注文オブジェクトを取得できます。このクエリを使用して、通常の結果を照会できます。これは、<sultsMap> - >を介して、エンティティクラスの属性名とテーブルのフィールド名との間に1対1の対応をマッピングするためです。
<選択id = "selectorderresultmap" parametertype = "int" resultmap = "orderresultmap"> select * select * select * select * where order_id =#{id} </select> <! - エンティティクラスの属性名とテーブルのフィールド名との対応をマッピング<resultmap> - <結果属性属性属性属のマッピングのマッピングをマッピングします。 IDプロパティ - > <idプロパティ= "id" column = "order_id"/> <! - 結果プロパティを使用して非プリマリーキーフィールドをマッピング - > <resultプロパティ= "orderno" column = "order_no"/> <result property "columm 2。conf.xmlファイルにordermapper.xmlマッピングファイルを登録します
<mappers> <! - ordermapper.xmlファイルを登録します。 OrderMapper.xmlはパッケージMe.gacl.mappingにあるため、リソースはme/gacl/mapping/ordermapper.xmlとして記述されます。
3.2。ユニットテストコードを記述します
packed me.gacl.test; import me.gacl.domain.order; import me.gacl.util.mybatisutil; import org.apache.ibatis.session.squlsession; import org.junit.test; public class test {@testpublic void testgetorderbyid(){sqlsession sqlsession = mybatisutil.getSqlSession();/*** sql、* me.gacl.mapping.ordermapperの識別文字列は、rodermapper.xmlファイルのマッパータグの名前空間属性の値です。 SelectタグのID属性値を使用して、実行するSQLを見つけることができます*/stringステートメント= "me.gacl.mapper.getOrderByid"; // SQL IDINTING STRING //マッピングクエリ操作をマッピングし、クエリ結果を自動的に実行し、注文オブジェクトに自動的にカプセル化し、注文= SQLSESSION.SERECTONE.SELECTONE(STLSESSION.SELECTONE(STLSESSION.SELECTONE); sqlsessionを使用して、sqlsessionsqlsession.close()を閉じる必要があります。 System.out.println(order); // print result:null、null、つまり、対応するレコードは見つかりません} @testpublic testgetorderbyid(){sqlsession sqlsession = mybatisutil.getsqlsession();/***マップsql識別文字列、 OrderMapper.xmlファイル、 * selectorderは、selectタグのID属性値です。 SelectタグのID属性値を介して、実行するSQLを見つけることができます。 */stringステートメント= "me.gacl.mapping.ordermapper.selectrerder"; //マップSQL識別文字列//クエリ操作を自動的にカプセル化し、注文= sqlsession.selectone.selectone(ステートメント); sqlsessionsqlsession.close(); System.out.println(order); // print result:order [id =、orderno = aaaa、price =。]}@testpublic void testgetorderbyid(){sqlsession sqlsession = mybatisutil.getSqlSession();/***マップSQL識別文字OrderMapper.xmlファイルのマッパータグ。 * SelectorDerResultMapは、SelectタグのID属性値です。 SelectタグのID属性値を介して、実行するSQLを見つけることができます。 */stringステートメント= "me.gacl.mapping.ordermapper.selectorderresultmap"; //マッピングSQL識別文字列//クエリ結果をOrder Object and return Orders = SQLSession.Selectone(ステートメント); sqlsessionsqlsession.close(); System.out.println(order); // print result:order [id =、orderno = aaaa、price =。]}}}}ユニットテストの実行の結果:
1. testgetorderbyidメソッドは、クエリを実行した後にnullを返します。
2。testgetorderbyid2メソッドとtestgetorderbyid3メソッドの後、クエリを実行した後、希望の結果を正常に取得できます。
4。概要
上記のテストコードは、エンティティクラスの属性名とテーブルのフィールド名が一貫性がない場合、クエリ操作にMyBatisを使用する場合、対応する結果を照会できないという問題を示しています。
ソリューション1: Query SQLステートメントのフィールド名のエイリアスを定義して、フィールド名のエイリアスがエンティティクラスの属性名と一致するように、テーブルのフィールド名はエンティティクラスの属性名に1つずつ対応できます。このメソッドは、SQLステートメントでエイリアスを定義することにより、フィールド名と属性名のマッピング関係を解決します。
ソリューション2: <sultsMap>を使用して、フィールド名とエンティティクラスの属性名の間の1対1の対応をマップします。この方法では、MyBatisが提供するソリューションを使用して、フィールド名と属性名の間のマッピング関係を解きます。
上記は、編集者(IV)によって紹介されたMyBatis Learningチュートリアルです。フィールド名とエンティティクラスの属性名の間の競合を迅速に解決する方法。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!