Mybatis,一对一,一对多,多对多。(&MYSQL)

这篇博客介绍了在Mybatis中处理一对一、一对多和多对多关联映射的方法。通过association和collection标签,演示了如何进行学生与班级的一对一、用户与订单的一对多关系映射,并简述了多对多关系的处理。内容包括建表、实体类定义、映射文件配置和Mapper接口实现。
摘要由CSDN通过智能技术生成

Mybatis,一对一,一对多,多对多

mybatis我们经常要处理一些表与表之间的sql编写,处理一对一,一对多,以及多对多关系的查询语句,针对这些关联关系,我们用的最多的就是association标签和collection标签。

一对一关联映射(association)

  • 场景

一个学生属于一个班级的一员(一对一),一个班级由多名学生组成(一对多)

一对一关系,从学生角度:学生对班级一对一

  • 建表
CREATE TABLE `clazz` (
  `clazz_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '班级主键',
  `clazz_name` varchar(10) DEFAULT NULL COMMENT '班级名称',
  PRIMARY KEY (`clazz_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

/*Data for the table `clazz` */

insert  into `clazz`(`clazz_id`,`clazz_name`) values 
(1,'零一班'),
(2,'零二班');
CREATE TABLE `student` (
  `student_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '学生主键',
  `student_name` varchar(10) DEFAULT NULL COMMENT '学生名字',
  `student_clazz_id` int(5) DEFAULT NULL COMMENT '班级外键',
  PRIMARY KEY (`student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

/*Data for the table `student` */

insert  into `student`(`student_id`,`student_name`,`student_clazz_id`) values 
(1,'张晓明',1),
(2,'沙玉子',1),
(3,'王有为',2),
(4,'华小明',2);
  • 实体类
/**
 *学生实体类
 * */
public class Student {
    private Integer studentId;//学生id
    private String studentName;//学生名字
    private Integer studentClazzId;//班级外键
    //班级信息
    private Clazz clazz;
}
/**
 * 班级实体类
 * */
public class Clazz {
    private Integer clazzId;//班级主键
    private String clazzName;//班级名称
}
  • 映射文件
	<select id="findStudentClazzMap" resultMap="StudenClazzMap">
        select * from clazz,student where student.student_id=clazz.clazz_id;
    </select>
    <!--
        association标签(一对一):
                        property="在Student类里面clazz的属性"
                        javaType="被映射实体类"
                        id="数据库字段名"
                        property="实体类字段名"
        注意:association标签里面被映射实体类用javaType
        	javaType!	javaType!	javaType!
      -->
    <resultMap id="StudenClazzMap" type="com.newture.entity.Student">
        <id column="student_id" property="studentId"></id>
        <result column="student_name" property="studentName"></result>
        <result column="student_clazz_id" property="studentClazzId"></result>
        <association property="clazz" javaType="com.newture.entity.Clazz">
            <id column="clazz_id" property="clazzId"></id>
            <result column="clazz_name" property="clazzName"></result>
        </association>
    </resultMap>
  • Mapper接口
@Mapper
public interface StudentsMapper {
    public List<Student> findStudentClazzMap();
}
  • 结果
[Student{studentId=1, studentName='张晓明', studentClazzId=1, clazz=Clazz{clazzId=1, clazzName='零一班'}}, 
Student{studentId=2, studentName='沙玉子', studentClazzId=1, clazz=Clazz{clazzId=2, clazzName='零二班'}}]
//从结果能看出
//学生——张晓明——零一班
//学生——沙玉子——零二班

一对多关联映射(collection)

  • 场景

一个用户能创建多个订单(一对多)

一对多关系,从用户角度:用户对订单一对多

  • 建表
CREATE TABLE `user` (
  `user_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '用户主键',
  `user_name` varchar(10) DEFAULT NULL COMMENT '用户名称',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

/*Data for the table `user` */

insert  into `user`(`user_id`,`user_name`) values 
(1,'王延发'),
(2,'萧焕明');
CREATE TABLE `orders` (
  `order_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '订单主键',
  `order_number` varchar(10) DEFAULT NULL COMMENT '订单号',
  `user_id` int(5) DEFAULT NULL COMMENT '用户主键',
  PRIMARY KEY (`order_id`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

/*Data for the table `orders` */

insert  into `orders`(`order_id`,`order_number`,`user_id`) values 
(1,'订单0001',1),
(2,'订单0002',1),
(3,'订单0003',2);

  • 实体类
/**
 * 订单实体类
 * */
public class Orders {
    private Integer orderId;
    private String orderNumber;
}
/**
 * 用户实体类
 * */
public class User {
    private Integer userId;//用户主键
    private String userName;//用户名字
    //订单信息
    private List<Orders> ordersList;
}
  • 映射文件
	<select id="findAllUser" resultMap="UserMap">
        select * from user,orders where user.user_id = orders.user_id
    </select>
    <!--
        collection标签:
                        property="在User里面Orders的集合名"
                        oftype="被映射实体类"
                        column="数据库字段名"
                        property="实体类属性名"
        注意:collection标签里面被映射实体类用oftype
        	oftype!	oftype!	oftype!
      -->
    <resultMap id="UserMap" type="com.newture.entity.User">
        <id column="user_id" property="userId"></id>
        <result column="user_name" property="userName"></result>
        <collection property="ordersList" ofType="com.newture.entity.Orders">
            <id column="order_id" property="orderId"></id>
            <result column="order_number" property="orderNumber"></result>
        </collection>
    </resultMap>
  • Mapper接口
@Mapper
public interface ClazzMapper {
    public List<Clazz> findClazzStudentMap();
}
  • 结果
[User{userId=1, userName='王延发', ordersList=[Order{orderId=1, orderNumber='订单0001'}, Order{orderId=2, orderNumber='订单0002'}]}, 
User{userId=2, userName='萧焕明', ordersList=[Order{orderId=3, orderNumber='订单0003'}]}]
//从结果能看出
//用户——王延发拥有2个订单
//用户——萧焕明只拥有1个订单

多对多关联映射

多对多映射我就不过多做实际操作了,我们一般遇的比较多的情况就是(一对多对多)映射关系如下(大概!大概!大概!):

	<resultMap>
        <collection>
            <collection>
            
        	</collection>
        </collection>
    </resultMap>
    <!-- collection标签是使用oftype -->
    <!-- association标签是使用javaType-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五光十色的_團

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值