MyBatis多对多联合查询

多对多:之前我们学习了一对多和多对一,那么我们今天的知识点是多对多,稍微比之前学习的一对多和多对一复杂一些,但是这都是小事,只要你理解的什么都好说。那么我们今天来学习多对多*—*

之前学习的只要你懂了,那么这个应该也不难,说难的请先回到一对多和多对一学习,这里我们直接进入练习:
思路很简单:

  1. 创建3个表分别是用户表,用户学习分组表,关系表(也就是关联表)表中内容自定义。
  2. 对应表中数据创建相对应的实体类,实体类名与表名保持一致且首字母大写。
  3. 创建一个接口(最后执行mapper接口方法时,会通过这种方式创建接口实例)
  4. 编写两个实体映射文件用来关联到表中的数据(用户学习分组表,关系表的映射文件)
  5. 编写一个MyBatis主配置文件分别配置别名,基本环境配置,映射文件配置(注:有多少个实体类就给多少个别名,有多少个映射文件就配置多少个映射文件)
  6. 编写测试类

根据我提供的思路在脑海里构建一下代码吧!!!

项目结构图:
在这里插入图片描述

  • 数据库创建表

user
在这里插入图片描述

groups
在这里插入图片描述
usergroup
在这里插入图片描述

  • 创建以表相对应的实体类:
    User.java
package com.anzhuo.cm.bean;

import java.util.List;

public class User {
    int id;
    String name;
    int phone;
    String sex;
    List<Groups> groups;
	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 getPhone() {
		return phone;
	}
	public void setPhone(int phone) {
		this.phone = phone;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public List<Groups> getGroups() {
		return groups;
	}
	public void setGroups(List<Groups> groups) {
		this.groups = groups;
	}
	
}

Groups.java

package com.anzhuo.cm.bean;

import java.util.List;

public class Groups {
 int id;
 String zhu;
 List<User> user;
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public String getZhu() {
	return zhu;
}
public void setZhu(String zhu) {
	this.zhu = zhu;
}
public List<User> getUser() {
	return user;
}
public void setUser(List<User> user) {
	this.user = user;
}
 
}

UserGroup.java

package com.anzhuo.cm.bean;

public class UserGroup {
  int uid;
  int pid;
public int getUid() {
	return uid;
}
public void setUid(int uid) {
	this.uid = uid;
}
public int getPid() {
	return pid;
}
public void setPid(int pid) {
	this.pid = pid;
}
  
	
}

  • 创建一个接口并给予一个方法
    IGroupsMapper.java
package com.anzhuo.cm.dao;

import com.anzhuo.cm.bean.Groups;

public interface IGroupsMapper {
	public Groups getSelectById_A(int i);
}

  • 编写使表的关联实体配置文件
    groupsmapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "mapper" "mybatis-3-mapper.dtd" >
<mapper namespace="com.anzhuo.cm.dao.IGroupsMapper">
	<select id="getSelectById_A" parameterType="int" resultMap="resultmap_groups">
		select * from groups where id=#{id}
	</select>
	<resultMap type="Groups" id="resultmap_groups">
		<result property="id" column="id" />
		<result property="zhu" column="zhu" />
		<collection property="user" column="id"
			select="com.anzhuo.cm.dao.IGroupsMapper.getSelectById_B">
		</collection>
	</resultMap>
</mapper>

usergroupmapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "mapper" "mybatis-3-mapper.dtd" >
<mapper namespace="com.anzhuo.cm.dao.IGroupsMapper">
	<select id="getSelectById_B" parameterType="int" resultMap="resultmap_usergroup">
		select u.*,ug.g_id from user u,usergroup ug where u.id=ug.u_id and ug.g_id=#{id}
	</select>
	<resultMap type="User" id="resultmap_usergroup">
		<result property="id" column="id" />
		<result property="name" column="name" />
		<result property="phone" column="phone" />
		<result property="sex" column="sex" />
	</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.cm.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="com/anzhuo/cm/dao/groupsmapper.xml"/>
	<mapper resource="com/anzhuo/cm/dao/usergroupmapper.xml"/>
		<!-- <package name="com.anzhuo.cm.dao"/> -->
	</mappers>
</configuration>

  • 最后编写一个测试类来测试一下多对多是否编写成功:
    Test.xml
package com.anzhou.cm.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.cm.bean.Groups;
import com.anzhuo.cm.bean.User;
import com.anzhuo.cm.dao.IGroupsMapper;


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();
	 IGroupsMapper igm = session.getMapper(IGroupsMapper.class);
	  Groups gro = igm.getSelectById_A(1);
	  System.out.println("学习组:"+gro.getZhu());
	  List<User> user =gro.getUser();
	  for(User us:user){
		  System.out.println("学生名:"+us.getName());
		  System.out.println("学生性别:"+us.getSex());
		  System.out.println("学生电话:"+us.getPhone());	
	  }

	  Groups gro2 = igm.getSelectById_A(4);
	  System.out.println("学习组:"+gro2.getZhu());
	  List<User> user2 =gro2.getUser();
	  for(User us2:user2){
		  System.out.println("学生名:"+us2.getName());
		  System.out.println("学生性别:"+us2.getSex());
		  System.out.println("学生电话:"+us2.getPhone());	  
	  }
	  session.close();
}
}

看一步思路看一步代码,重要在于理解,多敲多练
要练习一种能把代码转为人的语言并说出口And把说出口的话转为代码

猜你喜欢

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