重大發現,研究了一個下午
發現,如果呼叫dao執行插入操作時,回傳自增主鍵賦值到DO物件中id屬性中時,但是物件中的id是為Integer型別,回傳的值卻是被強行賦值成Long,并且,id是Integer型別的竟然賦成了一個Long型別的值,可怕的是,不能進行任何對于該值的操作,
否則都會報java.lang.Long cannot be cast to java.lang.Integer,而在mapping檔案中,將插入陳述句回傳的自增id映射在物件的其他成員,型別也為Integer時,就不會被強轉,我現在想插入時獲取主鍵ID然后賦值在物件的id屬性上,但是Integer型別的,求大神賜招


uj5u.com熱心網友回復:
什么資料庫,還有主鍵獲取方式是什么,把你的映射檔案貼出來uj5u.com熱心網友回復:
mysql資料庫 沒有類映射 這是插入時 keyProperty單獨映射到id欄位uj5u.com熱心網友回復:
補圖


uj5u.com熱心網友回復:
useGenerateKeys是用的mysql自增主鍵,回傳的是Long,如果要改型別,你就用自定義主鍵,像oracle一樣,可以定義resultTypeuj5u.com熱心網友回復:
不同意這個觀點,我已經驗證過,如果useGenerateKeys映射的欄位名不是id,型別為Integer的,一樣能映射成功,并且映射出來的值是Integer,不會被強轉成Longuj5u.com熱心網友回復:
看看你的BOssDo里面關于id的set,get方法,引數是什么型的,還有你的圖一里面id的值是1,怎么到了圖二里面變成了long的18?感覺你哪部分寫的不對uj5u.com熱心網友回復:
感覺問題就出在你的BossDo物體類里面了,完整代碼貼出來看看uj5u.com熱心網友回復:
那資料庫中id的型別和長度是多少,有沒有超過java中Integer的范圍uj5u.com熱心網友回復:
圖一是1,是我第一句手動賦值1,證明他原先是個Integer,為了和后面對比用的,set和get沒有問題的,檢查了無數遍,不然圖1也不會顯示是Integeruj5u.com熱心網友回復:
set是沒問題,而且圖一也沒問題,但是為啥到了圖二就變成了18,是你手動改的嗎?還有,你的BossDo物體類里面有沒有寫構造器啊uj5u.com熱心網友回復:
所以呀,你看有斷點的,執行insert陳述句后,mybatis不是可以回傳當前自增的id到一個欄位嗎,我映射到id上了,結果強轉成了Longuj5u.com熱心網友回復:
資料庫中設計的這個表的自增的id,你看看是什么型別的,有可能是long型的uj5u.com熱心網友回復:

資料表也是正常的
uj5u.com熱心網友回復:
這真的是mybatis的一個bug我想說的是,一共有三點1. <insert>陳述句,keyProperty賦值的欄位名如果是id,那么如果這個id是Integer型別,只要不是Long,都會被強轉成Long,因為型別不匹配,id欄位一用就會報錯
2.keyProperty賦值的欄位名不是Long,那么欄位名是什么型別,賦值的就是什么型別,回傳正常
uj5u.com熱心網友回復:
強轉一下型別吧uj5u.com熱心網友回復:
<selectKey keyProperty='id' resultType='int' order='AFTER' >select LAST_INSERT_ID();
</selectKey>
用這種方式吧。
uj5u.com熱心網友回復:
欄位有沒有設定UNSIGNED整型是有符號還是無符號
不知道是不是你這個存盤的范圍和Integer不一樣
uj5u.com熱心網友回復:
絕對不是資料表定義的問題,因為只要我將映射欄位名換成其他的不叫id,那么那個欄位時Integer一樣回傳Integeruj5u.com熱心網友回復:
被強轉的結果是,相當于id欄位已經報廢,無論是get還是set,都會報型別不匹配問題,因為本身就已經是強轉了,并且是Integer轉Long,小轉大,無法通過編譯器的轉換uj5u.com熱心網友回復:
檢查是否是這里是否是:INTEGER<resultMap id="BaseResultMap" type="xxxx.xxxx.xxxx">
<id column="xxxx" jdbcType="INTEGER" property="xxxxx" />
.......
</resultMap>
uj5u.com熱心網友回復:
與<resultMap>沒有關系的,那個是查詢結果映射,這里是<insert>陳述句,回傳自增id的keyProperty映射uj5u.com熱心網友回復:
我深深的懷疑你的xml中是不是ResultMap中把型別寫成了Long?uj5u.com熱心網友回復:
各位大佬這個是<insert>陳述句,回傳自增id的keyProperty映射,我的<resultMap>都沒有映射我的id值uj5u.com熱心網友回復:
你在 keyProperty="id"后面加個resultType=“int”試試uj5u.com熱心網友回復:
試了 mybatis 里 沒有這條屬性....uj5u.com熱心網友回復:
表里id型別都改成bigint,試試,如果這樣沒問題那有可能像4樓說的那樣,自增長生成的時long型別的uj5u.com熱心網友回復:
大家好,經過了一天的除錯,幾乎已經摸清了,是mybatis的問題,暫時無法定義是否是buguj5u.com熱心網友回復:
因為我這個POJO為子類,繼承了通用父類,指定了泛型,文中我的id是在父類中的,那么在mybatis反射時,由于是繼承父類填入泛型,反射取到的id的型別為Object,mybatis也無法得知具體是什么型別,只能以Long賦值,一起學習,有不同見解的地方,還請指教,如圖uj5u.com熱心網友回復:


uj5u.com熱心網友回復:
是不是因為資料庫中id的長度超過了Integer的大小范圍了,所以是Long,我記得以前我回傳的Integer的uj5u.com熱心網友回復:
Long.parseInt()uj5u.com熱心網友回復:
這個很好的,加1uj5u.com熱心網友回復:
<!-- 增加用戶 -->
<insert id="saveUser" parameterType="com.tkts.bean.User"
useGeneratedKeys="true" keyProperty="userId">
insert into
tb_user(user_name,phone) values(#{userName},#{phone})
</insert>
不知道你這樣嘗試過沒有,紅色地方 使用自動回傳主鍵的時候,定義回傳的值賦值到指定的物體類引數中區 雖然回傳的是long型,但你配置的物體類id(你這個bean的主鍵為id)的話,他就會轉化型別過去,應該是呼叫set方法
uj5u.com熱心網友回復:
建議檢查一下表資訊,是否id欄位被設為unsigned了,設為unsigned就會被轉為long,具體原因不詳,但是可以解決問題uj5u.com熱心網友回復:
正解,無符號就是Long轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/247474.html
標籤:Web 開發
上一篇:c3p0連接池切換到weblogic自帶連接池,代碼有需要更改的地方嗎?
下一篇:很簡單的問題 路過的請幫下忙
