Mybatis は簡単に GeneratedKeys を使用します

Mybatis は簡単に GeneratedKeys を使用します

単一データの挿入 (または更新) の場合、useGeneratedKeys
バッチ操作では ON DUPLICATE KEY が使用されますが、これについてはここでは説明しません



1. useGeneratedKeysに関する疑問

この記録は主に Mybatis のレビューをしていたときに書いたのですが、CRUD のセクションを書いたときに、自分の書いたビジネスの成果が記憶と全く異なっていて驚いたので、記録としてこの記事を書きました質問は次のとおりです:
Order.java

public class Order {
	private Long id;
	private String serial;
}

orderMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vic.mybatis.dao.OrderDao">
	<insert id="createOrder" useGeneratedKeys="true" keyProperty="id">
		insert into t_order(serial) values (#{serial})
	</insert>
</mapper>

OrderDao.java

@Mapper
public interface OrderDao {
    public int createOrder(Order order);
}

OrderServiceImpl.java

@Service
@Slf4j
public class OrderServiceImpl implements OrderService {

    @Resource
    private OrderDao orderDao;

    @Override
    public int createOrder(Order order) {
    	// 这个result是否就是插入数据成功后返回的主键ID?
    	int id = orderDao.createOrder(order);
    	log.info(" *****插入数据后返回的id: " + id + " *****");
    	log.info(" *****插入数据后返回的id: " + order.getId() + " *****");
        return result;
    }
}

上で書いた業務の場合、OrderServiceImpl.javaに出力される2行の情報のうち、1行目は常に1になります(挿入後にデータベースにデータが挿入されたため、ここではデータが挿入されたものとみなされます)ただし、
5 番目のデータを挿入した後に 1 を返したとき、混乱していたため、少し混乱していることがわかりました。 SQL の実行ステータス、またはこのデータの主キー ID を返す必要がありますか? 設定したのでuseGeneratedKeys="true"、その定義は主キーを生成して返すという規約ではないでしょうか?
疑念を抱きながら、私はコケティッシュな操作を開始し、ドキュメントをチェックし、useGeneratedKeysこのパラメータが一体何なのかを確認するかのようにソース コードを調べました。
以下のように、啰嗦务怪テクノロジーが十分ではありません。ナンセンスを作りましょう。次にこの記事を読むときに理解してください。


2. useGeneratedKeys の正式な定義は何ですか?

  1. まずは公式サイトのmybatisのマッパーでのuseGeneratedKeyの記述を見てみましょう

(挿入と更新のみ) これは、MyBatis に、JDBC getGeneratedKeys メソッドを使用してデータベースによって内部的に生成されたキー (たとえば、MySQL や SQL Server などの RDBMS の自動インクリメント フィールド) を取得するように指示します。デフォルト: false。

JDBCのgetGeneratedKeysメソッドを使用して取得され、 と のみがinsert有効updateです。ただし、上のサブタイトルに書いたことはマッパー内にあることに注意してください。なぜなら、設定やマッパー インターフェイスのマッピング アノテーションもあるためです。

  1. 公式サイトのmybatisのConfigurationのuseGeneratedKeyの説明を見てみましょう。

生成されたキーの JDBC サポートを許可します。対応するドライバーが必要です。一部のドライバ (Derby など) は互換性を拒否しても動作するため、この設定は true に設定すると、生成されたキーの使用を強制します。デフォルト: false。

主キーの自動生成のための JDBC サポートを許可します。対応するドライバーが必要です。true に設定すると、この設定は生成された主キーの使用を強制します。これは、一部のドライバー (Derby など) が互換性を拒否しても動作するためであり、この設定が設定に表示されると、グローバルに有効になります。

  1. mybatisのアノテーションマッピングにおけるuseGeneratedKeyの記述を見てみましょう公式サイトの説明

@Options このアノテーションは、マップされたステートメントに属性として通常存在する幅広いスイッチおよび構成オプションへのアクセスを提供します。

@Options アノテーションは、幅広いスイッチと構成オプションへのアクセスを提供します。これらのスイッチと構成オプションは、通常、マッピング ステートメントに属性として表示されます。つまり、この構成の後、マッピング ステートメントに属性として直接表示され、 override 上記の構成 Configuration (設定)

3. Mybatis で GeneratedKeys を使用しますか?

ここではuseGeneratedKeysその動作プロセスや原理については詳しく説明しません。


3.1. Configuration(設定)でGeneratedKeyを使用する場合

<settings>
	<setting name="useGeneratedKeys" value="true" />
</settings>

実行insertが成功すると、データベースによって自動的に生成された主キー ID を取得できます。これは、設定要素での useGeneratedKeys の設定がグローバルに有効であるためですが、実際には、インターフェイス マッパーにのみ影響します (同時に @Options アノテーションが構成されていない場合)。 ) および XML マッパーが機能しません。

3.2. マッパーでGeneratedKeyを使用する場合

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vic.mybatis.dao.OrderDao">
	<insert id="createOrder" useGeneratedKeys="true" keyProperty="id">
		insert into t_order(serial) values (#{serial})
	</insert>
</mapper>

マッパー (xml) で構成された useGeneratedKeys 属性は現在のマッパー (xml マッパー) にのみ影響し、settings 要素で設定されたグローバル useGeneratedKeys パラメーター値はマッパー (xml マッパー) には影響しません。

3.3. アノテーションマッピングでの useGeneratedKey の場合

@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into t_order(serial) values(#{serial})")
Integer createOrder(Order order);

同時に useGeneratedKeys プロパティが Configuration(設定) とインターフェイス マッパーの両方に追加され、プロパティ値が同じかどうかに関わらず、インターフェイス マッパーの優先順位が Configuration(設定) の優先順位よりも高くなります。つまり、構成
(設定) で useGeneratedKeys を true または false に設定していても、インターフェイス マッパーで @Options(useGeneratedKeys = true) を設定している限り、主キー ID が返されます。 = false) の場合、主キー ID は返されません。

4. これまでの質問に基づいていますか?

useGeneratedKeys = true に設定すると、挿入 (または更新) が実行された後、主キー ID が返されます。その後、質問の上記のOrderServiceImpl.javaに 2 つの情報を出力します。最初の出力は実行ステータスで、2 番目の出力は主キー ID。
それでは、createOrder メソッドの実行後に正確に何が返されるのでしょうか?
このバグは挿入操作を実行し、最終的に次の処理に進みます。
上図のように、挿入操作を実行して、ようやくここに来ました 読んで字のごとく、結果を返す update メソッドですps.getUpdateCount()このメソッドは非常に馴染みのあるメソッドです 単純に JDBC を使用してデータを操作したとき、何かイメージはありましたか??写真を載せます
結果セット

現在の結果を更新数として取得します。

-1人間の言葉で言えば、影響を受ける行数が増えるケースもあります。


さて、ここでやめましょう、さあ〜サオニアン、頑張ってください、おじさん。

次の記事では、挿入プロセスと主キーの生成プロセスについて説明します。

如果写错或者不妥善地方, 欢迎大佬留言指正,不喜勿碰,感谢各位大佬

もし死後の世界があるとしたら、私は木になって、喜びも悲しみもなく、半分は塵の中に、半分は風に吹かれて飛び、半分は日陰で、半分は太陽の下で、とても静かで誇りに思って永遠に立っているでしょう。決して頼ったり、求めたりしないでください。
死後の世界があるなら、私は一陣の風となり、一瞬も永遠になる。感傷的な感情も感傷的な目もありません。半分は雨の中の自由で気楽な感じ、半分は春の旅、孤独、一人で長い旅に行く、かすかな思いをすべて取り除いて、決して逃さない、決して愛さない。------ サンマオ

おすすめ

転載: blog.csdn.net/H1101370034/article/details/121231207