数据库和对象的属性名不一致是很常见的问题,这个时候依从表字段到对象属性名的按名称匹配映射已经搞不定这个了,下面是几种解决方案。

 

1. 开启驼峰转换

如果数据库中的字段名与对象只是简单的不一致的话,比如名字是一样的,只是分隔方式不一样,在数据库中使用了下划线分隔,而在对象中使用了驼峰分隔,如果都是这样子的话倒不是特别麻烦,只需要在mybatis的配置文件中开启驼峰转换即可。

<setting name="mapUnderscoreToCamelCase" value="true"/>

 

2. 在SQL查询语句中使用别名来适配

还有一种情况就是绝大部分情况下都是可以适配得上的,但是只有几列适配不上,这个时候定义单独的ResultMap感觉有点不值当(事实上,从可维护性上来考虑定义ResultMap绝对是首选),所以我们就在查询数据的时候在SQL语句中使用别名来使数据库列名能够适配得上对象的属性名。

比如在数据库中用户名列叫做username,在对象中用户名叫做name,由于种种原因我们不能去修改这两个名字了但是还要让它们能够对应得起来,下面是一种可能的解决方案:

<select id="loadById" parameterType="string" resultType="user">
	SELECT id, username AS name, passwd FROM t_user WHERE id=#{id}
</select>

甚至在指定别名的时候还可以在别名中包含点符号来导航,比如使用role.name来指定注入到user对象的role属性的name属性中,下面是一个简单的例子:

<select id="load" parameterType="long" resultType="org.cc11001100.mybatis.domain.User">
    SELECT
        t1.id, username, passwd,
        t3.id AS 'role.id',
        t3.name AS 'role.name'
    FROM
        t_user AS t1
        JOIN t_user_role AS t2 ON t1.id=t2.user_id
        JOIN t_role AS t3 ON t3.id=t2.role_id
    WHERE
      t1.id=#{id};
</select>

 

3. 自定义ResultMap

最后,实在是不一致得比较离谱,基本上大部分的数据库字段和对象的名字都是不对应的,这种情况下定义一个ResultMap来解决这个问题绝对是上策。

<select id="loadById" parameterType="string" resultMap="userResultMap">
	SELECT * FROM t_user WHERE id=#{id}
</select>

然后在resultMap标签中配置不同字段的映射:

<resultMap id="userMap" type="org.cc11001100.mybatis.domain.User" autoMapping="true">
    <id column="id" property="id"/>
    <result column="username" property="name"/>
</resultMap>

resultMap标签有个属性叫做autoMapping,当指定为true的时候表示没有手动使用id或者result标签指定映射的属性就自动映射,这样将这个属性置为true,就可以只指定表字段名称与对象属性名不匹配的字段,大大减少了工作量。