• MyBatis对象关联查询demo (一对多,多对一)


    两张表的建表SQL:

    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student`  (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `stuno` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学号',
      `stuname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名',
      `sex` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '性别',
      `classno` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '班级编号',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = MyISAM AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
    INSERT INTO `student` VALUES (1, '20181101', '梅长苏', '男', 'Class001');
    INSERT INTO `student` VALUES (2, '20181102', '萧景炎', '男', 'Class001');
    INSERT INTO `student` VALUES (3, '20181103', '宫羽', '女', 'Class001');
    INSERT INTO `student` VALUES (4, '20181104', '霓凰', '女', 'Class003');
    INSERT INTO `student` VALUES (5, '20181105', '瓜娃子', '男', 'Class003');
    SET FOREIGN_KEY_CHECKS = 1;
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    DROP TABLE IF EXISTS `classes`;
    CREATE TABLE `classes`  (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '班级id',
      `classno` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '班级编号',
      `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '班级名称',
      `major` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '专业',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = MyISAM AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
    INSERT INTO `classes` VALUES (1, 'Class001', '一班', '计算机');
    INSERT INTO `classes` VALUES (2, 'Class002', '二班', '计算机');
    INSERT INTO `classes` VALUES (3, 'Class003', '三班', '会计');
    INSERT INTO `classes` VALUES (4, 'Class004', '四班', '会计');
    SET FOREIGN_KEY_CHECKS = 1;
    

    classes表和student表是一对多的关系,外键是classno

    实体类:

    public class Student {
        private Integer id;
        private String stuno;
        private String stuname;
        private String sex;
        private String classno;
        private Classes classes; // 一个学生对应一个班级
        
        ......(get和set等方法)
    
    public class Classes {
        private Integer id;
        private String classno;
        private String name;
        private String major;
        private List<Student> students;  // 一个班级有多个学生
        ......(get和set等方法)
    

    student的Mapper文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="studentDetail">
        <select id="selectByClassno" parameterType="String"
                resultType="com.imooc.mybatis.entity.Student">
            select * from student where classno = #{value}
        </select>
    
        <resultMap id="sqlStudent" type="com.imooc.mybatis.entity.Student">
            <id column="id" property="id"/>
            <result column="classno" property="classno"/>
            <association property="classes" select="classes.selectByClassno" column="classno"/>
        </resultMap>
        <select id="selectManyToOne" parameterType="String" resultMap="sqlStudent">
            select * from student limit 0,5
        </select>
    </mapper>
    

    classes的Mapper文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="classes">
        <resultMap id="sqlClasses" type="com.imooc.mybatis.entity.Classes">
            <id column="classno" property="classno"/>
            <collection property="students" select="studentDetail.selectByClassno" column="classno"/>
        </resultMap>
        <select id="selectOneToMany" parameterType="String" resultMap="sqlClasses">
            select * from classes where name = #{value}
        </select>
    
        <select id="selectByClassno" parameterType="String" resultType="com.imooc.mybatis.entity.Classes">
            select * from classes where classno = #{value}
        </select>
    </mapper>
    

    别忘了再mybatis-config.xml中添加映射

    <mappers>
        <mapper resource="mappers/classes.xml"/>
        <mapper resource="mappers/student.xml"/>
    </mappers>
    

    一对多测试:

    @Test
    public void classOneToMany() throws Exception {
        SqlSession session = null;
        try {
            session = MyBatisUtils.openSession();
            List<Classes> list = session.selectList("classes.selectOneToMany", "一班");
            for(Classes classes:list) {
                List<Student> student = classes.getStudents();
                for(Student tmp:student){
                    System.out.println(tmp.getId() + ":" + tmp.getStuno() + ":" + tmp.getStuname() + ":" + tmp.getSex() + ":" + tmp.getClassno());
                }
            }
        } catch (Exception e) {
            throw e;
        } finally {
            MyBatisUtils.closeSession(session);
        }
    }
    

    多对一测试:

    @Test
    public void studentManyToOne() throws Exception {
        SqlSession session = null;
        try {
            session = MyBatisUtils.openSession();
            List<Student> list = session.selectList("studentDetail.selectManyToOne");
            for (int i = 0; i < list.size(); i++) {
                Student stu = list.get(i);
                Classes cla = stu.getClasses();
                System.out.println(cla.getId() + ":" + cla.getClassno() + ":" + cla.getName() + ":" + cla.getMajor());
            }
        } catch (Exception e) {
            throw e;
        } finally {
            MyBatisUtils.closeSession(session);
        }
    }
    
  • 相关阅读:
    Flex 布局
    前端跨域之jsonp
    vs code 自定义代码片段
    vue中使用axios进行http通信
    Table边框合并
    getElementsBy 系列方法相比querySelector系列的区别
    vue中watch简单使用
    png图标任意赋色
    pc端与移动端适配解决方案之rem
    Express post请求无法解析参数的原因
  • 原文地址:https://www.cnblogs.com/greycdoer0/p/12968379.html
Copyright © 2020-2023  润新知