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

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

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

  這個內容仍是比較好查的,以下:sql

<?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文件裏須要相應更改配置,而接口方法的返回值類型也須要更改,以下:mybatis

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);

  到這一步爲止其實都沒有什麼問題,很容易就能百度到,具體是在調用時候,我不當心進了一個坑,我程序代碼片斷相似於這樣的:oracle

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

  結果我發現無論怎麼樣返回來的都是1,即使數據庫中主鍵已經自增到10了。。。app

  後來才知道是姿式不對,應該以下:框架

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

  這樣纔是返回的自增的id。ssh

  只怪本身沒理解意思,其實人家插入之後取回來的主鍵直接給賦值到你當作參數的實體的id裏面去了,至於方法返回值返回的應該是受影響行數,那個useGeneratedKeys說的很清楚了,使用jdbc的getGenereatedKeys方法獲取主鍵並賦值到keyProperty設置的屬性中,可是因爲比較緊急就草草的根據百度看人家怎麼配置就怎麼配置,想固然的去用了。socket

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

  如今項目太緊,都沒時間去好好系統的學一下,基本都是須要用到什麼趕忙去查使用方法,也不去管原理什麼的,今天可貴稍微閒下來一點發個毫無深度的博文,但願有些和我同樣的小白別掉一樣的坑裏。

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

 可能代碼會有些許錯誤,由於是直接從公司項目代碼拷過來,而後改爲User這種的,可能有些路徑方面沒改正確。之後等項目稍微告一段落,閒下來了,再去本身搭個ssm的框架,去稍微具體點的學習學習。

相關文章
相關標籤/搜索