新聞中心
主鍵回填一般用于增加操作中,把插入數(shù)據(jù)時(shí)插入為null的主鍵id數(shù)據(jù)填回去,存入到j(luò)ava對(duì)象和主鍵對(duì)應(yīng)的屬性中(數(shù)據(jù)庫(kù)主鍵字段為id則回填的是實(shí)體類的id屬性),實(shí)現(xiàn)添加+查詢主鍵一步到位。

成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)服務(wù)商,為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)服務(wù),網(wǎng)站設(shè)計(jì),網(wǎng)站托管維護(hù)等一站式綜合服務(wù)型公司,專業(yè)打造企業(yè)形象網(wǎng)站,讓您在眾多競(jìng)爭(zhēng)對(duì)手中脫穎而出成都創(chuàng)新互聯(lián)公司。
原生寫(xiě)法
框架來(lái)源于我們學(xué)過(guò)的基礎(chǔ)知識(shí),主鍵回填實(shí)際上是一個(gè)在 JDBC 中就被支持的寫(xiě)法,有的小伙伴可能不知道這一點(diǎn),因此這里我先來(lái)說(shuō)說(shuō)在 JDBC 中如何實(shí)現(xiàn)主鍵回填。
JDBC 中實(shí)現(xiàn)主鍵回填其實(shí)非常容易,主要是在構(gòu)造 PreparedStatement 時(shí)指定需要主鍵回填,然后在插入成功后,查詢剛剛插入數(shù)據(jù)的 id ,示例代碼如下:
public int insert(Person person) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
con = DBUtils.getConnection();
ps = con.prepareStatement("INSERT INTO person(username,password,money) VALUES(?,?,?)", PreparedStatement.RETURN_GENERATED_KEYS);
ps.setObject(1, person.getUsername());
ps.setObject(2, person.getPassword());
ps.setObject(3, person.getMoney());
int i = ps.executeUpdate();
rs = ps.getGeneratedKeys();
int id = -1;
if (rs.next()) {
id = rs.getInt(1);
}
return id;
}
和普通的插入 SQL 不同之處主要體現(xiàn)在兩個(gè)地方:
第一個(gè)是構(gòu)造 PreparedStatement 時(shí),多了一個(gè)參數(shù),指定了需要主鍵回填。 在更新操作執(zhí)行完成之后,調(diào)用 getGeneratedKeys ,然后又會(huì)獲取到一個(gè) ResultSet 對(duì)象,從這個(gè)游標(biāo)集中就可以獲取到剛剛插入數(shù)據(jù)的id。 這個(gè)是原生的寫(xiě)法,在 MyBatis 中,對(duì)此需求提供了兩種不同的實(shí)現(xiàn)方案,下面分別來(lái)看。
框架寫(xiě)法
一般情況下,主鍵有兩種生成方式:
-
主鍵自增長(zhǎng)
-
自定義主鍵(一般可以使用UUID,或者類UUID)
如果是第二種,主鍵一般是在Java代碼中生成,然后傳入數(shù)據(jù)庫(kù)執(zhí)行插入操作,如果是第一個(gè)主鍵自增長(zhǎng),此時(shí),Java 可能需要知道數(shù)據(jù)添加成功后的主鍵。
MyBatis 的基本用法就無(wú)需多說(shuō)了,這也不是本文的重點(diǎn),我們還是來(lái)看看 MyBatis 中主鍵回填的兩種不同實(shí)現(xiàn)方式吧!
方式一
第一種方式比較簡(jiǎn)單,也是松哥推薦的一種實(shí)現(xiàn)方式:
"insertBook" useGeneratedKeys=
"true" keyProperty=
"id"> insert into t_book (b_name,author) values (
#{name},#{author});
這種方式比較簡(jiǎn)單,就是在插入節(jié)點(diǎn)上添加 useGeneratedKeys 屬性,同時(shí)設(shè)置接收回傳主鍵的屬性。配置完成后,我們執(zhí)行一個(gè)插入操作,插入時(shí)傳入一個(gè)對(duì)象,插入完成后,這個(gè)對(duì)象的 id 就會(huì)被自動(dòng)賦值,值就是剛剛插入成功的id。
松哥推薦大家使用這種方式,原因很簡(jiǎn)單,這種方式實(shí)現(xiàn)簡(jiǎn)便省事。
方式二
第二種方式則是利用MySQL自帶的 last_insert_id() 函數(shù)查詢剛剛插入的id,示例代碼如下:
"insertBook">
"id" resultType=
"java.lang.Integer"> SELECT LAST_INSERT_ID()
insert into t_book (b_name,author) values (
#{name},#{author});
這種方式是在 insert 節(jié)點(diǎn)中添加 selectKey 來(lái)實(shí)現(xiàn)主鍵回填,實(shí)際上這種方式的功能更加豐富,因?yàn)?selectKey 節(jié)點(diǎn)中的 SQL 我們既可以在插入之前執(zhí)行,也可以在插入之后執(zhí)行(通過(guò)設(shè)置節(jié)點(diǎn)的 Order 屬性為 AFTER 或者 BEFORE 可以實(shí)現(xiàn)),具體什么時(shí)候執(zhí)行,還是要看具體的需求,如果是做主鍵回填,我們當(dāng)然需要在插入 SQL 執(zhí)行之后執(zhí)行 selectKey 節(jié)點(diǎn)中的 SQL。
注意第二種方式一樣也要通過(guò)設(shè)置 keyProperty 來(lái)指定將查詢到的數(shù)據(jù)綁定到哪個(gè)屬性上。
網(wǎng)頁(yè)題目:MyBatis中主鍵回填實(shí)現(xiàn)方法
轉(zhuǎn)載源于:http://www.5511xx.com/article/djspppg.html


咨詢
建站咨詢
