在mybatis中进行查询时,查询出的结果需要用resultType配置一个输出类型,可以使简单类型或者pojo对象,如果是稍微复杂一些的可以中包装类型封装还可以使用自定义的包装类型,包装类也是一种pojo对象。但是当遇到表中的字段名和表对应实体类的属性名不完全相同的情况时,改如何解决字段名与实体类属性名不相同的冲突问题呢?还有一种输出映射是resultMap。
比如说遇到如下的sql语句:
SELECT id id_,username username_ FROM USER WHERE id=#{value}
使用ResultMap
定义resultMap
<!-- 定义resultMap
将SELECT id id_,username username_ FROM USER和user类中的属性作一个映射关系
type:resultMap最终映射的java对象类型,可以使用别名
id:对resultMap的唯一标识-->
<resultMap type="user" id="userResultMap">
<!-- id表示查询结果集中唯一标识
column:查询出来的列名
property:type指定的pojo类型中的属性名-->
<id column="id_" property="id"/>
<!--result:对普通映射定义
column:查询出来的列名
property:type指定的pojo类型中的属性名
最终resultMap对column和property作一个映射关系(对应关系)-->
<result column="username_" property="username"/>
</resultMap>
使用resultMap作为statement的输出映射类型
<!-- 使用resultMap进行输出映射
resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper文件,前边需要加namespace-->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
SELECT id id_,username username_ FROM USER WHERE id=#{value}
</select>
mapper接口
//根据id查询用户信息,使用resultMap输出
public User findUserByIdResultMap(int id) throws Exception;
测试
@Test
public void testFindUserByIdResultMap() throws Exception{
SqlSession sqlSession=sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper= sqlSession.getMapper(UserMapper.class);
//调用userMapper的方法
User user=userMapper.findUserByIdResultMap(1);
System.out.println(user);
}
总结
上面的测试代码演示当尸体类中的属性名和表中的字段名不一致时,使用mybatis进行查询操作时无法查询出相应的结果以及针对问题采用的两种方法:
方法一:通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就可以把表的字段名和实体类的属性名一一对应上了,这种方式是通过在sql语句中定义别名来解决字段名和属性名的映射关系的。
方法二:通过<resultMap>来映射字段名和实体类属性名的一一对应关系。这种方式是使用mybatis提供的解决方式来解决字段名和属性名的映射关系的。
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。