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

方式一:sqlMapper配置文件

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

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

方式二:注解

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

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

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

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

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

1. 需求

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

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

2. 创建Student和Banji实体类

Student.java

public class Student {private int sid;private String sname;private Date birthday;private String ssex;private int classid;// 外部属性private Banji bj;// 省略无参、有参、get、set、toString方法}

Banji.java

public class Banji {private int classid;private String classname;//省略无参、有参、get、set、toString方法}

3. 创建StudentMapper接口

public interface StudentMapper {//定义方法public List findAllStudent();}

4. 配置StudentMapper.xml

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

 select * from student inner join class on student.classid=class.classid

5. 测试 Test

public class Test01 {public static void main(String[] args) {SqlSession sqlSession = DaoUtil.getSqlSession();StudentMapper sm = sqlSession.getMapper(StudentMapper.class);//一对一查询List slist = sm.findAllStudent();for (Student s:slist) {System.out.println(s);}//释放资源DaoUtil.closeSource(sqlSession);}

输出结果为:

二、一对一查询(注解

1. 需求

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

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

2. 创建Student和Banji实体类

Student.java

public class Student {private int sid;private String sname;private Date birthday;private String ssex;private int classid;// 外部属性private Banji bj;// 省略无参、有参、get、set、toString方法}

Banji.java

public class Banji {private int classid;private String classname;//省略无参、有参、get、set、toString方法}

3. 创建StudentMapper接口

public interface StudentMapper {//学生对班级一对一,做映射@Results({@Result(column = "classid",property = "classid"),@Result(column = "classid",property = "bj",one=@One(select ="com.ape.mapper.BanjiMapper.findBanjiByClassid" ))})@Select("select * from student")public List findAllStudent();}

4. 创建BanjiMapper接口

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

5. 测试 Test

public class Test01 {public static void main(String[] args) {SqlSession sqlSession = DaoUtil.getSqlSession();StudentMapper sm = sqlSession.getMapper(StudentMapper.class);List slist = sm.findAllStudent();for(Student s:slist) {System.out.println(s);}DaoUtil.closeSource(sqlSession);}}

输出结果为:

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

1. 需求

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

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

2. 创建Banji和Student实体类

Banji.java

public class Banji {private int classid;private String classname;//外部属性private List slist;//省略无参、有参、get、set、toString方法}

Student.java

public class Student {private int sid;private String sname;private Date birthday;private String ssex;private int classid;// 省略无参、有参、get、set、toString方法}

3. 创建BanjiMapper接口

public interface BanjiMapper {//班级对学生,一对多public List findAllBanji();}

4. 配置BanjiMapper.xml

 select * from classleft join student on class.classid=student.classidorder by class.classid

5. 测试 Test

public class Test01 {public static void main(String[] args) {SqlSession sqlSession = DaoUtil.getSqlSession();BanjiMapper bm = sqlSession.getMapper(BanjiMapper.class);List blist = bm.findAllBanji();for (Banji b:blist) {System.out.println("班级编号"+b.getClassid()+","+"班级名称"+b.getClassname());for(Student s:b.getSlist()) {System.out.println(s);}System.out.println("====================================");}//释放资源DaoUtil.closeSource(sqlSession);}}

输出结果为:

四、一对多查询(注解

1. 需求

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

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

2. 创建Banji和Student实体类

Banji.java

public class Banji {private int classid;private String classname;//外部属性private List slist;//省略无参、有参、get、set、toString方法}

Student.java

public class Student {private int sid;private String sname;private Date birthday;private String ssex;private int classid;// 省略无参、有参、get、set、toString方法}

3. 创建BanjiMapper接口

public interface BanjiMapper {//班级对学生一对多,做映射@Results({@Result(column = "classid",property = "classid"),@Result(column = "classid",property = "slist",many=@Many(select="com.ape.mapper.StudentMapper.findStudentByClassid"))})@Select("select * from class")public List findAllBanji();}

4. 创建StudentMapper接口

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

5. 测试 Test

public class Test01 {public static void main(String[] args) {SqlSession sqlSession = DaoUtil.getSqlSession();BanjiMapper bm = sqlSession.getMapper(BanjiMapper.class);List blist = bm.findAllBanji();for (Banji b:blist) {System.out.println("班级编号"+b.getClassid()+","+"班级名称"+b.getClassname());for(Student s:b.getSlist()) {System.out.println(s);}System.out.println("====================================");}//释放资源DaoUtil.closeSource(sqlSession);}}

输出结果为:

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

一对一:

一个人对应一张身份证

一张身份证对应一个人

一个课程对应一个老师

一个员工对应一个部门

……

一对多:

一个用户可以有多个订单

一个用户可以有账户

一个学生可以学多个课程

一个球队有多个球员

……

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

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