Mybatis确实非常的方便,使用起来也十分的舒服,但是在使用的时候难免就会遇到一些问题,比如Java中的实体类字段名和数据库表中的字段不一致时,执行结果就会出现意外。
有如下两种类型:
1.数据库字段名和实体类字段名存在一定关系
数据库字段和实体类字段有对应关系,这里的对应关系就是数据库字段全为大写字母且单词之间用_
分隔,实体类的属性名采用小驼峰式命名,一定要保证对应,例如数据库中的USER_ID
对应实体类中的·userId
字段。
类似于如下:
这种不对应的情况,Mybatis提供了一个自动驼峰命名规则的设置,但是默认是关闭的,所以当我们没有设置的时候,这样也是对应不上的。我们就需要在Mybatis的配置文件中添加如下配置:
<settings>
<!-- 开启自动驼峰命名规则映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
这里需要注意的就是settings标签
的位置了,需要按照以下顺序排列,具体可参考博主的另一篇文章
当我们开启了自动驼峰命名规则之后,这种情况就会得以解决。
2.数据库字段名与实体类字段名“毫无关联”
这里的毫无关联是指字段名字不对应,而且也不存在上面的第一种情况。这种情况下,我们开启自动驼峰命名规则就不起任何作用了。
对于这种情况我们有两种解决方案:
2.1 在编写SQL语句的时候为字段起别名
举例如下:
<select id="getUserList" resultType="User">
select USER_ID as id,USER_NAME as name,USER_PASSWORD as password from user2;
</select>
但是这种解决方式还是有些不妥,万一我们的数据库字段很多,我们编写的sql就会很长,看起来就十分的冗余,于是Mybatis也有一种解决方案。
2.2 ResultMap结果集映射
举例如下:
<!-- 自定义一个结果集映射 -->
<!-- id:区分该自定义结果集的唯一指定id -->
<!-- type:指定需要映射的JavaBean类型 -->
<resultMap id="userMap" type="User">
<!-- 这里的id标签标示它是主键 -->
<!-- column:数据库表中的字段名 -->
<!-- property:指定JavaBean中的属性 -->
<id column="USER_ID" property="id" />
<!-- 这里的result标签标示它是普通字段,其属性值与上述一致 -->
<result column="USER_NAME" property="name" />
<result column="USER_PASSWORD" property="password" />
</resultMap>
<!-- 由于我们自定义了结果集的映射,所以我们这里需要使用resultMap来指定结果集应该按照我们自定义的结果集来产生映射行为 -->
<select id="getUserList" resultMap="userMap">
select USER_ID,USER_NAME,USER_PASSWORD from user2;
</select>
当我们这样设置之后,问题也会得到对应的解决。
博主更推荐使用这种结果集映射的方式来处理数据库字段与实体类字段不一致的情况。