mybatis级联之一对多的关系

一对多的级联
mybatis一对多的级联,这里举例班级和学生的例子,一个班级有多个学生,属于一对多的关系,一个学生只属于一个班级,属于多对一的关系。
建立数据库文件

CREATE TABLE f_class(
c_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 's_id',
CODE VARCHAR(20) NOT NULL COMMENT '编号',
NAME VARCHAR(20) NOT NULL COMMENT '名称'
);
INSERT INTO f_class(CODE,NAME) VALUES ('1401','Software Engineering');

CREATE TABLE f_student(
s_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 's_id',
s_NAME VARCHAR(20) NOT NULL COMMENT '名字',
sex VARCHAR(20) NOT NULL COMMENT '性别',
age INT NOT NULL COMMENT '年龄',
class_id INT,
FOREIGN KEY (class_id) REFERENCES f_class(id)
);
INSERT INTO f_student (s_NAME,sex,age,class_id) VALUES ('lazy','boy',20,1);
INSERT INTO f_student (s_NAME,sex,age,class_id) VALUES ('rose','girl',19,1);
INSERT INTO f_student (s_NAME,sex,age,class_id) VALUES ('joh','boy',19,1);
INSERT INTO f_student (s_NAME,sex,age,class_id) VALUES ('miss','girl',20,1);

建立POJO对象,都省略类 set和get方法。
Grade.java

public class Grade implements Serializable{
    private Integer c_id;
    private String code;
    private String name;
    //班级和学生一对多的关系,一个班级可以有多个学生
    private List<Student> students;
  } 

Student.java

public class Student implements Serializable {
    private Integer s_id;
    private String s_name;
    private String sex;
    private Integer age;
}

映射文件GradeMapper.xml

<mapper namespace="com.stumybatis.dao.GradeDao">
    <select id="selectGradeById" parameterType="int" resultMap="gradeStudent">
        SELECT * from f_class c,f_student s  where c.c_id=#{c_id} and s.class_id=c.c_id
    </select>
    <resultMap id="gradeStudent" type="com.stumybatis.pojo.Grade">
        <id property="c_id" column="c_id"/>
        <result property="code" column="code"/>
        <result property="name" column="name"/>
        <!--collection表示一对多的关系-->
        <collection property="students" ofType="com.stumybatis.pojo.Student" >
            <id property="s_id" column="s_id"/>
            <result property="s_name" column="s_name"/>
            <result property="sex" column="sex"/>
            <result property="age" column="age"/>
        </collection>
    </resultMap>
</mapper>

GradeDao接口的内容

public interface GradeDao {

    public Grade selectGradeById(Integer c_id);
}

测试代码

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-mybatis.xml"})
public class StudentDaoTest {

    @Autowired
    private GradeDao gradeDao;

    @Test
    public void testSelecGrade2() throws Exception{
        Grade grade = gradeDao.selectGradeById(1);
        System.out.println(grade.getC_id()+ " "+grade.getCode()+" "+grade.getName());
        List<Student> list = grade.getStudents();
        for(Student student:list){
            System.out.println(student);
        }
    }

结果如下:
这里写图片描述
但是有一个特别好玩的就是,如果这两个地方的name不区分的话,那就会有很有意思的结果,就是所有的s_name都写成name,会出现下图的结果。把学生的name全都变成了软件工程。很神奇有没有。
这里写图片描述

这里的环境是搭建好的SSM环境测试的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis提供了一种简便的方式来实现一对多的级查询。在这种情况下,一个实体类中包含了多个子实体类的集合,这些子实体类与该实体类是一对多的关系。 下面是一对多的级查询的示例: 1. 首先,我们创建以下两个实体类: Order.java ```java public class Order { private int id; private String code; private List<OrderItem> items; // 省略getter和setter方法 } ``` OrderItem.java ```java public class OrderItem { private int id; private int orderId; private String product; private int quantity; // 省略getter和setter方法 } ``` 2. 接下来,我们需要创建一个映射文件来进行一对多的级查询。在这个映射文件中,我们需要使用`<collection>`标签来定义一个集合属性,用来存储子实体类的列表。 OrderMapper.xml ```xml <mapper namespace="com.example.OrderMapper"> <resultMap id="orderMap" type="com.example.Order"> <id property="id" column="id"/> <result property="code" column="code"/> <collection property="items" ofType="com.example.OrderItem"> <id property="id" column="item_id"/> <result property="product" column="product"/> <result property="quantity" column="quantity"/> </collection> </resultMap> <select id="getOrders" resultMap="orderMap"> SELECT o.id, o.code, i.id as item_id, i.product, i.quantity FROM orders o LEFT JOIN order_items i ON o.id = i.order_id ORDER BY o.id </select> </mapper> ``` 在这个映射文件中,我们使用了`<resultMap>`标签来定义一个结果集映射,它包含了一个`<collection>`标签来定义子实体类的集合属性。在查询语句中,我们使用了`LEFT JOIN`来将订单和订单项关起来,并使用`ORDER BY`子句来按订单ID排序。 3. 最后,我们需要创建一个接口来调用映射文件中的查询方法。 OrderMapper.java ```java public interface OrderMapper { List<Order> getOrders(); } ``` 现在,我们可以使用这个接口来查询订单和订单项的信息,如下所示: ```java SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); SqlSession sqlSession = factory.openSession(); OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); List<Order> orders = orderMapper.getOrders(); for (Order order : orders) { System.out.println(order.getCode()); for (OrderItem item : order.getItems()) { System.out.println("\t" + item.getProduct() + " x" + item.getQuantity()); } } ``` 这个示例中,我们首先创建了一个`SqlSessionFactory`对象,然后使用它来创建一个`SqlSession`对象。接下来,我们使用`getMapper()`方法来获取一个`OrderMapper`接口的实现类。最后,我们调用查询方法来获取订单和订单项的信息,并遍历结果集来输出这些信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值