MyBatis一对多表的关联查询

一对多: 这三个字一听起来就应该知道什么意思了吧
打个比喻就好像师生关系,某天校长要查询一个班的所有学生的姓名
那是不是每个班都有一个班主任呐,是不是就可以根据班主任来查询他们班的所有学生?
那在这里查询的时候以班主任一个人来查询了他们班的学生,那么在之前这个班主任是不是就与他们班的学生就已经关联好了。
看到这里别懵,继续往下看!

学生
对映学生所学习的课程

下面我们来做个练习:
练习的要求:

  1. 创建一个主表,表名为users并给表添加3个字段分别为id,name,age,且给每个字段添加3个值。举例:
    在这里插入图片描述
  2. 创建一个子表,表名为zhiyuanshu并给表添加3个字段分别为id,userid,kechen,且给每个字段添加3个值(userid是与你主表有关系的字段)。举例:
    在这里插入图片描述
  3. 写两个与表相对的实体类,记住:实体类名要与表面保持一致且首字母大写(命名规范)

对应主表的实体类: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;
  //定义一个集合的泛形来关联到子表,并给予get,set
  public List<Zhiyuanshu> zhiyuanshu;
  
public List<Zhiyuanshu> getZhiyuanshu() {
	return zhiyuanshu;
}
public void setZhiyuanshu(List<Zhiyuanshu> zhiyuanshu) {
	this.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{
	//使用Serializable来实现实例化
  public int id;
  public int userid;
  public String kechen;
  public Users user;
  
public Users getUser() {
	return user;
}
public void setUser(Users user) {
	this.user = 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;
}
  
}
  1. 配置Mapper映射文件:mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "mapper" "mybatis-3-mapper.dtd" >
<!-- 一起我们的命名空间里面写的是实体类,这次有两个实体类,分别是主表和附表,所有我们不能直接使用 -->
<mapper namespace="com.anzhuo.Bean">
<!-- 一对多 -->
<resultMap type="Users" id="resultMap">
 <result property="id" column="id"/>
 <result property="name" column="name"/>
 <result property="age" column="age"/>
 <collection property="zhiyuanshu" ofType="com.anzhuo.Bean.Zhiyuanshu" column="userid">
  <result property="id" column="id" javaType="int" jdbcType="INTEGER"/>
  <result property="userid" column="userid" javaType="int" jdbcType="INTEGER"/>
 <result property="kechen" column="kechen" javaType="String" jdbcType="VARCHAR"/>
 </collection>
</resultMap>
  <select id="getSelect" parameterType="int" resultMap="resultMap">
    select users.name,users.age,zhiyuanshu.kechen from users inner join zhiyuanshu on users.id=zhiyuanshu.userid and userid=#{id};
  
  </select>
</mapper>

5.配置.config主配置文件:config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "config" "mybatis-3-config.dtd" >
<configuration>
 <typeAliases>
   <typeAlias alias="Users" type="com.anzhuo.Bean.Users"/>
   <typeAlias alias="Zhiyuanshu" type="com.anzhuo.Bean.Zhiyuanshu"/>
 </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://127.0.0.1:3306/mybatisdemo"/>
        <property name="username" value="root"/>
        <property name="password" value="123"/>
      </dataSource>
    </environment>
  </environments>
  
  <mappers>
   <mapper resource="mapper.xml"/>
  </mappers>
 
</configuration>

6.最后来测试一下我们一对多的关联是否成功能:Test.xml

package com.anzhuo.Test;



import java.io.*;
import java.util.List;

import org.apache.ibatis.io.*;
import org.apache.ibatis.session.*;

import com.anzhuo.Bean.*;


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();
	 Users user = session.selectOne("com.anzhuo.Bean.getSelect", 1);
	 System.out.println("学生:"+user.getName());
	 System.out.println("年龄:"+user.getAge());
	 List<Zhiyuanshu> ls = user.getZhiyuanshu();
	for(Zhiyuanshu p:ls){
		System.out.println("学习课程:"+p.getKechen());
	}
	 session.close();
}
}

下期讲解:多对一

猜你喜欢

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