mybatis多表关联查询 - 外连接

本文详细介绍了MyBatis框架中两种主要的关联查询方法:resultType和resultMap。通过具体的代码实例,展示了如何实现一对一和一对多的关联查询,并对比了这两种方法的特点和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • resultType方式

实体类

public class Orders{
    private Long id;
    private String name;
    private Double prices;
    //略
}

public class Custom extends Orders{
    private String name;
    private String sex;
    private String address;
    //略
}

UserMapper.xml

<select id="findOrdersUser" resultType="Custom">
    select u.name,u.sex,u.address,o.* from USER u left join ORDERS o 
    on u.id=o.user_id
</select>
  • resultMap方式

  • 一对一关联

实体类

public class Student {
	private int id;
	private String name;
	private int cid;
	private Classroom classroom;//写不写都可以
        //略
}

public class Classroom {
	private int id;
	private String name;
        //略
}

StudentMapper.xml  

<resultMap type="Student" id="mymap">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="cid" property="cid"/>
    <association property="classroom" javaType="Classroom">
        <!-- id:关联查询用户的唯一标识
	column:指定唯一标识用户信息的列
	javaType:映射到Student的哪个属性
	-->
        <id column="cid" property="id"/>
        <result column="cname" property="name"/>
    </association>
</resultMap>
<select id="selAll" resultMap="mymap">
    select s.id,s.name,s.cid,c.id cid,c.name cname from student s left join classroom c 
    on s.cid=c.id	
</select>

 

  •  一对多关联

 实体类

public class Classroom {
	private int id;
	private String name;
	private List<Student> stuList;
        //略
}

public class Student {
	private int id;
	private String name;
        //略
}

ClassroomMapper.xml

<resultMap type="Classroom" id="mymap">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <collection property="stuList" ofType="Student">
        <!-- 
		collection:对关联查询到多条记录映射到集合对象中
		property:将关联查询到多条记录映射到Classroom的stuList属性
		ofType:指定映射到list集合属性中pojo的类型
		 -->
        <id column="sid" property="id"/>
        <result column="sname" property="name"/>
    </collection>
</resultMap>
<select id="selAll" resultMap="mymap">
    select c.id,c.name,s.id sid,s.name sname from classroom c left join student s 
    on s.cid=c.id	
</select>
  • resultType、resultMap总结:

resultType:

作用:将查询结果按照sql列名、pojo属性名一致性映射到pojo中。

场合:常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

 

resultMap:使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。

 

association:

作用:将关联查询信息映射到一个pojo对象中。

场合:为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。

         使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。

        

collection:

作用:将关联查询信息映射到一个list集合中。

场合:为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。

         如果使用resultType无法将查询结果映射到list集合中。

  • AutoMapping一对一关联查询

    把对象间的关联关系通过起别名的方式,连接对象属性和sql字段。

    别名格式: `对象名.属性名`

                    其中 ` 是mysql中去关键字的

                     . 点在sql命令中是关键字

实体类

public class Student {
	private int id;
	private String name;
	private int cid;
	private Classroom classroom;//写不写都可以
        //略
}

public class Classroom {
	private int id;
	private String name;
        //略
}

StudentMapper.xml

	<select id="selAll" resultType="Student">
		select s.id,s.name,s.cid,c.id `classroom.id`,c.name `classroom.name` 
        from student s left join classroom c on s.cid=c.id	
	</select>

 

转载于:https://my.oschina.net/gAKey/blog/1788150

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值