最近、eコマースシステムのビジネスニーズにより、製品情報を挿入した後、製品IDに戻る必要があります。当初、私はいくつかの落とし穴に遭遇したので、将来忘れられないようにメモを取りました。
次のコードのように挿入されたプライマリキーを取得します
user user = new user(); user.setUsername( "chenzhou"); user.setPassWord( "xxxx"); user.setComment( "プライマリキーを返すためにデータを挿入する機能をテストします"); system.out.println( "挿入前の主キーは次のとおりです。"+user.getuserid()); userdao.insertandgetid(user); // compution system.out.println( "挿入後の主要なキーは"+user.getuserid());
オンライン情報を照会した後、約2つの方法があることがわかりました。
方法1:
エンティティクラスのマッピングファイル「*mapper.xml」は次のように書かれています。
<ID = "InsertAndGetId" useGeneratedKeys = "true" keyproperty = "userid" parametertype = "com.chenzhou.user">ユーザー(ユーザー名、パスワード、コメント)値(#{username}、#{password}、#{nectr})</insert>ヒント:
usegeneratedKeys = "true"は、主キーの自己成長を設定することを意味します
keyProperty = "userID"とは、エンティティクラスのuserIDフィールドに成長IDを割り当てることを意味します。
parametertype = "com.chenzhou.mybatis.user"このプロパティは、渡されたパラメーターエンティティクラスを指します
以下は、<挿入> </挿入>にresultType属性がないことを思い出させます。したがって、ランダムに追加しないでください。
エンティティクラスのueridには、getter()とsetter()が必要です。方法
MySQLデータベースにテーブルを構築するときに、すでにフィールドの自己成長を設定していたので、最終的に2番目の方法を選択しました。
2番目の方法:
また、エンティティクラスのマッピングファイル「*mapper.xml」でもありますが、次のように記述する必要があります。
< t_product(productName、froductdesrcible、merchantid)values(#{productname}、#{dessrcible}、#{merchantid}); </insert>ヒント:
<inters> </insert>にはresultType属性はありませんが、<selectKey> </selectKey>タグがあります。
Order = "After"は、挿入ステートメントが最初に実行され、次にクエリステートメントが実行されることを意味します。
前後に設定できます。
前に設定されている場合、最初にプライマリキーを選択し、KeyPropertyを設定してから挿入ステートメントを実行します。
後に設定した場合、最初に挿入ステートメントを実行し、次にselectkey要素を実行します - Oracleデータベースと同様に、Oracleデータベースのように挿入ステートメントにシーケンス呼び出しを埋め込むことができます。
keyProperty = "userID"とは、エンティティクラスのuserIDフィールドに成長IDを割り当てることを意味します。
select last_insert_id()は、挿入されたばかりのレコードの自己成長IDがmysql構文でクエリされることを意味します。
エンティティクラスのueridには、getter()とsetter()が必要です。方法
要件を達成するには、上記で十分です。
ここで興味があるなら、Mybatisの間違いの可能性について私に耳を傾け続けてください。
挿入データベースが成功し、挿入されたデータを読み取ることができるように促されているのに、Mybatisの追加方法の変更が戻り値を持つのはなぜですか?
上記の要件を実装するときにプライマリキーを挿入して返す場合は、このように記述しないことを忘れないでください。
@Override public long insertProduct(productbean productbean){// todo auto-fenated method stub sqlsession session = mybatisjdbcutil.currentsession(); Productidao Productidao = session.getMapper(productidao.class); // here *.class // dao return productidao.insertproduct(productbean)のインターフェイス層に対応する必要があります。 }なぜ?
上記のように書くと、実行後に必要な主要なキーIDの返品は、データベースステートメントを実行した後に影響を受ける行の数ではないためです。
さらに、実行後、プロンプトの挿入が成功し、コードで挿入されたデータを読むこともできますが、常に1つのレコードしかありません。
さらに、データベースを開くと、データベースに正常にデータが挿入されていないことがわかります。
私はここで長い間落ち込んでいて、ついに重要なポイントを発見しました。
返品値を持つことと返品値を持たないことの違いは次のとおりです。
返品値は、データベースの読み取り専用モードにのみアクセスするためであり、さまざまなクエリの方法など、データベースデータの変更はありません。
返品値がない場合、データベースは読み取りモードと書き込みモードでアクセスされ、削除や追加など、データベース内のデータが変更されます。
さらに、個人的な理解によれば、MyBatisは最初に挿入ステートメントを実行するときに構築されたセッションのようなコレクションにキャッシュし、次に基礎となるドライバーに電話してデータベースを操作および変更する必要があります。
session.commit(); mybatisjdbcutil.closessession();
上記の2つのステートメントは返されません。つまり、これらの2つのステートメントが実行された後にのみ、それらは真に実行され、データベースに挿入され、データベースのデータが変更されます。
それどころか、返品値がある場合、これらの2つのステートメントは実行されないため、追加ステートメントはそれ自体で作成されたセッションでのみ実行されますが、データベースには送信されないため、データベースにレコードはありません。
これは、MyBatisの追加方法を変更した後、返品値を持つ理由を説明しますが、データベースが正常に挿入されることを促しますが、データベースを開くと挿入されたデータが表示されません。
MyBatisの挿入ステートメントメソッドには、このような書くことが正しいため、返品値を持たないはずです。
@Override public void insertProduct(ProductBean ProductBean){// todo auto-enerated method stub sqlsession session = mybatisjdbcutil.currentsession(); Productidao Productidao = session.getMapper(Productidao.class); // here *.class // dao productidao.insertproduct(productbean)のインターフェイスレイヤーに対応する必要があります。 session.commit(); mybatisjdbcutil.closessession(); }上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。