MyBatis多对一联合查询

多对一:之前我们了解了一对多并且还做了练习,那这次我们来学习一下多对一,多对一其实和一对多差不多,一对多就是一个对应多个,都对一就是多个对应一个,那么我们还像一对多一样打个比喻:
假如星期一有一个人学习两门课程分别是java和MyBatis,在这里我想先查询到二号的课程并对应所学课程的学生,这思路很简单,相对昨天的来说就是想查询到多的一方在查询到一的一方,那么我们还是根据表之间有关联的id进行查询
注意:把 collection 改成 association把一对多改成多对一(一对多还没搞懂得请先回到一对多学习,学好了,再来学多对一)

  • 到数据库中先创建两个表分一个为用户(id,name,age),一个为学习课程(id,userid,kechen)类型这个就不用我说了吧,对应一个一个来。

  • 实体类需要实现实例化,主表的实体类里要定义一个泛型的集合用于来接受子表实体类的值,那么子表实体类也需要实现序列化,子表实体类要定义一个主表实体类类型的属性,用来调用到主表并使用

  • 实体映射文件SQL语句查询到的结果需要用resultMap来接收,因为现在查询的已经不是一个表里,现在是两个,那么两个表联合使用,我们需要把两个表关联吧,一对多是使用collection调用而多对一就不一样了,我们需要使用association来实现多对一关联

  • 主配置文件配置你有几个实体类就配置几个别名,在这里我给你们推存一个超简单的方法不管你有多少个实体类,在这里配置别名只用配置一次,不过注意,实体类必须在一个包下

    <typeAliases>
		<package name="放实体类的包名" />
	</typeAliases>
  • 测试类(有很多测试方法,看你怎么想)
    下面我来实现我上面讲的,你们可以一边看代码一边理解
    主表:
    在这里插入图片描述
    子表:
    在这里插入图片描述
    实体类名与表面保持一致且首字母大写(主表,[Users.java]):
package com.anzhuo.bean;

import java.io.Serializable;
import java.util.List;
public class Users implements Serializable{
	//使用Serializable来实现实例化
  public int id;
  public String name;
  public int age;
  List<Zhiyuanshu> zhiyuanshu;
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 int getAge() {
	return age;
}
public void setAge(int age) {
	this.age = age;
}
}

实体类名与表面保持一致且首字母大写(子表[Zhiyuanshu.java]):

package com.anzhuo.bean;

import java.io.Serializable;

public class Zhiyuanshu implements Serializable{
	public int id;
	  public int userid;
	  public String kechen;
	  public Users user;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getUserid() {
		return userid;
	}
	public void setUserid(int userid) {
		this.userid = userid;
	}
	public String getKechen() {
		return kechen;
	}
	public void setKechen(String kechen) {
		this.kechen = kechen;
	}
	public Users getUser() {
		return user;
	}
	public void setUser(Users user) {
		this.user = user;
	}
	  
}

实体映射文件与有关系的实体类名保持一致首字母小写(zhiyuanshu.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "mapper" "mybatis-3-mapper.dtd" >
<mapper namespace="com.anzhuo.bean"> 
  <select id="getSelect_A" resultMap="resultmap_A">
  select * from zhiyuanshu,users where zhiyuanshu.userid=users.id and userid=#{id}
  </select>
  <!-- 多对一 -->
  <resultMap type="Zhiyuanshu" id="resultmap_A">
   <result property="id" column="id"/>
   <result property="userid" column="userid"/>
   <result property="kechen" column="kechen"/>
   
   <association property="user" javaType="Users">
   <result property="id" column="id"/>
 <result property="name" column="name"/>
 <result property="age" column="age"/>
   </association>
  </resultMap>
</mapper>

主配置文件(config.xml)注:只要是配置文件首字母小写(命名规范):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "config" "mybatis-3-config.dtd" >
<configuration>
	<typeAliases>
		<package name="com.anzhuo.bean" />
	</typeAliases>

	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatisdemo" />
				<property name="username" value="root" />
				<property name="password" value="123" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
  <mapper resource="zhiyuanshu.xml"/>
	</mappers>
</configuration>

测试类(Test.java):

package com.anzhuo.test;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.anzhuo.bean.Users;
import com.anzhuo.bean.Zhiyuanshu;

public class Test {
public static void main(String[] args) throws IOException {
	Reader is = Resources.getResourceAsReader("config.xml");
	SqlSessionFactory factory =new SqlSessionFactoryBuilder().build(is);
	SqlSession session =factory.openSession();
	
	int zhiyuanshuguanlianId = 2;
	List<Zhiyuanshu> zrs = session.selectList("com.anzhuo.bean.getSelect_A",zhiyuanshuguanlianId);
		for(Zhiyuanshu p:zrs){
			 System.out.println("课程:"+p.getKechen());
			 Users us = p.getUser();	
				System.out.println("姓名:"+us.getName());
				 System.out.println("年龄:"+us.getAge());
		}

	session.close();
	
}
}

为了一些小伙伴更容易理解,我把我的项目结构也给你们看一下(项目结构):
在这里插入图片描述
最后你们要是学会了的话,我出一道小题目来检验一下你们吧!

由题意完成任务:

假如我有3台电脑分别为(电脑A,电脑B,电脑C),今天又3个人使用了B电脑2个人使用了C电脑,1个人使用了A电脑,一共6个人分别叫(小明,小方,小聪,小薇,小夏,小浩),小明,小方,小聪用了B电脑,小薇,小夏用了C电脑,小浩用了A电脑,那么我想要你们使用多对一来实现,先查询到小薇,小夏,在告诉我小薇,小夏用的是第几台电脑?

猜你喜欢

转载自blog.csdn.net/qq_38274970/article/details/84345226