Mybatis中的连接查询与嵌套查询

1. sql准备

CREATE TABLE `address` (
  `a_id` int(11) NOT NULL AUTO_INCREMENT,
  `a_name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`a_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='地址表';

INSERT INTO `address` (`a_id`, `a_name`) VALUES ('1', '魏国');
INSERT INTO `address` (`a_id`, `a_name`) VALUES ('2', '蜀国');
INSERT INTO `address` (`a_id`, `a_name`) VALUES ('3', '吴国');

CREATE TABLE `person` (
  `p_id` int(20) NOT NULL AUTO_INCREMENT,
  `p_name` varchar(255) DEFAULT NULL,
  `p_aid` int(20) DEFAULT NULL,
  PRIMARY KEY (`p_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `person` (`p_id`, `p_name`, `p_aid`) VALUES ('1', '曹操', '1');
INSERT INTO `person` (`p_id`, `p_name`, `p_aid`) VALUES ('2', '荀彧', '1');
INSERT INTO `person` (`p_id`, `p_name`, `p_aid`) VALUES ('3', '张辽', '1');
INSERT INTO `person` (`p_id`, `p_name`, `p_aid`) VALUES ('4', '刘备', '2');
INSERT INTO `person` (`p_id`, `p_name`, `p_aid`) VALUES ('5', '关羽', '2');
INSERT INTO `person` (`p_id`, `p_name`, `p_aid`) VALUES ('6', '张飞', '2');
INSERT INTO `person` (`p_id`, `p_name`, `p_aid`) VALUES ('7', '诸葛亮', '2');
INSERT INTO `person` (`p_id`, `p_name`, `p_aid`) VALUES ('8', '孙权', '3');
INSERT INTO `person` (`p_id`, `p_name`, `p_aid`) VALUES ('9', '周瑜', '3');
INSERT INTO `person` (`p_id`, `p_name`, `p_aid`) VALUES ('10', '陆逊', '3');
INSERT INTO `person` (`p_id`, `p_name`, `p_aid`) VALUES ('11', '公孙瓒', NULL);

2. 实体类

2.1 Person

public class Person {
    private int pId;
    private String pName;
    private int pAid;
    private Address address;
    // getter/setter....
}

2.2 Address

public class Address {
    private int aId;
    private String aName;
    private List<Person> personList;
     // getter/setter....
}

3. 连接查询

连接查询使用时,使用偏向于a表所在方向的外连接,可获得a表所有信息,和对应的b表信息。该方式为饿汉式,内存占用较大,但对数据库访问次数较少而导致消耗时间少。

3.1 多对一/一对一

    <!--多对一(一对一)连接查询-->
    <resultMap id="map1" type="com.wyc.model.Person">
        <id column="p_id" property="pId"/>
        <result column="p_name" property="pName"/>
        <result column="p_aid" property="pAid"/>
        <association property="address" javaType="com.wyc.model.Address">
            <id column="a_id" property="aId"/>
            <result column="a_name" property="aName"/>
        </association>
    </resultMap>

    <select id="findAllPersonLianJie" resultMap="map1">
        select * from person p left join address a on p.p_aid = a.a_id
    </select>

dao

List<Person> findAllPersonLianJie();

3.2 一对多

    <!--一对多连接查询-->
    <resultMap id="map2" type="com.wyc.model.Address">
        <id column="a_id" property="aId"/>
        <result column="a_name" property="aName"/>
        <collection property="personList" ofType="com.wyc.model.Person">
            <id column="p_id" property="pId"/>
            <result column="p_name" property="pName"/>
            <result column="p_aid" property="pAid"/>
        </collection>
    </resultMap>

    <select id="findAllAddressLianJie" resultMap="map2">
        select * from address a left join person p on a.a_id = p.p_aid
    </select>

dao

 List<Address> findAllAddressLianJie();

4. 嵌套查询

嵌套查询使用时,先查询a表的信息,然后依赖a和b表的外键约束,利用in(),再次查询b表对应到a表上的信息。该方式可以改为饿汉式,内存使用较小,但需要多次访问数据库而导致消耗时间多。

4.1 多对一/一对一

    <!--多对一/一对一嵌套查询-->
    <resultMap id="map3" type="com.wyc.model.Person">
        <id column="p_id" property="pId"/>
        <result column="p_name" property="pName"/>
        <result column="p_aid" property="pAid"/>
        <!--<association property="address" column="p_aid" 中的p_aid 为Person中要去Address中查询的条件-->
        <association property="address" column="p_aid" javaType="com.wyc.model.Address" select="com.wyc.mapper.MybatisTeacherMapper.findAddressById">
            <id column="a_id" property="aId"/>
            <result column="a_name" property="aName"/>
        </association>
    </resultMap>

    <select id="findAllPersonQianTao" resultMap="map3">
        select * from person
    </select>

    <select id="findAddressById" resultType="com.wyc.model.Address">
          select a_id as aId, a_name as aName from address where a_id = #{aId}
    </select>

dao

    List<Person> findAllPersonQianTao();

    Address findAddressById(int aId);

4.2 一对多

    <!--一对多嵌套查询-->
    <resultMap id="map4" type="com.wyc.model.Address">
        <id column="a_id" property="aId"/>
        <result column="a_name" property="aName"/>
        <collection property="personList" column="a_id" select="com.wyc.mapper.MybatisTeacherMapper.findPersonByAId" ofType="com.wyc.model.Person">
        </collection>
    </resultMap>

    <select id="findAllAddressQianTao" resultMap="map4">
        select * from address
    </select>

    <select id="findPersonByAId" resultType="com.wyc.model.Person">
          select p_id as pId, p_name as pName, p_aid as pAid from person where p_aid = #{aId}
    </select>

dao

    List<Address> findAllAddressQianTao();

    List<Person> findPersonByAId(int aId);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis是一个开源的持久层框架,它可以帮助我们简化数据库操作。在MyBatis嵌套查询可以通过使用association和collection标签来实现左连接。 首先,我们需要在主查询定义一个association标签或collection标签,用于指定要进行嵌套查询的关联关系。association标签用于一对一的关联关系,而collection标签用于一对多的关联关系。 接下来,在association或collection标签,我们可以使用select属性来指定要执行的嵌套查询语句。这个嵌套查询语句可以是一个独立的SQL语句,也可以是一个已经定义好的resultMap。 最后,在主查询的结果映射,我们可以使用resultMap标签来引用嵌套查询的结果。这样,在执行主查询时,MyBatis会自动执行嵌套查询,并将结果映射到主查询的结果对象。 下面是一个示例: ```xml <!-- 定义主查询的resultMap --> <resultMap id="userResultMap" type="User"> <id property="id" column="id" /> <result property="name" column="name" /> <!-- 定义嵌套查询 --> <association property="department" javaType="Department"> <id property="id" column="dept_id" /> <result property="name" column="dept_name" /> <!-- 执行嵌套查询 --> <select property="employees" resultMap="employeeResultMap"> SELECT * FROM employee WHERE dept_id = #{id} </select> </association> </resultMap> <!-- 定义嵌套查询的resultMap --> <resultMap id="employeeResultMap" type="Employee"> <id property="id" column="emp_id" /> <result property="name" column="emp_name" /> </resultMap> <!-- 执行主查询 --> <select id="getUser" resultMap="userResultMap"> SELECT * FROM user </select> ``` 在上面的示例,我们定义了一个主查询getUser,它会查询user表的数据,并执行嵌套查询来获取每个用户所在的部门和部门下的员工信息。通过使用association标签和select属性,我们实现了左连接嵌套查询

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值