使用resultMap,定义专门的resultMap用于映射一对一查询结果。
1.一对一映射的自动映射方式可以参考我的上一篇博文:https://www.cnblogs.com/wyhluckdog/p/10156805.html
2.手动映射的情况时,我们不需要将所有的属性都整合到UserOrders中了,我们只需要将用户信息表的User类对象定义在保存orders表属性信息的类Orders中。User中的内容为:
package com.huida.po; import java.util.Date; public class User { private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 public void setId(int id) { this.id = id; } public void setUsername(String username) { this.username = username; } public void setSex(String sex) { this.sex = sex; } public void setBirthday(Date birthday) { this.birthday = birthday; } public void setAddress(String address) { this.address = address; } public int getId() { return id; } public String getUsername() { return username; } public String getSex() { return sex; } public Date getBirthday() { return birthday; } public String getAddress() { return address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + "]"; } }
Orders类的定义内容为:
package com.huida.po; import java.util.Date; public class Orders { private Integer id; private Integer userId; private String number; private Date createtime; private String note; private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } }
3.在UserMapper接口中定义方法:
public List<Orders> findOrdersAndUser2();
4.在UserMapper.xml进行配置:
<resultMap type="com.huida.po.Orders" id="orderAndUserResultMap"> <!-- id标签指定主键字段的对应关系 --> <id column="id" property="id"></id> <!-- result标签指定非主键字段的对应关系 --> <result column="user_id" property="userId"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property="note"/> <!-- association指定单个对象的对应关系 property:指定将数据放入Orders中的user属性中 javaType:user属性到的类型 --> <association property="user" javaType="com.huida.po.User"> <id column="uid" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="birthday" property="birthday"/> <result column="address" property="address"/> </association> </resultMap> <select id="findOrdersAndUser2" resultMap="orderAndUserResultMap"> <!-- select后面的属性名必须和resultMap中定义的属性名相同 --> select a.*,b.id uid,username,birthday,sex,address from orders a,user b where a.user_id=b.id </select>
这里进行手动配置以建立po类与配置文件的关联关系。
resultMap标签中的type属性指定返回值的类型,id用来进行唯一标识。
association:表示进行关联查询单条记录
property:表示关联查询的结果存储在cn.huida.po.Orders的user属性中
javaType:表示关联查询的结果类型
id标签指定主键字段的对应关系
<id column="user_id" property="userId"/>:查询结果的user_id列对应关联对象的id属性,这里是<id />表示user_id是关联查询对象的唯一标识。
result标签指定非主键字段的对应关系
<result property="username" column="username"/>:查询结果的username列对应关联对象的username属性。
5.测试代码为:
@Test public void testfindOrdersAndUsers2(){ //创建SqlSession SqlSession openSession=factory.openSession(); //通过会话的getMapper方法来实例化接口(实现类的对象) UserMapper userMapper=openSession.getMapper(UserMapper.class);//参数放接口的字节码文件 List<Orders> list=userMapper.findOrdersAndUser2(); for(Orders order:list){ System.out.println(order.getNumber()+"...."+order.getUser().getUsername()); } }
6.小结:
使用association完成关联查询,将关联查询信息映射到po对象中。