mybatis 查询对象一对多怎么查

Mybatis关联查询一对一和一对多的实现
本文主要讲了使用Mybatis实现关联查询,分为一对一和一对多两种情况,最后并对ResultMap进行一个简要说明。
一、创建表、分析
下面是两表,一个是顾客表,一个是车票表。一个顾客可以对应多张车票,但是一张车票只能对应一个顾客
t_customer:顾客表,一个顾客可以对应多张车票
t_ticket:车票表,一张车票只能对应一个顾客
1、创建数据表及插入初始数据
创建数据表
DROP TABLE IF EXISTS t_
CREATE TABLE t_customer(
customerId INT PRIMARY KEY AUTO_INCREMENT,
customerName VARCHAR(20) NOT NULL,
customerTel INT NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS t_
CREATE TABLE t_ticket(
ticketId INT PRIMARY KEY
AUTO_INCREMENT,
ticketAddress VARCHAR(50) NOT NULL,
ticketPrice INT NOT NULL,
ticketCId INT NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入数据:
insert into t_customer values(1,'小王',);
insert into t_customer values(2,'天天',);
insert into t_customer values(3,'阿大',);
insert into
t_ticket values(1,'武汉到重庆',100,1);
insert into
t_ticket values(2,'北京到上海',200,1);
insert into
t_ticket values(3,'深圳到广州',50,1);
传统的联合查询的方法
select c.*,t.* from t_customer c
JOIN t_ticket t ON (c.customerId=t.ticketCId) where c.customerName ='小王';
结果如下:
二、工程创建
1、新建java工程,导入需要的包,最后整个工程目录 如下:
2、创建表对应的类:
Customer.java:
package com.mucfc.
import java.util.L
*顾客信息类
*@author linbingwen
*@日8:30:12
public class Customer {
private Integer customerId;
private String customerN
private Integer customerT
private List//使用一个List来表示车票
public List getTickets() {
public void setTickets(List tickets) {
this.tickets =
public Integer getCustomerId() {
return customerId;
public void setCustomerId(Integer customerId) {
this.customerId = customerId;
public String getCustomerName() {
return customerN
public void setCustomerName(String customerName) {
this.customerName = customerN
public Integer getCustomerTel() {
return customerT
public void setCustomerTel(Integer customerTel) {
this.customerTel = customerT
public String toString() {
return &Customer [customerId=& + customerId + &, customerName=&
+ customerName + &, customerTel=& + customerTel+&]&;
Ticket.java:
package com.mucfc.
*车票信息类
*@author linbingwen
*@日8:30:12
public class Ticket {
private Integer ticketId;
private String ticketA
private Integer ticketP
private Integer ticketCId;
private C//使用一个customer来表示顾客
public Customer getCustomer() {
public void setCustomer(Customer customer) {
this.customer =
public Integer getTicketId() {
return ticketId;
public void setTicketId(Integer ticketId) {
this.ticketId = ticketId;
public String getTicketAddress() {
return ticketA
public void setTicketAddress(String ticketAddress) {
this.ticketAddress = ticketA
public Integer getTicketPrice() {
return ticketP
public void setTicketPrice(Integer ticketPrice) {
this.ticketPrice = ticketP
public Integer getTicketCId() {
return ticketCId;
public void setTicketCId(Integer ticketCId) {
this.ticketCId = ticketCId;
public String toString() {
return &Ticket [ticketId=& + ticketId + &, ticketAddress=&
+ ticketAddress + &, ticketPrice=& + ticketPrice
+ &, ticketCId=& + ticketCId + &]&;
注意Customer.java:中有个list,list来存放车票,Ticket.java中有一个 customer。
3、定义sql映射文件
(1)首先是一对多关联:
MyBatis中使用collection标签来解决一对一的关联查询,collection标签可用的属性如下:property:指的是集合属性的值ofType:指的是集合中元素的类型column:所对应的外键字段名称select:使用另一个查询封装的结果
&?xml version=&1.0& encoding=&UTF-8& ?&
&!DOCTYPE mapper PUBLIC &-//mybatis.org//DTD Mapper 3.0//EN&
&https://mybatis.org/dtd/mybatis-3-mapper.dtd&&
&mapper namespace=&com.mucfc.model.CustomerMapper&&
&!-- 定义字段与实体对象的映射关系 --&
&resultMap type=&Customer& id=&customerBean&&
&id column=&customerId& property=&customerId&/&
&result column=&customerName& property=&customerName&/&
&result column=&customerTel& property=&customerTel&/&
&!-- 一对多的关系 --&
&!-- property: 指的是集合属性的值, ofType:指的是集合中元素的类型 --&
&collection property=&tickets& ofType=&Ticket&&
&id column=&ticketId& property=&ticketId&/&
&result column=&ticketAddress& property=&ticketAddress&/&
&result column=&ticketPrice& property=&ticketPrice&/&
&result column=&ticketCId& property=&ticketCId&/&
&/collection&
&/resultMap&
&!-- 根据id查询Person, 关联将Orders查询出来 --&
&select id=&selectCustomerByName& parameterType=&string& resultMap=&customerBean&&
select c.*,t.* from t_customer c,t_ticket t
c.customerId=t.ticketCId and c.customerName =#{customerName};
(2)接着是一对一关联:
MyBatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下:property:对象属性的名称javaType:对象属性的类型column:所对应的外键字段名称select:使用另一个查询封装的结果
&?xml version=&1.0& encoding=&UTF-8& ?&
&!DOCTYPE mapper PUBLIC &-//mybatis.org//DTD Mapper 3.0//EN&
&https://mybatis.org/dtd/mybatis-3-mapper.dtd&&
&mapper namespace=&com.mucfc.model.TicketMapper&&
&!-- 定义数据库字段与实体对象的映射关系
&resultMap type=&Ticket& id=&ticketBean&&
&id column=&ticketId& property=&ticketId& /&
&result column=&ticketAddress& property=&ticketAddress& /&
&result column=&ticketPrice& property=&ticketPrice& /&
&result column=&ticketCId& property=&ticketCId& /&
&!-- 一对一的关系 --&
&!-- property: 指的是属性的值, javaType:指的是元素的类型 --&
&association property=&customer& javaType=&Customer&&
&id column=&customerId& property=&customerId& /&
&result column=&customerName& property=&customerName& /&
&result column=&customerTel& property=&customerTel& /&
&/association&
&/resultMap&
&!-- 根据id查询ticket, 关联将Customer查询出来 --&
&select id=&selectTicketById& parameterType=&int& resultMap=&ticketBean&&
select c.*,t.* from t_customer c,t_ticket t where
c.customerId=t.ticketCId and t.ticketId =#{ticketId}
4、总配置文件
&?xml version=&1.0& encoding=&UTF-8& ?&
&!DOCTYPE configuration
PUBLIC &-//mybatis.org//DTD Config 3.0//EN&
&https://mybatis.org/dtd/mybatis-3-config.dtd&&
&!-- 这是根标签
&configuration&
&!-- 设置别名
&typeAliases&
&typeAlias alias=&Customer& type=&com.mucfc.model.Customer&/&
&typeAlias alias=&Ticket& type=&com.mucfc.model.Ticket& /&
&/typeAliases&
&!-- 配置数据源相关的信息
&environments default=&development&&
&environment id=&development&&
&transactionManager type=&JDBC& /&
&dataSource type=&POOLED&&
&property name=&driver& value=&com..jdbc.Driver&/&
&property name=&url& value=&jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&/&
&property name=&username& value=&root&/&
&property name=&password& value=&christmas258@&/&
&/dataSource&
&/environment&
&/environments&
&!-- 列出映射文件 --&
&mapper resource=&com/mucfc/model/CustomerMapper.xml& /&
&mapper resource=&com/mucfc/model/TicketMapper.xml& /&
&/mappers&
&/configuration&
package com.mucfc.
import java.io.R
import java.util.L
import org.apache.ibatis.io.R
import org.apache.ibatis.session.SqlS
import org.apache.ibatis.session.SqlSessionF
import org.apache.ibatis.session.SqlSessionFactoryB
import com.mucfc.model.C
import com.mucfc.model.T
public class Test {
private static SqlSessionFactory sqlSessionF
private static R
reader = Resources.getResourceAsReader(&mybatis-config.xml&);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
* 一对一关联查询
public static void selectTicketById(int id) {
SqlSession session =
session = sqlSessionFactory.openSession();
Ticket ticket = (Ticket) session.selectOne(
&com.mucfc.model.TicketMapper.selectTicketById&, id);
if (ticket == null)
System.out.println(&null&);
System.out.println(ticket);
System.out.println(ticket.getCustomer());
} finally {
session.close();
* 一对多关联查询
public static void selectCustomerByName(String string) {
SqlSession session =
session = sqlSessionFactory.openSession();
Customer customer = (Customer) session
.selectOne(
&com.mucfc.model.CustomerMapper.selectCustomerByName&,
if (customer == null)
System.out.println(&null&);
System.out.println(customer);
List tickets = customer.getTickets();
for (Ticket ticket : tickets) {
System.out.println(ticket);
} finally {
session.close();
public static void main(String[] args) {
System.out.println(&==============一对一查询,根据车票来查顾客===============&);
selectTicketById(1);
System.out.println(&==============多对一查询,根据顾客来查车票===============&);
selectCustomerByName(&小王&);
结果显示,查询正确。
三、ResultMap标签                        
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap的时候,因为Map不能很好表示领域模型,我们就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
当接口与XML文件在一个相对路径下时,可以不在myBatis配置文件的mappers中声明:
&!-- 列出映射文件 --&
&mapper resource=&com/mucfc/model/CustomerMapper.xml& /&
&mapper resource=&com/mucfc/model/TicketMapper.xml& /&
&/mappers&
SQL 映射XML 文件一些初级的元素:
1. cache & 配置给定模式的缓存
2. cache-ref & 从别的模式中引用一个缓存
3. resultMap & 这是最复杂而却强大的一个元素了,它描述如何从结果集中加载对象
4. sql & 一个可以被其他语句复用的SQL 块
5. insert & 映射INSERT 语句
6. update & 映射UPDATE 语句
7. delete & 映射DELEETE 语句
8. select - 映射SELECT语句
resultMap 是MyBatis 中最重要最强大的元素了。你可以让你比使用JDBC 调用结果集省掉90%的代码,也可以让你做许多JDBC 不支持的事。现实上,要写一个等同类似于交互的映射这样的复杂语句,可能要上千行的代码。ResultMaps 的目的,就是这样简单的语句而不需要多余的结果映射,更多复杂的语句,除了只要一些绝对必须的语句描述关系以外,再也不需要其它的。
resultMap属性:type为java实体类;id为此resultMap的标识。
resultMap可以设置的映射:
1. constructor & 用来将结果反射给一个实例化好的类的构造器
a) idArg & ID 参数;将结果集标记为ID,以方便全局调用
b) arg &反射到构造器的通常结果
2. id & ID 结果,将结果集标记为ID,以方便全局调用
3. result & 反射到JavaBean 属性的普通结果
4. association & 复杂类型的结合;多个结果合成的类型
a) nested result mappings & 几resultMap 自身嵌套关联,也可以引用到一个其它上
5. collection &复杂类型集合a collection of complex types
6. nested result mappings & resultMap 的集合,也可以引用到一个其它上
7. discriminator & 使用一个结果值以决定使用哪个resultMap
a) case & 基本一些值的结果映射的case 情形
i. nested result mappings &一个case 情形本身就是一个结果映射,因此也可以包括一些相同的元素,也可以引用一个外部resultMap。mybatis学习之高级映射中的一对多查询
一对多查询
mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中
使用resultType实现: 将订单明细映射到order中的orderdetails中,需要自行处理(双重循环遍历),将订单明细存储在orderdetails的集合中。
在此处使用resultMap实现
查询订单及订单明细的信息
2 、sql语句
确定主查询表:订单表 order 确定关联查询表: 订单明细表 orderdetail 在一对一查询的基础上,添加订单明细表的关联即可
SELECT orders.*,user.`username`,user.`sex`,user.`address` , orderdetail.`id` orderdetail_id,orderdetail.`items_id`, orderdetail.`items_num`,orderdetail.`orders_id` FROM orders,USER,orderdetail WHERE orders.`user_id` = user.`id` AND orderdetail.`orders_id` = orders.`id`
若使用resultType将上面的查询结果集映射到pojo中时,订单信息的pojo中会重复 要求: 对于order映射不能出现重复记录 设想: 在order,java类中添加List属性 最终会将订单信息映射到order中,订单所对应的订单明细映射到order中的list中去 结果: 映射成的order记录数为两条(order信息不重复) 每一个order中的orderdetail属性存储了该订单所对应的订单明细
4、在orders类中添加list订单明细属性
private Integer userId;
//用户信息
//订单详情List
private List OrderD
5、resultMap的定义
6、mapper.xml
SELECT orders.*,user.`username`,user.`sex`,user.`address` , orderdetail.`id` orderdetail_id,orderdetail.`items_id`, orderdetail.`items_num`,orderdetail.`orders_id` FROM orders,USER,orderdetail WHERE orders.`user_id` = user.`id` AND orderdetail.`orders_id` = orders.`id`
7、mapper.java
//查询订单关联查询用户和订单详情
public List findOrderAndOrderDetailResultMap() throws E
8、测试代码
public void testFindOrderAndOrderDetailResultMap() throws Exception{
SqlSession sqlSession = sqlSessionFactory.openSession();
OrderMapperCustom orderMapperCustom = sqlSession.getMapper(OrderMapperCustom.class);
List list = orderMapperCustom.findOrderAndOrderDetailResultMap();
System.out.println(list);
9、log4j输出结果
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG [main] - Class not found: org.jboss.vfs.VFS
DEBUG [main] - JBoss 6 VFS API is not available in this environment.
DEBUG [main] - Class not found: org.jboss.vfs.VirtualFile
DEBUG [main] - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
DEBUG [main] - Using VFS adapter org.apache.ibatis.io.DefaultVFS
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo
DEBUG [main] - Reader entry: Items.class
DEBUG [main] - Reader entry: Order.class
DEBUG [main] - Reader entry: OrderCustom.class
DEBUG [main] - Reader entry: OrderDetail.class
DEBUG [main] - Reader entry: User.class
DEBUG [main] - Reader entry: UserCustom.class
DEBUG [main] - Reader entry: UserQueryVo.class
DEBUG [main] - Listing file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Items.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Items.class
DEBUG [main] - Reader entry: ????
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Order.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Order.class
DEBUG [main] - Reader entry: ????
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderCustom.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderCustom.class
DEBUG [main] - Reader entry: ????
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderDetail.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderDetail.class
DEBUG [main] - Reader entry: ????
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/User.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/User.class
DEBUG [main] - Reader entry: ????
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserCustom.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserCustom.class
DEBUG [main] - Reader entry: ????
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserQueryVo.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserQueryVo.class
DEBUG [main] - Reader entry: ????
DEBUG [main] - Checking to see if class pojo.Items matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.Order matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.OrderCustom matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.OrderDetail matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.User matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.UserCustom matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.UserQueryVo matches criteria [is assignable to Object]
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper
DEBUG [main] - Reader entry: OrderMapperCustom.class
DEBUG [main] - Reader entry: OrderMapperCustom.xml
DEBUG [main] - Reader entry: UserMapper.class
DEBUG [main] - Reader entry: UserMapper.xml
DEBUG [main] - Listing file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.class
DEBUG [main] - Reader entry: ????
4   
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.xml
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.xml
DEBUG [main] - Reader entry:
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.class
DEBUG [main] - Reader entry: ????
4    findUserByIdResultMap (I)Lpojo/U
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.xml
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.xml
DEBUG [main] - Reader entry:
DEBUG [main] - Checking to see if class mapper.OrderMapperCustom matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class mapper.UserMapper matches criteria [is assignable to Object]
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection .
DEBUG [main] - Setting autocommit to false on JDBC Connection [com..jdbc.JDBC4Connection@1990a65e]
DEBUG [main] - ==&
Preparing: select COUNT(*) from user WHERE user.sex = ? and user.username LIKE '%测试%'
DEBUG [main] - ==& Parameters: 1(String)
DEBUG [main] - &==
Process finished with exit code 0● 进阶之路(24)
--------【
  说了MyBatis中的一对一查询的两种方法,这里总结一下MyBatis中一对多和多对一的查询方法。
  业务还用中的订单业务来分析,表结构如下:
  如上图订单和用户的关系,一个订单对应多个订单明细表,这里以订单为主查询表,在查询订单的同时,查询出每个订单所包含的订单明细集合,顺便把每个订单对应的用户也查询出来。(即在上篇文章的基础上,再查询出每个订单所包含的订单明细)
  由于每个订单可能有多个订单明细,所以这时需要用esultMap映射结果集。如果使用resultType会很麻烦,需要去重(比如文章末尾的图片中,sql查询出的是8条记录,但实际上这8条订单明细只属于4个订单实体,所以需要手动循环、判断、去重~)。
  具体用法如下:
  订单实体在的基础上,添加订单明细的集合 orderDetails:
public class Orders {
private Integer userId;
private List&OrderDetail& orderD
  映射文件OrdersMapper.xml
&?xml version="1.0" encoding="UTF-8" ?&
&!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" &
namespace="com.danny.mybatis.mapper.OrdersMapper" &
type="com.danny.mybatis.po.Orders" id="OrdersUserOrderDetailResultMap"&
property="user" javaType="com.danny.mybatis.po.User"&
id:关联查询用户的唯一标识
column:指定唯一标识用户信息的列
property:映射到user的哪个属性
column="user_id" property="id"/&
column="username" property="username"/&
column="sex" property="sex"/&
column="address" property="address"/&
property="orderDetails" ofType="com.danny.mybatis.po.OrderDetail"&
column="orderdetail_id" property="id"/&
column="items_id" property="itemsId"/&
column="items_num" property="itemsNum"/&
column="orders_id" property="ordersId"/&
id="findOrdersUserOrderDetailResultMap" resultMap="OrdersUserOrderDetailResultMap" &
user.username,
user.address,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id
from orders,user,orderdetail
where orders.user_id=user.id
and orders.id=orderdetail.orders_id
  在上面resultMap配置中,共有三个部分,配置映射的订单信息、配置映射的用户信息和配置映射的订单明细信息。前两部分与中的一致,这里不再多说。
  映射Ordes中的订单集合orderDetails要用&collection&&/collection&进行映射,它的作用是把关联查询到的多条记录映射到集合对象中,property表示将关联查询到的多条订单明细记录映射到Orders的哪个属性中,与&association&&/association& 中的javaType不同,这里指定orderDetails的类型要用ofType属性,它表示指定映射到集合属性中的pojo的类型。
  因为这个resultMap的配置大约有2/3的代码都与上篇文章中的resultMap一直,因此也可以跟java类似的,让这个resultMap继承已有的resultMap,如下:
type="com.danny.mybatis.po.Orders" id="OrdersUserOrderDetailResultMap" extends="OrdersUserResultMap"&
property="orderDetails" ofType="com.danny.mybatis.po.OrderDetail"&
column="orderdetail_id" property="id"/&
column="items_id" property="itemsId"/&
column="items_num" property="itemsNum"/&
column="orders_id" property="ordersId"/&
  mapper接口
public interface OrdersMapper{
List&Orders& findOrdersUserOrderDetailResultMap() throws E
public void findOrdersUserOrderDetailResultMap(){
SqlSession sqlSession=sqlSessionFactory.openSession()
OrdersMapper ordersMapper=sqlSession.getMapper(OrdersMapper.class)
List&Orders& ordersList=ordersMapper.findOrdersUserOrderDetailResultMap()
System.out.println("共查询到"+((ordersList!=null && list.size()&0)?ordersList.size():0)+"个订单")
} catch (Exception e) {
e.printStackTrace()
System.out.println()
  上述sql语句查询出的结果为:
  断点查看list中的数据如下:
  虽然sql语句查询出的结果为8条数据,但实际上只有4个订单(通过id字段可以看出来),MyBatis自动把id相同的记录合并成一个订单实体,并根据resultMap中的配置,把属于同一个订单的订单明细分别放到了对应订单的订单明细集合中。
  如果熟悉Hibernate的话,到了这里,您是不是也和小编觉得这跟Hibernate的配置也有些相似呢~~
  如果要问多对一查询的话,实际上你已经不知不觉地实现了~订单和用户啥关系?多个订单可以属于一个用户,所以上面的配置中&association&&/association& 也可以实现多对一查询,不信你在好好看看上面list中的内容,第一和第二个订单所属的用户其实是同一个人:DannyHoo~
【 转载请注明出处——胡玉洋】
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:422708次
积分:9544
积分:9544
排名:第2005名
原创:166篇
评论:4113条
文章:14篇
阅读:24455
文章:11篇
阅读:16497
阅读:23228
(1)(1)(2)(4)(1)(1)(1)(4)(4)(4)(6)(7)(7)(4)(6)(7)(3)(4)(5)(7)(1)(3)(4)(4)(4)(4)(4)(4)(4)(4)(4)(3)(3)(4)(4)(4)(3)(1)(3)(1)(1)(3)(4)(2)(3)(3)(6)(4)(4)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'}

我要回帖

更多关于 mybatis一对多查询 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信