MYSQL,mybatisはどのように自己増加キーを使いますか?
6724 ワード
私たちは通常、アプリケーションでmysqlに対してinsert操作を行った後、挿入記録の自己増加キーを取得する必要があります。本論文では、java環境下の4つの方法について、insertを取得した後の記録の主なキーaut_を紹介します。incrementの値: JDBC 2.0により提供されるinsertRow()方式 JDBC 3.0によって提供されるgetGeneratodKeys方式 SQL select LAST_を通じてINSERT_ID()関数 SQL@IDENTITY変数 を介して mybatisはどうやって操作しますか?
1. JDBC 2.0で提供するinsertRow方式
jdbc 2.0以来、次のように実行できます。
利点:初期の一般的なアプローチ
短所:ResultSetを操作する必要があります。コードが長いです。
2. JDBC 3.0により提供されたgetGenerate edKeys()方式
1.executeUpdateで自動取得keyをアクティブにします。
2.Sttementを呼び出すgetGeneratodKeys()インターフェースの利点:
1.操作が便利で、コードが簡潔である
2.jdbc 3.0の基準
3.効率がいいです。データベースに追加のアクセスがないからです。
ここで補充します
a.jdbc 3.0の前に、各jdbc driverの実現には自分で自己増加キーを取得するインターフェースがあります。mysql jdbc 2.0でのdriver org.gjt.mm.mysqlでは、getGeneratodKeys()関数がorg.gjt.mm.mysql.jdbc.Stement.getGenerantated Keys()で実現されます。このように直接引用すると、移植性に大きな影響があります。JDBC 3.0は標準のgetGeneratodKeysによってこの点をよく補いました。
b.getGenerate edKeysについて、公式サイトでは、OracleJdbcGuideというより詳細な説明があります。
3. SQL select LAST_を通してINSERT_ID()
長所:簡単で便利
短所:JDBC 3.0のgetGenerantedKeys()に対して、追加のデータベースクエリが必要です。
追加:
1.この関数は、mysql 5.5のマニュアルで定義されています。「returns a BIGINT(64-bit)value representing the first atomaticallally generant value succelly inserted for an AUTOka Column as.ext of the most Serecented」です。この文書ポイント
2.この関数は、connection次元では「スレッドが安全」です。つまり、各mysql接続は独立してLASTを保存します。INSERT_ID()の結果は、現在接続されている前回のinsert動作のみで更新されます。つまり2つの接続が同時にinsert文を実行するとき、それぞれのLAST_を呼び出します。INSERT_ID()は互いに上書きされません。栗を挙げます。Aをつないで表に入れてからLAST_を入れます。INSERT_ID()は100に戻り、Bを接続してテーブルを挿入した後、LAST_INSERT_ID()は101に戻るが、接続AはLAST_を繰り返し実行する。INSERT_ID()の場合は、101ではなく、常に100に戻ります。これはmysql接続数と実行結果を監視することによって検証できます。ここでは実験過程を詳しく説明しません。
3.上記の点に基づいて、同じ接続を前提として同時にinsertを実行すれば、2回操作可能な戻り値が互いに上書きされます。ラストなのでINSERT_ID()の分離度は接続レベルです。これは、getGeneratoedKeys()は、getGeneranted Keys()がstatementレベルなので、より良いことができます。同じconnectionの複数のstatementは、getGeneratodikeys()は互いに上書きされない。
4. SQL SELECT@IDENTITYを通じて
この方式とLAST_INSERT_ID()の効果は同じです。公式サイトの文書では、「This variable is a synonm for the lastert variable.It exists for comptibility with other database systems.You can read its value with SELECT@identity,and set using SEidentity.」 この文書ポイント
重要な追加:
SELECT LAST_でもINSERT_ID()はやはりSELECT@IDENTITYで、一つのinsert文に複数のレコードを挿入すると、いつも第一条の挿入記録のgenerantedKeyに戻ります。
例は以下の通りです。まず設定します。 useGeneratoedKeys=「true」は、ブーケのid、keyProperty=「id」を指定します。
だから、やはりJDBC 3が提供するgetGeneratodKeys関数でinsert記録の主キーを取得したほうがいいです。簡単であるのみならず、効率も高い。
mybatisには、関連する設定があります。
http://blog.csdn.net/ultrani/article/details/9351573
1. JDBC 2.0で提供するinsertRow方式
jdbc 2.0以来、次のように実行できます。
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, // Statement
java.sql.ResultSet.CONCUR_UPDATABLE);
stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial");
stmt.executeUpdate( // demo
"CREATE TABLE autoIncTutorial ("
+ "priKey INT NOT NULL AUTO_INCREMENT, "
+ "dataField VARCHAR(64), PRIMARY KEY (priKey))");
rs = stmt.executeQuery("SELECT priKey, dataField " //
+ "FROM autoIncTutorial");
rs.moveToInsertRow(); // ( )
rs.updateString("dataField", "AUTO INCREMENT here?"); //
rs.insertRow(); //
rs.last(); //
int autoIncKeyFromRS = rs.getInt("priKey"); // preKey
rs.close();
rs = null;
System.out.println("Key returned for inserted row: "
+ autoIncKeyFromRS);
} finally {
// rs,stmt close()
}
利点:初期の一般的なアプローチ
短所:ResultSetを操作する必要があります。コードが長いです。
2. JDBC 3.0により提供されたgetGenerate edKeys()方式
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_UPDATABLE);
// ...
// ( demo )
// ...
stmt.executeUpdate(
"INSERT INTO autoIncTutorial (dataField) "
+ "values ('Can I Get the Auto Increment Field?')",
Statement.RETURN_GENERATED_KEYS); // generatedKeys!
int autoIncKeyFromApi = -1;
rs = stmt.getGeneratedKeys(); // !
if (rs.next()) {
autoIncKeyFromApi = rs.getInt(1);
} else {
// throw an exception from here
}
rs.close();
rs = null;
System.out.println("Key returned from getGeneratedKeys():"
+ autoIncKeyFromApi);
} finally { ... }
2 :
1.executeUpdateで自動取得keyをアクティブにします。
2.Sttementを呼び出すgetGeneratodKeys()インターフェースの利点:
1.操作が便利で、コードが簡潔である
2.jdbc 3.0の基準
3.効率がいいです。データベースに追加のアクセスがないからです。
ここで補充します
a.jdbc 3.0の前に、各jdbc driverの実現には自分で自己増加キーを取得するインターフェースがあります。mysql jdbc 2.0でのdriver org.gjt.mm.mysqlでは、getGeneratodKeys()関数がorg.gjt.mm.mysql.jdbc.Stement.getGenerantated Keys()で実現されます。このように直接引用すると、移植性に大きな影響があります。JDBC 3.0は標準のgetGeneratodKeysによってこの点をよく補いました。
b.getGenerate edKeysについて、公式サイトでは、OracleJdbcGuideというより詳細な説明があります。
3. SQL select LAST_を通してINSERT_ID()
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
// ...
//
// ...
stmt.executeUpdate(
"INSERT INTO autoIncTutorial (dataField) "
+ "values ('Can I Get the Auto Increment Field?')");
int autoIncKeyFromFunc = -1;
rs = stmt.executeQuery("SELECT LAST_INSERT_ID()"); // generatedKey
if (rs.next()) {
autoIncKeyFromFunc = rs.getInt(1);
} else {
// throw an exception from here
}
rs.close();
System.out.println("Key returned from " +
"'SELECT LAST_INSERT_ID()': " +
autoIncKeyFromFunc);
} finally {...}
この方法は何も言いません。もう一回関数LASTを調べます。INSERT_ID()長所:簡単で便利
短所:JDBC 3.0のgetGenerantedKeys()に対して、追加のデータベースクエリが必要です。
追加:
1.この関数は、mysql 5.5のマニュアルで定義されています。「returns a BIGINT(64-bit)value representing the first atomaticallally generant value succelly inserted for an AUTOka Column as.ext of the most Serecented」です。この文書ポイント
2.この関数は、connection次元では「スレッドが安全」です。つまり、各mysql接続は独立してLASTを保存します。INSERT_ID()の結果は、現在接続されている前回のinsert動作のみで更新されます。つまり2つの接続が同時にinsert文を実行するとき、それぞれのLAST_を呼び出します。INSERT_ID()は互いに上書きされません。栗を挙げます。Aをつないで表に入れてからLAST_を入れます。INSERT_ID()は100に戻り、Bを接続してテーブルを挿入した後、LAST_INSERT_ID()は101に戻るが、接続AはLAST_を繰り返し実行する。INSERT_ID()の場合は、101ではなく、常に100に戻ります。これはmysql接続数と実行結果を監視することによって検証できます。ここでは実験過程を詳しく説明しません。
3.上記の点に基づいて、同じ接続を前提として同時にinsertを実行すれば、2回操作可能な戻り値が互いに上書きされます。ラストなのでINSERT_ID()の分離度は接続レベルです。これは、getGeneratoedKeys()は、getGeneranted Keys()がstatementレベルなので、より良いことができます。同じconnectionの複数のstatementは、getGeneratodikeys()は互いに上書きされない。
4. SQL SELECT@IDENTITYを通じて
この方式とLAST_INSERT_ID()の効果は同じです。公式サイトの文書では、「This variable is a synonm for the lastert variable.It exists for comptibility with other database systems.You can read its value with SELECT@identity,and set using SEidentity.」 この文書ポイント
重要な追加:
SELECT LAST_でもINSERT_ID()はやはりSELECT@IDENTITYで、一つのinsert文に複数のレコードを挿入すると、いつも第一条の挿入記録のgenerantedKeyに戻ります。
INSERT INTO t VALUES
-> (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
LAST_INSERT_ID(), @@IDENTITY 'Mary' generatedKey
5.mybatisでは自增keyはどうやって獲得しますか?例は以下の通りです。まず設定します。 useGeneratoedKeys=「true」は、ブーケのid、keyProperty=「id」を指定します。
insert into tbl_employee(last_name,email,gender)
values(#{lastName},#{email},#{gender})
使用例:戻りのidはどうなりますか? //
Employee employee = new Employee(null, "jerry4",null, "1");
mapper.addEmp(employee);
System.out.println(employee.getId());
結び目だから、やはりJDBC 3が提供するgetGeneratodKeys関数でinsert記録の主キーを取得したほうがいいです。簡単であるのみならず、効率も高い。
mybatisには、関連する設定があります。
mybatisドキュメントを参照できます。sqlmap-xmlhttp://blog.csdn.net/ultrani/article/details/9351573