您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么解決mybatis報Invalid value for getInt()的問題”,在日常操作中,相信很多人在怎么解決mybatis報Invalid value for getInt()的問題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么解決mybatis報Invalid value for getInt()的問題”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
使用mybatis
遇到一個非常奇葩的問題,錯誤如下:
Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'name' from result set. Cause: java.sql.SQLException: Invalid value for getInt() - 'wo'
還原一下當(dāng)時的情況:
public interface UserMapper { @Results(value = { @Result(property = "id", column = "id", javaType = Long.class, jdbcType = JdbcType.BIGINT), @Result(property = "age", column = "age", javaType = Integer.class, jdbcType = JdbcType.INTEGER), @Result(property = "name", column = "name", javaType = String.class, jdbcType = JdbcType.VARCHAR) }) @Select("SELECT id, name, age FROM user WHERE id = #{id}") User selectUser(Long id); } @Data @Builder public class User { private Long id; private Integer age; private String name; } public class MapperMain { public static void main(String[] args) throws Exception { MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource(); dataSource.setUser("root"); dataSource.setPassword("root"); dataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"); TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", transactionFactory, dataSource); Configuration configuration = new Configuration(environment); configuration.addMapper(UserMapper.class); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper userMapper = session.getMapper(UserMapper.class); System.out.println(userMapper.selectUser(1L)); } } }
數(shù)據(jù)庫如下:
上面是一個很簡單的例子,就是根據(jù)id
選出用戶的信息,運行結(jié)果如下:
User(id=1, age=2, name=3)
沒有任何問題,但是我再往數(shù)據(jù)庫里插入一條數(shù)據(jù),如下:
在MapperMain
類中增加一行代碼,如下:
System.out.println(userMapper.selectUser(2L));
運行結(jié)果如下:
User(id=1, age=2, name=3)
### Error querying database. Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'name' from result set. Cause: java.sql.SQLException: Invalid value for getInt() - 'lh'
……
可以看出第一條查詢沒有問題,第二條查詢就報錯了
其實我的直覺告訴我,是不是因為User
類里字段順序和SQL
語句里select字段
的順序不一致導(dǎo)致的,那就來試一下吧
改一下User
類里字段的順序:
@Data @Builder public class User { private Long id; private String name; private Integer age; }
結(jié)果如下:
User(id=1, name=3, age=2)
User(id=2, name=lh, age=3)
果不其然,直覺還是很6的
或者改一下SQL
語句里select字段
的順序:
@Data @Builder public class User { private Long id; private Integer age; private String name; } public interface UserMapper { @Results(value = { @Result(property = "id", column = "id", javaType = Long.class, jdbcType = JdbcType.BIGINT), @Result(property = "age", column = "age", javaType = Integer.class, jdbcType = JdbcType.INTEGER), @Result(property = "name", column = "name", javaType = String.class, jdbcType = JdbcType.VARCHAR) }) @Select("SELECT id, age, name FROM user WHERE id = #{id}") User selectUser(Long id); }
以我們的直覺,結(jié)果肯定也沒問題,果不其然,如下:
User(id=1, age=2, name=3) User(id=2, age=3, name=lh)
其實到上一步,問題已經(jīng)解決了,可以繼續(xù)干活了,但是搞不懂為什么,心里總覺得不踏實。
找bug
從debug
開始,從下面的入口開始:
追蹤到如下:
可以看出User
這個類是有構(gòu)造函數(shù)的,而且是包含所有字段的構(gòu)造函數(shù)
利用這個構(gòu)造函數(shù)創(chuàng)建實例的時候,參數(shù)的順序就是SQL語句選擇字段的順序,不會根據(jù)映射關(guān)系去選擇
所以就出現(xiàn)了類型不匹配
那我們再來看一下問什么會有一個這樣的構(gòu)造函數(shù)產(chǎn)生,直覺告訴我是@Builder
這個注解
一起來看一下User
編譯后的結(jié)果:
public class User { private Long id; private String name; private Integer age; User(final Long id, final String name, final Integer age) { this.id = id; this.name = name; this.age = age; } public static User.UserBuilder builder() { return new User.UserBuilder(); } public static class UserBuilder { private Long id; private String name; private Integer age; UserBuilder() { } public User.UserBuilder id(final Long id) { this.id = id; return this; } public User.UserBuilder name(final String name) { this.name = name; return this; } public User.UserBuilder age(final Integer age) { this.age = age; return this; } public User build() { return new User(this.id, this.name, this.age); } } }
果然如此,UserBuilder.build()
方法就是利用這個構(gòu)造函數(shù)來生成的。
最終解決方案就是給User
類加上無參的構(gòu)造函數(shù)就OK了,如下:
@Builder @AllArgsConstructor @NoArgsConstructor public class User { private Integer age; private String name; private Long id; }
字段順序隨便放,最后再執(zhí)行一下:
User(age=2, name=3, id=1) User(age=3, name=lh, id=2)
到此,關(guān)于“怎么解決mybatis報Invalid value for getInt()的問題”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。