在 MyBatis 中,通过
在
一对多关联查询可采用以下两种方式:
以用户和订单为例讲解一对多关联查询(实现“根据 id 查询用户及其关联的订单信息”的功能)的处理过程。
需要两张数据表,一张是用户表 user,一张是订单表 order,这两张表具有一对多的级联关系,创建过程省略。
创建持久化类 User 和 Order,代码分别如下
//User 类
public class User {
private int id;
private String name;
private String pwd;
private List orderList;
/*省略setter和getter方法*/
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", orderList=" + orderList + "]";
}
}
//Order 类
public class Order {
private int id;
private int ordernum;
/*省略setter和getter方法*/
@Override
public String toString() {
return "Order [id=" + id + ", ordernum=" + ordernum + "]";
}
}
OrderMapper 类代码如下
public List selectOrderById(int id);
OrderMapper.xml 中相应的映射 SQL 语句
UserMapper 类
public User selectUserOrderById1(int id);
UserMapper.xml 中相应的映射 SQL 语句
测试:
public class Test {
public static void main(String[] args) throws IOException {
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
SqlSession ss = ssf.openSession();
User us = ss.getMapper(UserMapper.class).selectUserOrderById1(1);
System.out.println(us);
}
}
运行结果:
DEBUG [main] - ==> Preparing: select * from user where id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - ====> Preparing: SELECT * FROM `order` where userId=?
DEBUG [main] - ====> Parameters: 1(Integer)
DEBUG [main] - <==== Total: 2
DEBUG [main] - <== Total: 1
User [id=1, name=测试1, orderList=[Order [id=0, ordernum=20200107], Order [id=0, ordernum=20200645]]]
该种方式实现一对多关联查询需要修改 Order 持久化类,因为 Order 中的 id 不能和 User 中的 id 重复
public class Order {
private int oId;
private int ordernum;
/*省略setter和getter方法*/
@Override
public String toString() {
return "Order [id=" + oId+ ", ordernum=" + ordernum + "]";
}
}
UserMapper.xml 中相关映射 SQL 语句如下
测试:
public class Test {
public static void main(String[] args) throws IOException {
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
SqlSession ss = ssf.openSession();
User us = ss.getMapper(UserMapper.class).selectUserOrderById2(1);
System.out.println(us);
}
}
DEBUG [main] - ==> Preparing: SELECT u.*,o.id as oId,o.ordernum FROM `user` u,`order` o WHERE u.id=o.`userId` AND u.id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 2
User [id=1, name=测试1, orderList=[Order [id=1, ordernum=20200107], Order [id=4, ordernum=20200645]]]