關於mybatis用mysql時,插入返回自增主鍵的問題

來源:互聯網
上載者:User

標籤:

  公司決定新項目用mybatis,雖然這個以前學過但是一直沒用過都忘得差不多了,而且項目比較緊,也沒時間去系統點的學一學,只好很粗略的百度達到能用的程度就行了。

其中涉及到插入實體要求返回主鍵id的問題,以前用ssh配合oracle很容易實現,因為有sequence,而且mysql也基本沒用過,所以只好去百度了。

  這個內容還是比較好查的,如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.dao.UserDao">
  <insert id="insertUser" parameterType="com.entity.User"> insert into sys_User(username,classes) values(#{username},#{classes}) </insert>
</mapper> 

  本來我們一般配置一個不需要返回主鍵的,並且id是自增的,只需要上述配置即可,values中的大括弧內的欄位和parameterType指向的實體類的欄位大小寫記得對應起來,然後namespace的路徑與介面方法路徑對應起來,然後調用這個sql的介面方法就只需如下:

public interface UserDao{        /**     * 新增學生     * @param User      */    public void insertUser(User user);}

  如果需要返回插入時自增主鍵的值的話,上述方法就需要稍微更改下了,其中存放資料庫語句的xml檔案裡需要相應更改配置,而介面方法的傳回值類型也需要更改,如下:

xml方法:記得加上useGeneratedKeys和keyProperty配置即可,前者是指設定是否使用jdbc的getGenereatedKeys方法擷取主鍵並賦值到keyProperty設定的屬性中,後者即實體類主鍵欄位
<insert id="insertUser" useGeneratedKeys="true" keyProperty="userid" parameterType="com.entity.User">
    insert into sys_User(username,classes)
    values(#{username},#{classes})
</insert>

介面方法傳回值改為int即可,因為mysql也只有int類型值支援自增,但是沒試過傳回值為string是不是能夠成功返回,我猜想應該是可以的
  /**     * 新增學生     * @param User      */    public int insertUser(User user);

  到這一步為止其實都沒有什麼問題,很容易就能百度到,具體是在調用時候,我不小心進了一個坑,我程式碼片段類似於這樣的:

User user=new User();user.setUsername("acfun");
user.setClasses("注孤生一班");
int id=userDao.insertUser(user);
system.out.println(id)

  結果我發現不管怎麼樣返回來的都是1,即便資料庫中主鍵已經自增到10了。。。

  後來才知道是姿勢不對,應該如下:

User user=new User();user.setUsername("acfun");user.setClasses("注孤生一班");userDao.insertUser(user);system.out.println(user.getUserid);

  這樣才是返回的自增的id。

  只怪自己沒理解意思,其實人家插入以後取回來的主鍵直接給賦值到你當做參數的實體的id裡面去了,至於方法傳回值返回的應該是受影響行數,那個useGeneratedKeys說的很清楚了,使用jdbc的getGenereatedKeys方法擷取主鍵並賦值到keyProperty設定的屬性中,但是由於比較緊急就草草的根據百度看人家怎麼配置就怎麼配置,想當然的去用了。

  話說這麼初級的一個問題我也水了這麼多字也真不好意思,因為知道自己水平有限,就寫的詳細一點,也沒關乎什麼原理性的東西,因為有些東西在熟悉的人看來實在簡單不過,根本無需一提,但是實際上看你的博文的可能會是一個初入java的小白,就像我在找minasocket方面的使用方法時候就感覺深受其害,淚流滿面,找到的基本都是說的各種原理源碼啥的,我想看到的結果博主一句:此類代碼實在簡單,無需贅述。。。看的我當時就。。。也不怪人家,確實不同的位置不同的看法。

  現在項目太緊,都沒時間去好好系統的學一下,基本都是需要用到什麼趕緊去查使用方法,也不去管原理什麼的,今天難得稍微閑下來一點發個毫無深度的博文,希望有些和我一樣的小白別掉同樣的坑裡。

  已經連續一個多月加班到晚上9點半並且周末無休的初級程式猿留。。。

 可能代碼會有些許錯誤,因為是直接從公司項目代碼拷過來,然後改成User這種的,可能有些路徑方面沒改正確。以後等項目稍微告一段落,閑下來了,再去自己搭個ssm的架構,去稍微具體點的學習學習。

關於mybatis用mysql時,插入返回自增主鍵的問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.