为了账号安全,请及时绑定邮箱和手机立即绑定

MyBatis查询多表数据

标签:
Java MySQL

联合查询表中数据

1.一对一关系
在两个数据表中,我们想要查询出表2中某一条数据指向的表1中某一条数据,就需要使用到数据表之间的一对一关系。

在表1的实体类中我们这么定义

//此实体类作为一对多关系中的“一”
//并实现序列化接口
public class Person implements Serializable {

	private int id;
	private String name;
	private char sex;
	private List<Food> food;//将一对多关系中的“多”,用集合类型定义。

	public List<Food> getFood() {
		return food;
	}

	public void setFood(List<Food> food) {
		this.food = food;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

}

在表2的实体类中我们这么定义

//此实体类作为一对多关系中的“多”
//实现序列化接口
public class Food implements Serializable {

	private int id;
	private int pid;
	private String fname;
	private String fkouwei;
	private Person person;//将一对多关系中的“一”的实体类作为属性

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getPid() {
		return pid;
	}

	public void setPid(int pid) {
		this.pid = pid;
	}

	public String getFname() {
		return fname;
	}

	public void setFname(String fname) {
		this.fname = fname;
	}

	public String getFkouwei() {
		return fkouwei;
	}

	public void setFkouwei(String fkouwei) {
		this.fkouwei = fkouwei;
	}

	public Person getPerson() {
		return person;
	}

	public void setPerson(Person person) {
		this.person = person;
	}

}

在映射文件中

<mapper namespace="com.anzhuo.dao.myMapper">

	<!-- 配置自定义数据 -->
	<resultMap type="Food" id="myMap2">
		<result property="id" column="id"/>
		<result property="pid" column="pid"/>
		<result property="fname" column="fname"/>
		<result property="fkouwei" column="fkouwei"/>
		
		<!-- 这里与表2中的表1实体类属性相关联,当该属性表达“一”时用association元素。
			 property:对象属性的名称
			 javaType:对象属性的类型
			 column:所对应的外键字段名称 -->
		<association property="person" javaType="Person" column="pid">
			<result property="id" column="id"/>
			<result property="name" column="name"/>
			<result property="sex" column="sex"/>
		</association>
	</resultMap>

	<!-- 由于查询的是两个表中的值,所以我们需要自定义返回值类型,使用resultMap属性进行自定义 -->
	<select id="getID" parameterType="int" resultMap="myMap2">
		select * from person,food
		where
		person.id=food.pid and food.id=#{id};
	</select>

</mapper>

测试类

public class TestApp {

	public static void main(String[] args) throws IOException {
		//加载mybatis配置文件
		Reader reader = Resources.getResourceAsReader("config.xml");
		//创建一个SqlSessionFactory对象
		SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
		//创建能执行映射文件中sql语句的SqlSession对象
		SqlSession session = ssf.openSession();
		//使用查询方法将返回的结果用实体类接收
		Food food = session.selectOne("com.anzhuo.dao.myMapper.getID",2);
		//打印查询结果
		System.out.println("菜名:"+food.getFname());
		System.out.println("口味:"+food.getFkouwei());
		System.out.println("顾客:"+food.getPerson().getName());
	}
}

2.一对多关系
在两个数据表中,我们想要查询出与表1中的某一条数据有关的表2中所有数据,就需要使用到数据表之间的一对多关系。

实体类的定义不变

映射文件

<mapper namespace="com.anzhuo.dao.myMapper">
	
	<!-- 配置自定义数据 -->
	<!-- type属性中定义用来接收值的实体类,id代表resultMap的唯一标识 -->
	<resultMap type="Person" id="myMap">
		<!-- property属性与实体类中的属性名保持一致,column属性与数据表中的字段名保持一致 -->
		<result property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="sex" column="sex"/>
		
		<!-- 这里与实体类中的List集合属性相关连,当该属性表达“多”时用collection元素。
			 property:对象属性的名称
			 ofType:属性指定集合中元素的对象类型
			 column:所对应的外键字段名称 -->
		<collection property="food" ofType="com.anzhuo.bean.Food" column="pid">
			<!-- collection元素中的result元素则写表2中的属性 -->
			<result property="id" column="id"/>
			<result property="pid" column="pid"/>
			<result property="fname" column="fname"/>
			<result property="fkouwei" column="fkouwei"/>
		</collection>
	</resultMap>

	<!-- 由于查询的是两个表中的值,所以我们需要自定义返回值类型,使用resultMap属性进行自定义 -->
	<select id="getID" parameterType="int" resultMap="myMap">
		select * from person,food
		where
		person.id=food.pid and person.id=#{id};
	</select>

</mapper>

测试类

	public static void main(String[] args) throws IOException {
		//加载mybatis配置文件
		Reader reader = Resources.getResourceAsReader("config.xml");
		//创建一个SqlSessionFactory对象
		SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
		//创建能执行映射文件中sql语句的SqlSession对象
		SqlSession session = ssf.openSession();
		//使用查询方法将返回的结果用实体类接收
		Person person = session.selectOne("com.anzhuo.dao.myMapper.getID",2);
		//打印查询结果
		System.out.println(person.getId()+" "+person.getName()+" "+person.getSex());
		List<Food> food = person.getFood();
		for(Food f : food){
			System.out.println("菜名:"+f.getFname());
			System.out.println("口味:"+f.getFkouwei());
		}
	}

}

3.多对多关系
现在有两张完全独立的表,我们用一张表来给它们之间建立关系。
如何在三张表中获取到我们想要的数据呢?

首先我们为每张数据表创建对应的实体类。
在表1实体类中加入一个类型为表2实体类的List集合属性。表示将表2实体类以集合的形式嵌入到表1的实体类中
表2实体类也同样写一个List集合属性。

接着写两个接口

public interface IGood {
	//获取id执行sql语句,并返回一个Good类型的值。Good===》表1实体类
	Good getID(int id);
}

public interface IUser {
	//获取id执行sql语句,并返回一个User类型的值。User===》表2实体类
	User getID(int id);
}

然后来写与接口对应的sql映射文件

<mapper namespace="com.anzhuo.dao.IGood">

	<!-- 返回Good类型的结果集 -->
	<resultMap type="Good" id="myMap">
		<result property="gid" column="g_id"/>
		<result property="gname" column="g_name"/>
		<!-- 将查询结果里的g_id字段的值传递给IUser的getID方法 -->
		<collection property="user" column="g_id" select="com.anzhuo.dao.IUser.getID" />
	</resultMap>

 	<select id="getID" parameterType="int" resultMap="myMap">
  		SELECT * FROM
  		good
  		WHERE g_id=#{id};
 	</select>
</mapper>

<mapper namespace="com.anzhuo.dao.IUser">
	
	<!-- 返回User类型的结果集 -->
	<resultMap type="User" id="myMap">
		<result property="id" column="u_id"/>
		<result property="name" column="name"/>
		<result property="phone" column="phone"/>
	</resultMap>
	
	<!-- 根据方法传递过来的id值进行联合查询 -->
  	<select id="getID" parameterType="int" resultMap="myMap">
  		SELECT user.* FROM
  		user,usergroup
  		WHERE user.u_id=usergroup.u_id
  		AND usergroup.g_id=#{id};
 	 </select>
</mapper>

测试类

public class TestApp {

	public static void main(String[] args) throws IOException {
		//加载mybatis配置文件
		Reader reader = Resources.getResourceAsReader("config.xml");
		//创建一个SqlSessionFactory对象
		SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
		//创建能执行映射文件中sql语句的SqlSession对象
		SqlSession session = ssf.openSession();
		//获取接口实例对象
		IGood ig = session.getMapper(IGood.class);
		//调用getID方法返回了一个Good类型的结果集
		Good good = ig.getID(2);
		//打印查询结果
		System.out.println("组别:"+good.getGname());
		System.out.println("成员:");
		List<User> list = good.getUser();
		for(User user : list){
			System.out.println(user.getName());
			System.out.println(user.getPhone());
		}
	}
}

总结

MyBatis中使用association标签来解决一对一的关联查询
MyBatis中使用collection标签来解决一对多的关联查询

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消