Mybatis08-多对一

这篇博客介绍了Mybatis中的一对多、多对一、一对一和多对多关系,并以多对一关系为例进行详细解释,包括在多的一方添加外键、ResultMap的使用以及关联的嵌套Select查询。通过示例代码展示了UserMapper和RoleMapper的配置,以及对应的POJO类和测试类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 关系举例

  1. 一对多:比如说一个班级有很多学生,可是这个班级只有一个班主任。在这个班级中随便找一个人,就会知道他们的班主任是谁;知道了这个班主任就会知道有哪几个学生。这里班主任和学生的关系就是一对多。
  2. 多对一:比如说一个班级有很多学生,可是这个班级只有一个班主任。在这个班级中随便找一个人,就会知道他们的班主任是谁;知道了这个班主任就会知道有哪几个学生。这里学生和班主任的关系就是多对一。
  3. 一对一:比如说一个班级有很多学生,他们分别有不同的学号。一个学生对应一个学号,一个学号对应一个学生;通过学号能找到学生,通过学生也能得到学号,不会重复。这里学生和学号的关系就是一对一。
  4. 多对多:比如说一个班级有很多学生,他们有语文课、数学课、英语课等很多课。一门课有很多人上,一个人上很多门课。这里学生和课程的关系就是多对多。

注:1.一对一的使用方法:

  (1)使用嵌套结果映射来处理重复的联合结果的子集 。

  (2)通过执行另外一个SQL映射语句来返回预期的复杂类型。

2.一对多的实现方法:在多的一方的表里面,添加外键。

3.多对多的实现方法:必须要通过单独的一张表来表示。

  • ResultMap

resultMap是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。resultMap解决了当POJO类中的属性与数据库字段不一致的情况,通过resultMap,两者间形成映射关系,从而省去了sql语句中的 'as' 关键字,起到简化的作用。

<resultMap type="com.shxt.model.User" id="UserBaseResultMap" autoMapping="true">
  	<!-- 映射主键 -->
  	<id property="userId" column="user_id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
  	<!-- 映射结果集 -->
  	<result property="userName" column="user_name"/>
  	<result property="pwd" column="password"/>
  	<result property="account" column="account"/>
  	<result property="fk_role_id" column="fk_role_id"/>
</resultMap>

 注:数据类型详见http://www.mybatis.org/mybatis-3/zh/configuration.html中XML配置中的类型处理器。

  •  多对一

关联的嵌套 Select 查询 :

UserMapper.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <mapper namespace="com.shxt.model.User">
  	<resultMap type="com.shxt.model.User" id="UserBaseResultMap" autoMapping="true">
  		<!-- 映射主键 -->
  		<id property="userId" column="user_id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
  		<!-- 映射结果集 -->
  		<result property="userName" column="user_name"/>
  		<result property="pwd" column="password"/>
  		<result property="account" column="account"/>
  		<result property="fk_role_id" column="fk_role_id"/>
  		<!-- 映射关联对象 -->
  		<association property="role" column="fk_role_id" select="com.shxt.model.Role.load"></association>
  	</resultMap>
	<select id="load" parameterType="integer" resultMap="UserBaseResultMap">
		select * from user where user_id=#{user_id}	
	</select>
  </mapper>

RoleMapper.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <mapper namespace="com.shxt.model.Role">
	<resultMap type="com.shxt.model.Role" id="RoleBaseResultMap">
		<id column="role_id" property="role_id"/>
		<result property="role_name" column="role_name"/>
	</resultMap>
	<select id="load" parameterType="Integer" resultMap="RoleBaseResultMap">
		select * from role where role_id=#{role_id}
	</select>
  </mapper>

User对应的POJO类:

package com.shxt.model;

public class User {
	//注意:数据库里面的字段名,类里面的属性名,input标签name值要一致
	private Integer userId;
	private String userName;
	private String pwd;
	private String account;
	private Integer fk_role_id;
	private Role role;
	public Integer getFk_role_id() {
		return fk_role_id;
	}
	public void setFk_role_id(Integer fk_role_id) {
		this.fk_role_id = fk_role_id;
	}
	public Role getRole() {
		return role;
	}
	public void setRole(Role role) {
		this.role = role;
	}
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getAccount() {
		return account;
	}
	public void setAccount(String account) {
		this.account = account;
	}
	@Override
	public String toString() {
		return "User [userId=" + userId + ", userName=" + userName + ", pwd=" + pwd + ", account=" + account
				+ ", fk_role_id=" + fk_role_id + ", role=" + role + "]";
	}
	
	
	
}

Role对应的POJO类:

package com.shxt.model;

public class Role {
	private Integer role_id;
	private String role_name;
	public Integer getRole_id() {
		return role_id;
	}
	public void setRole_id(Integer role_id) {
		this.role_id = role_id;
	}
	public String getRole_name() {
		return role_name;
	}
	public void setRole_name(String role_name) {
		this.role_name = role_name;
	}
	@Override
	public String toString() {
		return "Role [role_id=" + role_id + ", role_name=" + role_name + "]";
	}
	
}

测试类;

package com.shxt.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import com.shxt.dao.RoleDao;
import com.shxt.dao.UserDao;
import com.shxt.dao.impl.RoleDaoImpl;
import com.shxt.dao.impl.UserDaoImpl;
import com.shxt.model.Role;
import com.shxt.model.User;

public class MybatisTest {
	UserDao userDao = null;
	RoleDao roleDao = null; 
	@Before
	public void init() {
		userDao = new UserDaoImpl();
		 roleDao = new RoleDaoImpl();
	}
	
	@Test
	public void load1() {
		User user = userDao.load(1);
		System.out.println(user);
	}
}

还有对应的UserDao,UserDaoImpl;RoleDao,RoleDaoImpl就不在详细赘述。

程序运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值