• 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);
        }
    }
    
  • 相关阅读:
    instancetype
    字典转模型
    类前缀
    当你学不进去的时候 不妨看看大脑是怎么想的
    当你学不进去的时候 不妨看看大脑是怎么想的
    你属于开源性格测试六大分类中的哪一类呢
    你属于开源性格测试六大分类中的哪一类呢
    程序员会被淘汰吗?
    程序员会被淘汰吗?
    Java基础学习总结(49)——Excel导入导出工具类
  • 原文地址:https://www.cnblogs.com/greycdoer0/p/12968379.html
Copyright © 2020-2023  润新知