目录
问题出现
问题探究 ① —— Kotlin 的类型映射
问题探究 ② —— JavaBean 的无参构造
解决方案 ① —— 我就用 Integer 了怎么着吧
解决方案 ② —— kotlin.Int 什么时候映射为 Integer
解决方案 ③ —— 默认参数与无参构造
解决方案 ④ —— 官方解决方案
拓展延伸 —— 不择手段创建实例
问题出现
前不久刚刚应小伙伴的要求拉了个 QQ 群:162452394 (微信群可以加我微信 enbandari,邀大家进群),上周一的时候在公众号推送了之后一下子就热闹起来了。
话说有个哥们在群里面问了这么一个问题,他用 MyBatis 来接入数据库,有个实体类用 Kotlin 大概是这么写的:
data class User (var id: Int, var username: String, var age: Int, var passwd: String)
它对应的数据库表是这样的:
CREATE TABLE userinfo
(
id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
username VARCHAR(45),
age INT(11),
passwd VARCHAR(45)
);
字段顺序也都能对得上。
然后呢,他就配置了这么一条查询语句:
<mapper namespace="net.println.kotlin.mybatis.UserMapper">
<select id="selectUser" resultType="net.println.kotlin.mybatis.User">
select * from userinfo where id = #{id}
</select>
</mapper>
对应的 UserMapper 代码如下:
public interface UserMapper {
User selectUser(int id);
}
这一切看上去似乎一点儿毛病都没有哇,可一旦他调用 selectUser 方法之后,程序开始抱怨了:
No constructor found in net.println.kotlin.mybatis.User matching [java.lang.Integer, java.lang.String, java.lang.Integer, java.lang.String]
啥问题呢?找不到构造方法。当时看到这个问题的时候正好手里有活,没有仔细看,周末特意照着写了个 demo,果然。。嗯。。居然找不到构造方法,