• <th id="0iybx"></th>

    <button id="0iybx"></button>

    <em id="0iybx"><tr id="0iybx"></tr></em>

    <progress id="0iybx"><track id="0iybx"></track></progress>
    <rp id="0iybx"></rp>
  • <nav id="0iybx"></nav>

  • <rp id="0iybx"></rp>
  • 專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
    動力節點LOGO圖
    始于2009,口口相傳的Java黃埔軍校
    首頁 hot資訊 讓我們深入的了解下mybatis返回主鍵id

    讓我們深入的了解下mybatis返回主鍵id

    更新時間:2023-02-17 17:06:26 來源:動力節點 瀏覽390次

    添加單一記錄時返回主鍵ID

    添加一條記錄時返回主鍵值,在xml映射器和接口映射器中都可以實現。

    在映射器中配置獲取記錄主鍵值

    xml映射器

    在定義xml映射器時設置屬性useGeneratedKeys值為true,并分別指定屬性keyProperty和keyColumn為對應的數據庫記錄主鍵字段與Java對象的主鍵屬性。

    <mapper namespace="org.chench.test.mybatis.mapper">
    	<!-- 插入數據:返回記錄主鍵id值 -->
    	<insert id="insertOneTest" parameterType="org.chench.test.mybatis.model.Test" useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
    		insert into test(name,descr,url,create_time,update_time) 
    		values(#{name},#{descr},#{url},now(),now())
    	</insert>
    </mapper>
    

    接口映射器

    在接口映射器中通過注解@Options分別設置參數useGeneratedKeys,keyProperty,keyColumn值

    // 返回主鍵字段id值
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    @Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())")
    Integer insertOneTest(Test test);
    

    獲取新添加記錄主鍵字段值

    需要注意的是,在MyBatis中添加操作返回的是記錄數并非記錄主鍵id。因此,如果需要獲取新添加記錄的主鍵值,需要在執行添加操作之后,直接讀取Java對象的主鍵屬性。

    Integer rows = sqlSession.getMapper(TestMapper.class).insertOneTest(test);
    System.out.println("rows = " + rows); // 添加操作返回記錄數
    System.out.println("id = " + test.getId()); // 執行添加操作之后通過Java對象獲取主鍵屬性值
    

    添加批量記錄時返回主鍵ID

    如果希望執行批量添加并返回各記錄主鍵字段值,只能在xml映射器中實現,在接口映射器中無法做到。

    <!-- 批量添加數據,并返回主鍵字段 -->
    <insert id="insertBatchTest" useGeneratedKeys="true" keyProperty="id">
    	INSERT INTO test(name,descr,url,create_time,update_time) VALUES
    		<foreach collection="list" separator="," item="t">
    		(#{t.name},#{t.descr},#{t.url},now(),now())
    		</foreach>
    </insert>
    

    可以看到,執行批量添加并返回記錄主鍵值的xml映射器配置,跟添加單條記錄時是一致的。不同的地方僅僅是使用了foreach元素構建批量添加語句。

    獲取主鍵ID實現原理

    需要注意的是,不論在xml映射器還是在接口映射器中,添加記錄的主鍵值并非添加操作的返回值。實際上,在MyBatis中執行添加操作時只會返回當前添加的記錄數。

    package org.apache.ibatis.executor.statement;
    public class PreparedStatementHandler extends BaseStatementHandler {
    	@Override
        public int update(Statement statement) throws SQLException {
            PreparedStatement ps = (PreparedStatement) statement;
            // 真正執行添加操作的SQL語句
            ps.execute();
            int rows = ps.getUpdateCount();
            Object parameterObject = boundSql.getParameterObject();
            KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();
            // 在執行添加操作完畢之后,再處理記錄主鍵字段值
            keyGenerator.processAfter(executor, mappedStatement, ps, parameterObject);
            // 添加記錄時返回的是記錄數,而并非記錄的主鍵字段值
            return rows;
        }
    }
    

    順便看一下MyBatis添加操作的時序圖:

    跟蹤時序圖執行步驟可以看到,MyBatis最終是通過MySQL驅動程序獲取到了新添加的記錄主鍵值。

    以上就是動力節點小編介紹的"讓我們深入的了解下mybatis返回主鍵id",希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為您務。

    提交申請后,顧問老師會電話與您溝通安排學習

    免費課程推薦 >>
    技術文檔推薦 >>
    返回頂部
    天天做完夜夜做狠狠做

  • <th id="0iybx"></th>

    <button id="0iybx"></button>

    <em id="0iybx"><tr id="0iybx"></tr></em>

    <progress id="0iybx"><track id="0iybx"></track></progress>
    <rp id="0iybx"></rp>
  • <nav id="0iybx"></nav>

  • <rp id="0iybx"></rp>