后台数据往往会涉及多张表。在进行数据查询的时候往往会涉及查询多张表的信息。
今天记录的是mybatis中的一对一查询。
我的例子是根据订单号查询一个订单(orders)并且查询出下订单的用户(user)的姓名和地址。
我的数据库如下图所示:
一对一查询目前我所知道有两种办法:
(1)通过继承类来实现。即建立一个订单实体类,另一个类继承这个实体类,并在类中添加其他所需要查询的字段来实现查询。
order类:
package com.zwj.model;
import java.util.Date;
import java.util.List;
public class Order {
private Integer id;
private Integer user_id;
private String number;
private Date createtime;
private String note;
@Override
public String toString() {
return "Order{" +
"id=" + id +
", user_id=" + user_id +
", number='" + number + '\'' +
", createtime=" + createtime +
", note='" + note + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
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;
}
}
继承类:
package com.zwj.model;
public class Orderext extends Order {
private String username;
private String address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Orderext{" +
"username='" + username + '\'' +
", address='" + address + '\'' +
'}'+super.toString();
}
}
(这里只是简单介绍思路,其他操作mapper接口,映射文件和测试都和常规操作一样进行,这里就不在贴了)
(2)通过简单类实现。在我们查询的主实体类中添加另一个需要关联查询的实体作为属性。
order类:
package com.zwj.model;
import java.util.Date;
import java.util.List;
public class Order {
private Integer id;
private Integer user_id;
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;
}
@Override
public String toString() {
return "Order{" +
"id=" + id +
", user_id=" + user_id +
", number='" + number + '\'' +
", createtime=" + createtime +
", note='" + note + '\'' +
", user=" + user +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
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;
}
}
Mapper接口方法:
public Order findUnionByid2(int id);
映射文件:
测试:
@Test
public void test2(){
OrdeMapper ordemapper =session.getMapper(OrdeMapper.class);
Order orderext=ordemapper.findUnionByid2(3);
System.out.println("查询结果为:"+orderext);
//session.commit();
}
根据订单编号查询订单数据(创建时间,用户id等),并且要查出用户信息(用户姓名,用户地址等),还要查出订单详情(订单中有哪几个商品,商品数量等)。
下面是订单详情的数据库表:
这时,在order类中添加以下语句:
private List orderdetails;
public List getOrderdetails() {
return orderdetails;
}
public void setOrderdetails(List orderdetails) {
this.orderdetails = orderdetails;
}
接口方法:
public Order findUnionByid3(int id);
映射文件:
测试:
@Test
public void test3(){
OrdeMapper ordemapper =session.getMapper(OrdeMapper.class);
Order orderext=ordemapper.findUnionByid3(3);
System.out.println("查询结果为:"+orderext);
System.out.println("查询结果为:"+orderext.getUser());
System.out.println("查询结果为:"+orderext.getOrderdetails());
//session.commit();
}
总结:
在映射文件中配置resultMap的时候,如果属性是实体类,使用association标签配置,且使用属性javaType配置返回类型。如果属性是集合(List等),使用collection
标签配置,且使用属性ofType配置返回类型!