この記事は、編集者からもたらされたMyBatisのエンティティクラスとテーブルマッピングの問題に関する知識です。このチュートリアルを学習すると、さまざまなフィールド名とエンティティクラスの属性名の競合問題をすぐに解決できます。それを必要とする友達、見てみましょう!
1.デモンストレーションに使用するテーブルとデータを準備する
テーブルオーダーを作成します(Order_id int primary key auto_increment、order_no varchar(20)、order_price float);挿入注文(order_no、order_price)値( 'aaaa'、23)
2。エンティティクラスを定義します
packy me.gacl.domain;/*** @author gacl*注文テーブルに対応するエンティティクラスを定義します*/public class order {/***テーブルオーダーを作成する(Order_id int primary key auto_increment、order_no varchar(20)、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 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マッピングファイル名に設定されているため、名前空間の値が一意であることが保証されます
たとえば、namespace = "me.gacl.mapping.ordermapper"はme.gacl.mapping(パッケージ名) + ordermapper(rodermapper.xmlファイルに接尾辞を削除します)
- > <mapper namespace = "me.gacl.mapping.ordermapper"> <! - IDクエリに基づいて注文オブジェクトを取得します。このクエリを使用すると、必要な結果を照会できません。これは主に、エンティティクラスの属性名がデータベースのフィールド名に対応していないため、対応するレコードを照会することはできません - > <select id = "getOrderByID" parameterType = "int" resultType = "me.gacl.domain.order"> select * select * select * select * select *このクエリを使用して、通常、必要な結果を照会できます。これは、エンティティクラス属性名と同じエイリアスを持つエイリアスをクエリに与えるため、エンティティクラスの属性名とクエリ結果のフィールド名が1つずつ対応できるためです。 order_id =#{id} </select> <! - IDクエリに基づいて注文オブジェクトを取得します。このクエリを使用して、通常の結果を照会できます。これは、エンティティクラスの属性名とテーブルのフィールド名との間に1対1の対応をマッピングするためです <resultMap>----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------列= "order_id"/> <! - 結果属性を使用して非プリマリーキーフィールドをマッピングします - > <resultプロパティ= "orderno" column = "order_no"/> <resultプロパティ= "column =" order_price "/> <result property =" result "column =" order_price "/> <resultmap> </mapper>2。conf.xmlファイルにordermapper.xmlマッピングファイルを登録します
<mappers> <! - ordermapper.xmlファイルを登録します。 OrderMapper.xmlはパッケージMe.gacl.mappingにあるため、リソースはme/gacl/mapping/ordermapper.xmlとして記述されます。
3.2。ユニットテストコードを記述します
packeme.gacl.test; import me.gacl.domain.order; import me.gacl.util.mybatisutil; import org.apache.ibatis.session.squlsession; import org.junit.test; public class test2 {@testpublic moid testgetorderbyid(){sqlsession sqlsession sqlsession sqlsession mybatisutil.getSqlSession();/*** sql、* me.gacl.mapping.ordermapperの識別文字列は、rodermapper.xmlファイルのマッパータグの名前空間属性の値です。 SelectタグのID属性値を介して、実行するSQLを見つけることができます*/stringステートメント= "me.gacl.mapping.getorderbyid"; // sql識別文字列//クエリ操作をマッピングし、クエリ結果を自動的に実行し、注文= sql ssession.session.session.session.session.ids.session.ids.session.ids.session.ids.session.ids. sqlsession execute sqlを使用すると、sqlsessionsqlsession.close()を閉じる必要があります。 System.out.println(order); // print result:null、つまり、対応するレコードは見つかりませんでした} @testpublic testgetorderbyid2(){sqlsession sqlsession = mybatisutil.getsqlsession();/***マップSQL識別文字列、 OrderMapper.xmlファイル、 * selectorderは、selectタグのID属性値です。 SelectタグのID属性値を介して、SelectタグのID属性値を使用して実行されるSQLを見つけることができます*/stringステートメント= "me.gacl.mapping.ordermapper.selectrectrerde"; // sql string //マッピングクエリ操作を実行し、クエリの結果を自動的にカプセル化し、注文= sqlsのsqls simessのsqlsessionsを返すことができます。注文表にID 1を使用すると// SQLSESSIONを使用してSQLを実行した後、sqlsessionsqlsession.close()を閉じる必要があります。 System.out.println(order); // print result:order [id = 1、orderno = aaaa、price = 23.0]}@testpublic void testgetorderbyid3(){sqlsession sqlsession = mybatisutil.getsqlsession(); OrderMapper.xmlファイルのマッパータグの属性、 * selectorDerResultMapは、SELECTタグのID属性値です。 SelectタグのID属性値を使用して、実行するSQLが見つかります*/stringステートメント= "me.gacl.mapper.selectorderresultmap"; // SQL IDINTING STRING //マッピングクエリ操作をマッピングし、クエリ結果をORDER OBSTERに自動的にカプセル化し、注文= SQLSESSENTONE.SELECTONE.SELECTONE.SELECTONE。表// SQLSessionを使用してSQLを実行した後、sqlsessionsqlsession.close()を閉じる必要があります。 System.out.println(order); // print result:order [id = 1、orderno = aaaa、price = 23.0]}}ユニットテストの実行の結果:
1. testgetorderbyidメソッドは、クエリを実行した後にnullを返します。
2。testgetorderbyid2メソッドとtestgetorderbyid3メソッドの後、クエリを実行した後、希望の結果を正常に取得できます。
4。概要
上記のテストコードは、エンティティクラスの属性名とテーブルのフィールド名が一貫性がない場合、クエリ操作にMyBatisを使用する場合、対応する結果を照会できないという問題を示しています。
ソリューション1:Query SQLステートメントのフィールド名のエイリアスを定義して、フィールド名のエイリアスがエンティティクラスの属性名と一致するように、テーブルのフィールド名はエンティティクラスの属性名に1つずつ対応できます。このメソッドは、SQLステートメントでエイリアスを定義することにより、フィールド名と属性名のマッピング関係を解決します。
ソリューション2:マッピングにより、フィールド名とエンティティクラスの属性名の間の1対1の対応をマップします。この方法では、MyBatisが提供するソリューションを使用して、フィールド名と属性名の間のマッピング関係を解きます。