首页 > 其他 > 详细

8 Mybatis - 接口代理实现dao + 注解 开发 - 多表(案例)

时间:2020-11-28 09:25:38      阅读:35      评论:0      收藏:0      [点我收藏+]

MyBatis - 接口代理实现dao + 注解 开发

多表CRUD - 一对一

技术分享图片

技术分享图片

  • 一个人一个身份证
  • Card身份证类:id、number、Person p
  • Person类:id、name、age
// 2 根据card表id字段的值,去查询person表
public interface PersonMapper {
    //根据id查询
    @Select("SELECT * FROM person WHERE id=#{id}")
    public abstract Person selectById(Integer id);
}

// 1 查询所有card身份证
public interface CardMapper {
    //查询全部
    @Select("SELECT * FROM card")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "number",property = "number"),
            @Result(
                    property = "p",             // 被包含对象的变量名
                    javaType = Person.class,    // 被包含对象的实际数据类型
                    column = "pid",             // 根据查询出的card表中的pid字段来查询person表
                    // one、@One 一对一固定写法
                    // select属性:指定调用哪个接口中的哪个方法
                    one = @One(select = "com.itheima.one_to_one.PersonMapper.selectById")
            )
    })
    public abstract List<Card> selectAll();
}

// 3 测试类
public class Test {
    @Test
    public void selectAll() throws Exception{
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        CardMapper mapper = sqlSession.getMapper(CardMapper.class);
        List<Card> list = mapper.selectAll();
        for (Card card : list) {
            System.out.println(card);
        }
        sqlSession.close();
        is.close();
    }
}

多表CRUD - 一对多

技术分享图片

技术分享图片

  • 一个班级多个学生
  • Classes班级类:id、班级名称name、所有学生List students
  • Student类:id、name、age、List courses
// 2 根据Classes表cis字段值,查询student表
public interface StudentMapper {
    @Select("SELECT * FROM student WHERE cid=#{cid}")
    public abstract List<Student> selectByCid(Integer cid);
}
// 1 查询Classes班级表所有数据
public interface ClassesMapper {
    @Select("SELECT * FROM classes")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(
                    property = "students",  // 被包含对象的变量名
                    javaType = List.class,  // 被包含对象的实际数据类型
                    column = "id",          // 根据查询出的classes表的id字段来查询student表
                    // many、@Many 一对多查询的固定写法
                    // select属性:指定调用哪个接口中的哪个查询方法
                    many = @Many(select = "com.itheima.one_to_many.StudentMapper.selectByCid")
            )
    })
    public abstract List<Classes> selectAll();
}
// 3 测试类
public class Test {
    @Test
    public void selectAll() throws Exception{
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        ClassesMapper mapper = sqlSession.getMapper(ClassesMapper.class);
        List<Classes> list = mapper.selectAll();
        for (Classes cls : list) {
            System.out.println(cls.getId() + "," + cls.getName());
            List<Student> students = cls.getStudents();
            for (Student student : students) {
                System.out.println("\t" + student);
            }
        }
        sqlSession.close();
        is.close();
    }
}

多表CRUD - 多对多

技术分享图片技术分享图片

  • 一个学生选门个课程 一门课程有多个学生
  • Student类:id、name、age、学生所选课程List courses
  • Course课程类:id、课程名称name
  • 要求:查询显示有课程的学生 选了哪些课程
// 2 根据学生id查询所选课程
public interface CourseMapper {
    @Select("SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid=c.id AND sc.sid=#{id}")
    public abstract List<Course> selectBySid(Integer id);
}

// 1 查询所有学生信息
public interface StudentMapper {
    @Select("SELECT DISTINCT s.id,s.name,s.age FROM student s,stu_cr sc WHERE sc.sid=s.id")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(column = "age",property = "age"),
            @Result(
                    property = "courses",   // 被包含对象的变量名
                    javaType = List.class,  // 被包含对象的实际数据类型
                    column = "id",          // 根据查询出student表的id来作为关联条件,去查询中间表和课程表
                    // many、@Many 一对多查询的固定写法
                    // select属性:指定调用哪个接口中的哪个查询方法
                    many = @Many(select = "com.itheima.many_to_many.CourseMapper.selectBySid")
            )
    })
    public abstract List<Student> selectAll();
}
// 3 测试类
public class Test {
    @Test
    public void selectAll() throws Exception{
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> list = mapper.selectAll();
        for (Student student : list) {
            System.out.println(student.getId() + "," + student.getName() + "," + student.getAge());
            List<Course> courses = student.getCourses();
            for (Course cours : courses) {
                System.out.println("\t" + cours);
            }
        }
        sqlSession.close();
        is.close();
    }
}

8 Mybatis - 接口代理实现dao + 注解 开发 - 多表(案例)

原文:https://www.cnblogs.com/60kmph/p/14051526.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!