资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: 计算机考试归档 最新发布

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

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 class		left join student on class.classid=student.classid		order 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的多表关联查询(一对一、一对多)的全部内容。

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

 

 

转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/1098450.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【Mybatis中如何实现一对一,一对多的关联查询?】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2