resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
需求:查询订单表orders的所有数据
SELECT id,user_id,number,createtime,note FROM orders,这里的数据库表user_id与pojo的Order对象中的userId不一致
orders表:
Order对象:
OrderMapper.xml配置:
其中注释掉了另一种使用数据库别名解决列名和属性名不一致的问题
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sea.crm.mapper.OrderMapper">
<!-- 使用as 给列取别名解决类名和属性名不一致的情况 -->
<!--<select id="queryAll" resultType="Order"> SELECT id,user_id as userId,number,createtime,note
FROM orders </select> -->
<!-- 使用resultMap解决列名和属性名不一致的情况 -->
<!-- 配置一个resultMap映射列和属性 -->
<resultMap type="Order" id="orderMap">
<!-- id:设置ResultMap的id -->
<!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
<!-- property:主键在pojo中的属性名 -->
<!-- column:主键在数据库中的列名 -->
<id column="id" property="id" />
<!-- 映射其他普通列 -->
<result column="user_id" property="userId" />
<result property="number" column="number" />
<result property="createtime" column="createtime" />
</resultMap>
<!-- 方法的返回值可以使用 -->
<select id="queryAll" resultMap="orderMap">
SELECT id,user_id ,number,createtime,note FROM orders
</select>
</mapper>
单元测试:
public class OrderMapperTest {
SqlSessionFactory factory = null;
private OrderMapper orderMapper = null;
@Before
public void testInit() {
// 1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 2. 加载SqlMapConfig.xml配置文件
// /20181013_mybatis/config/SqlMapConfig.xml
InputStream in = MyBatisTest.class.getResourceAsStream("/SqlMapConfig.xml");
// 3. 创建SqlSessionFactory对象
factory = builder.build(in);
}
@Test
public void testqueryAll() {
SqlSession session = factory.openSession();
OrderMapper orderMapper = session.getMapper(OrderMapper.class);
List<Order> orders = orderMapper.queryAll();
System.out.println(orders);
}
}