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<Student> findAllStudent();	

}

4. 配置 StudentMapper.xml

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

<?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="com.ape.mapper.StudentMapper">
	<!-- 手动映射
		column:数据表的字段名
		property:java中实体类的属性
	-->
	<resultMap type="Student" id="Student_Class_Map">
		<result column="sid"  property="sid"/>
		<result column="sname"  property="sname"/>
		<result column="birthday"  property="birthday"/>
		<result column="ssex"  property="ssex"/>
		<result column="classid"  property="classid"/>
		<association property="bj">
			<result column="classid"  property="classid"/>
			<result column="classname"  property="classname"/>
		</association>		
	</resultMap>
	
	<!--一对一查询-->
	<select id="findAllStudent" resultMap="Student_Class_Map">
	 	select * from student
	 	inner join class on student.classid=class.classid
	</select>

</mapper>

5. 测试 Test

public class Test01 {
	public static void main(String[] args) {
	
		SqlSession sqlSession = DaoUtil.getSqlSession();
		StudentMapper sm = sqlSession.getMapper(StudentMapper.class);
		
		//一对一查询
		List<Student> 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<Student> 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<Student> 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<Student> 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<Banji> findAllBanji();

}

4. 配置BanjiMapper.xml

<?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="com.ape.mapper.BanjiMapper">

	<resultMap type="Banji" id="Class_Student_Map">
		<result column="classid"  property="classid"/>
		<result column="classname"  property="classname"/>
		<collection property="slist" ofType="Student">
			<result column="sid"  property="sid"/>
			<result column="sname"  property="sname"/>
			<result column="birthday"  property="birthday"/>
			<result column="ssex"  property="ssex"/>
			<result column="classid"  property="classid"/>
		</collection>
	</resultMap>

	<select id="findAllBanji" resultMap="Class_Student_Map">
		select * from class
		left join student on class.classid=student.classid
		order by class.classid
	</select>

</mapper>

5. 测试 Test

public class Test01 {
	public static void main(String[] args) {
	
		SqlSession sqlSession = DaoUtil.getSqlSession();
        BanjiMapper bm = sqlSession.getMapper(BanjiMapper.class);

		List<Banji> 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<Student> 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<Banji> 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<Banji> 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的多表关联查询(一对一、一对多)的全部内容。

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

 

 

  • 56
    点赞
  • 161
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
Mybatis可以通过使用嵌套查询以及resultMap来实现一对一关联查询。 假设有两张表:订单表(order)和用户表(user),一个用户可以有多个订单,但一个订单只属于一个用户,这就是一对一的关系。 首先,在Order实体类添加一个User对象,表示该订单所对应的用户。 ``` public class Order { private int id; private String orderNo; private int userId; private User user; // 省略getter和setter方法 } ``` 接下来,在OrderMapper.xml编写嵌套查询语句,在查询订单的同时查询该订单所对应的用户信息: ``` <select id="getOrderList" resultMap="orderMap"> select o.*, u.id as user_id, u.username as user_name, u.email as user_email from order o left join user u on o.user_id = u.id </select> <resultMap id="orderMap" type="Order"> <id property="id" column="id"/> <result property="orderNo" column="order_no"/> <result property="userId" column="user_id"/> <association property="user" javaType="User"> <id property="id" column="user_id"/> <result property="username" column="user_name"/> <result property="email" column="user_email"/> </association> </resultMap> ``` 在resultMap使用association标签表示一对一关联查询,其id标签表示User实体类的主键id,result标签表示User实体类的其他属性。 最后,在OrderMapper接口定义getOrderList方法,调用上述SQL语句即可查询出包含用户信息的订单列表: ``` public interface OrderMapper { List<Order> getOrderList(); } ``` 以上就是使用Mybatis进行一对一关联查询的方法,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值