今天遇到了一个很疑惑的问题。java代码查询数据库的一条记录居然和表内的数据不一样,当时看到的时候,黑人问号.。
错误如下:
数据库查询结果如下
代码查询结果
[Cart [id=121, userId=null, productId=null, quantity=1, checked=1, createTime=null, updateTime=null]]
最终终于找到了问题所在
分析:可以看到id是正常的,只有user_id、product_id、creat_time、update_time错误,而这时可以看出这些字段和实体类的属性命名不一样(属性是进行JPA导入自动生成的)。猜测应该就是这里的问题了,那改一下实体类属性试试。
修改之后再次运行:
[Cart [id=121, user_id=1, product_id=26, quantity=1, checked=1, create_time=Sat Mar 21 21:39:49 CST 2020, update_time=Sat Mar 21 21:39:49 CST 2020]]
猜测正确,问题成功解决。
所以是字段和实体类的属性映射出了问题所导致的。
那我们不想修改实体类属性,那可以用代码也是可以映射的。
@Results({
@Result(property="userId",column="user_id",jdbcType=JdbcType.INTEGER),
@Result(property="productId",column="product_id",jdbcType=JdbcType.INTEGER),
@Result(property="createTime",column="create_time",jdbcType=JdbcType.TIMESTAMP),
@Result(property="updateTime",column="update_time",jdbcType=JdbcType.TIMESTAMP),
})
(注:这里可以选择需要进行映射的表字段和属性,其他和表字段相同名字的属性,MyBatis会自动映射)
运行结果:
[Cart [id=121, user_id=1, product_id=26, quantity=1, checked=1, create_time=Sat Mar 21 21:39:49 CST 2020, update_time=Sat Mar 21 21:39:49 CST 2020]]
<resultMap id="BaseResultMap" type="com.shop.pojo.Cart" >
<constructor >
<idArg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="user_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="product_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="quantity" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="checked" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="create_time" jdbcType="TIMESTAMP" javaType="java.util.Date" />
<arg column="update_time" jdbcType="TIMESTAMP" javaType="java.util.Date" />
constructor>
resultMap>
(注:这里是进行表的映射,不是字段的映射,所以必须要映射全部字段。
那如果少一个字段会怎么样???
直接报错。)
正确运行结果
[Cart [id=121, user_id=1, product_id=26, quantity=1, checked=1, create_time=Sat Mar 21 21:39:49 CST 2020, update_time=Sat Mar 21 21:39:49 CST 2020]]