联合查询表中数据
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 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦