MyBatis(4)(多表关联映射)

本文介绍了MyBatis中处理一对一、一对多及多对多关联关系的方法,包括<association>、<collection>元素的使用。详细讲解了各个关联关系的数据库设计,并提供了相应的测试步骤。
摘要由CSDN通过智能技术生成

版本:idea2020.1.1    jdk1.8   maven3.6.3

注:本文章摘自Java EE企业级应用开发教程,黑马程序员/编著,仅用于记录学习笔记,分享学习经历。

一对一:在任意一方引入对方主键作为外键

一对多:在的一方,添加的一方的主键作为外键

多对多:产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键

<association><collection>元素常用属性
属性 说明
property 指定映射到的实体类对象属性,与表字段一一对应
column 指定表中对应的字段
javaType 指定映射到实体对象属性的类型
select 指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询
fetchType 指定在关联查询时是否启用延迟加载。此属性具有lazy和eager两个属性值,默认值为lazy(默认关联映射延迟加载)
ofType 与javaType对应(collection元素专有)

一、一对一关联关系<association>

在<resultMap>元素中,包含了一个<association>子元素,MyBatis通过此元素处理一对一关联关系。

        <!--一对一,嵌套查询-->
        <!--通过执行另一条SQL语句来返回预期的复杂类型-->
        <association property="card" column="card_id" javaType="com.jc.pojo.Card" select="com.jc.pojo.Card.findCardById"/>
        <!--一对一,嵌套结果-->
        <!--使用嵌套结果映射来处理重复的联合结果的子集-->
        <association property="card" javaType="com.jc.pojo.Card">
            <id property="id" column="card_id"/>
            <result property="code" column="code"/>
        </association>

新建表  ——>  新建po类(2个)  ——>  新建IdCardMapper.xml和PersonMapper.xml  ——>  mybatis-config.xml关联Mapper.xml  ——>测试


CREATE TABLE IF NOT EXISTS `idcard` (
  `id` int(10) NOT NULL auto_increment,
  `code` varchar(50) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


INSERT INTO `idcard` (`id`, `code`) VALUES
	(1, '152221198711020624'),
	(2, '152201199008150317');

CREATE TABLE IF NOT EXISTS `person` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL default '0',
  `age` int(11) NOT NULL default '0',
  `sex` varchar(50) NOT NULL default '0',
  `idcardid` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `idcardid` (`idcardid`),
  CONSTRAINT `idcardid` FOREIGN KEY (`idcardid`) REFERENCES `idcard` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO `person` (`id`, `name`, `age`, `sex`, `idcardid`) VALUES
	(1, 'Rose', 29, '女', 1),
	(2, 'Tom', 27, '男', 2);
public class IdCard {
    private Integer id;
    private String code;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Override
    public String toString() {
        return "IdCard{" +
                "id=" + id +
                ", code='" + code + '\'' +
                '}';
    }
}
public class Person {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private IdCard card;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

   
Mybatis是一款优秀的ORM框架,支持一对一、一对多、多对一、多对多等关联映射。其中,一对多关联映射是指一个实体类中包含多个另一个实体类的对象。下面是一对多关联映射的实现方法: 1.在主实体类中定义一个包含从实体类对象的List集合属性。 2.在主实体类对应的Mapper.xml文件中,使用<collection>标签来映射从实体类对象的List集合属性。 3.在从实体类对应的Mapper.xml文件中,使用<association>标签来映射主实体类对象。 具体实现可以参考以下代码: 主实体类User: ``` public class User { private Integer id; private String username; private List<Order> orders; //getter和setter方法 } ``` 从实体类Order: ``` public class Order { private Integer id; private String orderNo; private User user; //getter和setter方法 } ``` 主实体类User对应的Mapper.xml文件: ``` <mapper namespace="com.biem.mapper.UsersMapper"> <resultMap id="userMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <collection property="orders" ofType="Order"> <id property="id" column="order_id"/> <result property="orderNo" column="order_no"/> </collection> </resultMap> <select id="getUserById" resultMap="userMap"> select * from user where id=#{id} </select> </mapper> ``` 从实体类Order对应的Mapper.xml文件: ``` <mapper namespace="com.biem.mapper.OrdersMapper"> <resultMap id="orderMap" type="Order"> <id property="id" column="id"/> <result property="orderNo" column="order_no"/> <association property="user" javaType="User"> <id property="id" column="user_id"/> <result property="username" column="username"/> </association> </resultMap> <select id="getOrderById" resultMap="orderMap"> select * from order where id=#{id} </select> </mapper> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值