在實際開發中,實體類之間有一對一、一對多、多對多的關系,所以需要正確配置它們對應關系,Mybatis通過配置文件能夠從數據庫中獲取列數據后自動封裝成對象。
如:一個訂單Orders類對應一個用戶User類,一個User類對應多個Orders類。
Orders.java
package cn.itheima.pojo; 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 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 == null ? null : number.trim(); } 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 == null ? null : note.trim(); } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
User.java
package cn.itheima.pojo; import java.util.Date; import java.util.List; public class User { private int id; private String username;// 用戶姓名 private String sex;// 性別 private Date birthday;// 生日 private String address;// 地址 private List<Orders> ordersList; // 一個用戶對應多個訂單 public List<Orders> getOrdersList() { return ordersList; } public void setOrdersList(List<Orders> ordersList) { this.ordersList = ordersList; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String i) { this.sex = i; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; } }
一、一對一映射
1、 在UserMapper.xml中配置Orders和User的一對一映射關系
<!-- id:resultMap的唯一標識 type:將查詢出的數據放入到指定對象中 注意:手動映射需要指定數據庫中表的字段名與java中pojo類的屬性名稱對應關系 --> <resultMap type="cn.itheima.pojo.Orders" id="orderAndUserResultMap"> <!-- id:指定主鍵字段對應關系 column:列,數據庫中的字段名稱 property:屬性,pojo的屬性名稱 --> <id column="id" property="id"/> <!-- result:指定非主鍵字段的對應關系 --> <result column="user_id" property="userId"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property="note"/> <!-- 指定單個對象的對應關系 property:指定將數據放入Orders中的user屬性中 javaType:user屬性的類型 --> <association property="user" javaType="cn.itheima.pojo.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 a.*,b.id uid,username,birthday,sex,address FROM orders a,user b WHERE a.user_id=b.id </select>
2、在UserMapper.java中編寫接口
List<Orders> findOrdersAndUser2();
3、測試
@Test public void testFindOrdersAndUser2() throws Exception { SqlSession session = sqlSessionFactory.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); List<Orders> list = userMapper.findOrdersAndUser2(); System.out.println(list); }
二、一對多映射
1、在UserMapper.xml中配置User和Orders的一對多關系
<resultMap type="cn.itheima.pojo.User" id="userAndOrdersResultMap"> <id column="id" property="id"/> <result column="birthday" property="birthday"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="address" property="address"/> <!-- 指定對應的集合對象關系映射 property:將數據放入user對象中的ordersList中 ofType:指定ordersList屬性的泛型類型 --> <collection property="ordersList" ofType="cn.itheima.pojo.Orders"> <id column="oid" property="id"/> <result column="user_id" property="userId"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> </collection> </resultMap> <select id="findUserAndOrders" resultMap="userAndOrdersResultMap"> SELECT a.*,b.id oid,user_id,number,createtime FROM user a,orders b WHERE a.id=b.user_id </select>
2、在UserMapper.java中編寫接口
List<User> findUserAndOrders();
3、測試
@Test public void testFindUserAndOrders() throws Exception { SqlSession session = sqlSessionFactory.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); List<User> list = userMapper.findUserAndOrders(); System.out.println(list); }