0


Mybatis中如何实现一对一,一对多的关联查询?

MyBatis实现一对一、一对多关联查询一般有两种方式:

方式一:sqlMapper配置文件

一对一:在resultMap标签中使用 association 标签

一对多:在resultMap 标签中使用collection 标签

方式二:注解

一对一:在@Results 注解中的@Result注解中使用@One注解

一对多:在@Results 注解中的@Result 注解中使用@Many注解

接下来,我们一起来看看这两种方式分别是怎么用代码实现的?

这里需要用到学生student和班级class两张表,如下图所示:

一、一对一查询(sqlMapper配置文件)

1. 需求

一个学生相对应一个专属班级,所以学生****Student班级****Banji是一对一的关系;

查询需求:查询一个学生,与此同时查询出该学生所属的班级信息(用sqlMapper的方式)

2. 创建Student和Banji实体类

Student.java

  1. public class Student {
  2. private int sid;
  3. private String sname;
  4. private Date birthday;
  5. private String ssex;
  6. private int classid;
  7. // 外部属性
  8. private Banji bj;
  9. // 省略无参、有参、get、set、toString方法
  10. }

**Banji.java **

  1. public class Banji {
  2. private int classid;
  3. private String classname;
  4. // 省略无参、有参、get、set、toString方法
  5. }

3. 创建StudentMapper接口

  1. public interface StudentMapper {
  2. //定义方法
  3. public List<Student> findAllStudent();
  4. }

4. 配置 StudentMapper.xml

**PS:**查询的返回值类型使用的resultMap,和上面resultMap标签中的id名必须保持一致

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.ape.mapper.StudentMapper">
  6. <!-- 手动映射
  7. column:数据表的字段名
  8. property:java中实体类的属性
  9. -->
  10. <resultMap type="Student" id="Student_Class_Map">
  11. <result column="sid" property="sid"/>
  12. <result column="sname" property="sname"/>
  13. <result column="birthday" property="birthday"/>
  14. <result column="ssex" property="ssex"/>
  15. <result column="classid" property="classid"/>
  16. <association property="bj">
  17. <result column="classid" property="classid"/>
  18. <result column="classname" property="classname"/>
  19. </association>
  20. </resultMap>
  21. <!--一对一查询-->
  22. <select id="findAllStudent" resultMap="Student_Class_Map">
  23. select * from student
  24. inner join class on student.classid=class.classid
  25. </select>
  26. </mapper>

5. 测试 Test

  1. public class Test01 {
  2. public static void main(String[] args) {
  3. SqlSession sqlSession = DaoUtil.getSqlSession();
  4. StudentMapper sm = sqlSession.getMapper(StudentMapper.class);
  5. //一对一查询
  6. List<Student> slist = sm.findAllStudent();
  7. for (Student s:slist) {
  8. System.out.println(s);
  9. }
  10. //释放资源
  11. DaoUtil.closeSource(sqlSession);
  12. }

输出结果为:

二、一对一查询(注解)

1. 需求

一个学生相对应一个专属班级,所以学生****Student班级****Banji是一对一的关系;

查询需求:查询一个学生,与此同时查询出该学生所属的班级信息(用注解的方式)

2. 创建Student和Banji实体类

Student.java

  1. public class Student {
  2. private int sid;
  3. private String sname;
  4. private Date birthday;
  5. private String ssex;
  6. private int classid;
  7. // 外部属性
  8. private Banji bj;
  9. // 省略无参、有参、get、set、toString方法
  10. }

**Banji.java **

  1. public class Banji {
  2. private int classid;
  3. private String classname;
  4. // 省略无参、有参、get、set、toString方法
  5. }

3. 创建StudentMapper接口

  1. public interface StudentMapper {
  2. //学生对班级一对一,做映射
  3. @Results({
  4. @Result(column = "classid",property = "classid"),
  5. @Result(column = "classid",property = "bj",
  6. one=@One(select ="com.ape.mapper.BanjiMapper.findBanjiByClassid" ))
  7. })
  8. @Select("select * from student")
  9. public List<Student> findAllStudent();
  10. }

4. 创建BanjiMapper接口

  1. public interface BanjiMapper {
  2. //学生对班级,找班级对象
  3. @Select("select * from class where classid=#{v}")
  4. public Banji findBanjiByClassid(int classid);
  5. }

5. 测试 Test

  1. public class Test01 {
  2. public static void main(String[] args) {
  3. SqlSession sqlSession = DaoUtil.getSqlSession();
  4. StudentMapper sm = sqlSession.getMapper(StudentMapper.class);
  5. List<Student> slist = sm.findAllStudent();
  6. for(Student s:slist) {
  7. System.out.println(s);
  8. }
  9. DaoUtil.closeSource(sqlSession);
  10. }
  11. }

输出结果为:

三、一对多查询(sqlMapper配置文件)

1. 需求

一个班级对应多个学生,所以班级****Banji学生****Student是一对多的关系;

查询需求:查询一个班级,与此同时查询出该班级所有的学生信息(用sqlMapper的方式)

2. 创建Banji和Student实体类

**Banji.java **

  1. public class Banji {
  2. private int classid;
  3. private String classname;
  4. //外部属性
  5. private List<Student> slist;
  6. // 省略无参、有参、get、set、toString方法
  7. }

Student.java

  1. public class Student {
  2. private int sid;
  3. private String sname;
  4. private Date birthday;
  5. private String ssex;
  6. private int classid;
  7. // 省略无参、有参、get、set、toString方法
  8. }

3. 创建BanjiMapper接口

  1. public interface BanjiMapper {
  2. //班级对学生,一对多
  3. public List<Banji> findAllBanji();
  4. }

4. 配置BanjiMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.ape.mapper.BanjiMapper">
  6. <resultMap type="Banji" id="Class_Student_Map">
  7. <result column="classid" property="classid"/>
  8. <result column="classname" property="classname"/>
  9. <collection property="slist" ofType="Student">
  10. <result column="sid" property="sid"/>
  11. <result column="sname" property="sname"/>
  12. <result column="birthday" property="birthday"/>
  13. <result column="ssex" property="ssex"/>
  14. <result column="classid" property="classid"/>
  15. </collection>
  16. </resultMap>
  17. <select id="findAllBanji" resultMap="Class_Student_Map">
  18. select * from class
  19. left join student on class.classid=student.classid
  20. order by class.classid
  21. </select>
  22. </mapper>

5. 测试 Test

  1. public class Test01 {
  2. public static void main(String[] args) {
  3. SqlSession sqlSession = DaoUtil.getSqlSession();
  4. BanjiMapper bm = sqlSession.getMapper(BanjiMapper.class);
  5. List<Banji> blist = bm.findAllBanji();
  6. for (Banji b:blist) {
  7. System.out.println("班级编号"+b.getClassid()+","+"班级名称"+b.getClassname());
  8. for(Student s:b.getSlist()) {
  9. System.out.println(s);
  10. }
  11. System.out.println("====================================");
  12. }
  13. //释放资源
  14. DaoUtil.closeSource(sqlSession);
  15. }
  16. }

输出结果为:

四、一对多查询(注解)

1. 需求

一个班级对应多个学生,所以班级****Banji学生****Student是一对多的关系;

查询需求:查询一个班级,与此同时查询出该班级所有的学生信息(用注解的方式)

2. 创建Banji和Student实体类

**Banji.java **

  1. public class Banji {
  2. private int classid;
  3. private String classname;
  4. //外部属性
  5. private List<Student> slist;
  6. // 省略无参、有参、get、set、toString方法
  7. }

Student.java

  1. public class Student {
  2. private int sid;
  3. private String sname;
  4. private Date birthday;
  5. private String ssex;
  6. private int classid;
  7. // 省略无参、有参、get、set、toString方法
  8. }

3. 创建BanjiMapper接口

  1. public interface BanjiMapper {
  2. //班级对学生一对多,做映射
  3. @Results({
  4. @Result(column = "classid",property = "classid"),
  5. @Result(column = "classid",property = "slist",
  6. many=@Many(select="com.ape.mapper.StudentMapper.findStudentByClassid"))
  7. })
  8. @Select("select * from class")
  9. public List<Banji> findAllBanji();
  10. }

4. 创建StudentMapper接口

  1. public interface StudentMapper {
  2. //班级对学生一对多,找学生对象
  3. @Select("select * from student where classid=#{v}")
  4. public Student findStudentByClassid(int classid);
  5. }

5. 测试 Test

  1. public class Test01 {
  2. public static void main(String[] args) {
  3. SqlSession sqlSession = DaoUtil.getSqlSession();
  4. BanjiMapper bm = sqlSession.getMapper(BanjiMapper.class);
  5. List<Banji> blist = bm.findAllBanji();
  6. for (Banji b:blist) {
  7. System.out.println("班级编号"+b.getClassid()+","+"班级名称"+b.getClassname());
  8. for(Student s:b.getSlist()) {
  9. System.out.println(s);
  10. }
  11. System.out.println("====================================");
  12. }
  13. //释放资源
  14. DaoUtil.closeSource(sqlSession);
  15. }
  16. }

输出结果为:

其实,日常这样的例子也不少:

一对一:

一个人对应一张身份证

一张身份证对应一个人

一个课程对应一个老师

一个员工对应一个部门

……

一对多:

一个用户可以有多个订单

一个用户可以有账户

一个学生可以学多个课程

一个球队有多个球员

……

以上就是Mybatis的多表关联查询(一对一、一对多)的全部内容。

看完如果对你有帮助,点赞支持一下呀!


本文转载自: https://blog.csdn.net/m0_67942533/article/details/125382052
版权归原作者 崇令 所有, 如有侵权,请联系我们删除。

“Mybatis中如何实现一对一,一对多的关联查询?”的评论:

还没有评论