当查询结果是由多个表组成的,这时就必须手动映射,如order(订单表),user(用户表),以order为中心,一个order只能对应一个user。
sql语句:select o.id,o.user_id,o.number,o.createtime,u.username from user u LEFT JOIN orders o on u.id=o.user_id
一个user可以有多个order,这里是以user为中心,所以无论user是否有order,user都会出现在结果中,因此执行结果:
在orderMapper配置文件中:
<!-- 一对多关联 -->
<resultMap type="User1" id="user">
<result column="username" property="username"/>
<collection property="orderList" ofType="demo1.Order">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<!-- 如果发生了错误,首先看类属性名与property是否一致 -->
</collection>
</resultMap>
<select id="selectUser" resultMap="user">
select o.id,o.user_id,o.number,o.createtime,u.username from user u LEFT JOIN orders o on u.id=o.user_id
</select>
因为一对多关联,以user为中心,一个user可以对应多个order,所以需要在user对象中添加一个List<-Order->集合
在orderMapper接口中声明方法selectUser:
public interface OrderMapper {
public List<Order> selectAll();
public List<Order> selectOrder();
public List<User1> selectUser();
}
测试代码进行测试:
@Test
public void oneTomore(){
SqlSession sqlSession=sqlSessionFactory.openSession();
OrderMapper mapper=sqlSession.getMapper(OrderMapper.class);
List<User1> list=mapper.selectUser();
for (User1 user1 : list) {
System.out.println(user1);
}
}
因为在User1类中重写了tostring方法,只输出数据库查询结果对应的属性的(因为其他属性为null):
@Override
public String toString() {
return "User1 [ username=" + username + ", orderList=" + orderList + "]";
}
所以执行结果:
User1 [ username=王五, orderList=[Order [id=3, userId=1, number=1000010, createtime=Wed Feb 04 13:22:35 CST 2015, note=null, user=null], Order [id=4, userId=1, number=1000011, createtime=Tue Feb 03 13:22:41 CST 2015, note=null, user=null]]]
User1 [ username=张三, orderList=[Order [id=5, userId=10, number=1000012, createtime=Thu Feb 12 16:13:23 CST 2015, note=null, user=null]]]
User1 [ username=陈小明, orderList=[]]
User1 [ username=张三丰, orderList=[]]
User1 [ username=znsulBKJS, orderList=[]]
User1 [ username=李四, orderList=[]]
User1 [ username=小明, orderList=[]]
注意:
因为一对多关联,以user为中心,一个user可以对应多个order,所以需要在user对象中添加一个List<-Order->集合
别忘了order和user类要实现序列化接口
如果发生了错误首先看property中值是否与类属性名是否一致,以及数据库列名称与column值是否一致
属性需要有get和set方法