Mybatis(3)Mybatis中多对一的2种查询方法

本文介绍使用MyBatis进行一对多及多对一的关联查询方法,详细展示了如何通过XML映射文件定义SQL语句及结果映射,实现从数据库获取数据并自动装配到Java对象的过程。

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

核心代码

StudentDao.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="dao.StudentDao">
	<!--方法1-->
	<!-- id对应接口中的方法名;resultMap指定返回值类型-->
	<select id="searchAll" resultMap="search2All">
		select stu.*,bj.name bjName from student stu left join banji bj on bj_id=bj.id;
	</select>
	
	<!-- type指的是返回类型的全类名,可以通过Mybatis里面的typeAlias起别名 -->
	<!-- id指的resultMap的名字 -->
	<resultMap type="entity.Student" id="search2All">
		<!-- id是主键,column是对应的数据库字段,property对应的是类中的变量名 -->
		<!-- 如果列和属性同名,可以不映射,只映射不同名的列和属性 -->
		<id column="id" property="id"></id>
		<result column="name" property="name" />
		<result column="gender" property="gender" />
		<result column="age" property="age" />
		<!-- 标签association:用于一对一,collection表示一对多或多对多 -->
		<!-- property:实体类属性名称,
		javaType:当前实体类中属性的全类名,ofType:当前集合中的数据类型 
		javaType对应的名字可以是typeAlias起别名后的名字
		-->
		<association property="bj" javaType="entity.BanJi">
			<id column="bj_id" property="id"></id>
			<!-- 字段名要和查询之后的字段名一致(name重名了,所以,重命名) -->
			<result column="bjName" property="name" />
		</association>
	</resultMap>
	
	<!--方法2-->
	<!-- 重命名符合Mybatis赋值规范,自动给bj对象的成员变量赋值 -->
	<!-- 注意,重命名要使用单引号,因为mysql认为,.是一种操作,‘’里面的内容是字符串 -->
	<!-- Mybatis认为,如果字段的名字和实体类的变量名一致就自动赋值 -->
	<select id="searchAll2" resultType="entity.Student">
		select stu.*,bj.id 'bj.id',bj.name 'bj.name' from student stu left join banji bj on bj_id=bj.id;
	</select>
	
</mapper> 

StudentDao.java【接口】

package dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import entity.Student;

public interface StudentDao {
	public List<Student> searchAll();
	public List<Student> searchAll2();
}

测试文件【Test测试文件】

package test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import dao.StudentDao;
import entity.BanJi;
import entity.Student;

public class Test3 {
	public static void main(String[] args) {
		SqlSession sqlSession=MybatisSqlSession.getSqlSession();
		StudentDao stuDao=sqlSession.getMapper(StudentDao.class);
		
		//查询外键,多对一【一个学生对应一个班级】
		List<Student> list=stuDao.searchAll();
		for(int i=0;i<list.size();i++) {
			//null是字符串,不是空值
			if(list.get(i).getBj()==null) {System.out.println("1233333");}
			System.out.println(list.get(i).getName()+"\t"+list.get(i).getBj().getName()+"\t"+list.get(i).getBj().getId());
		}
		System.out.println("1----------------------------");
		
		//查询外键,多对一【一个学生对应一个班级】
		List<Student> list2=stuDao.searchAll2();
		for(int i=0;i<list2.size();i++) {
			if(list2.get(i).getBj()==null) {
				System.out.println(list2.get(i).getName()+"\t"+list2.get(i).getBj().getId());
			}else {
				System.out.println(list2.get(i).getName()+"\t"+list2.get(i).getBj().getName()+"\t"+list2.get(i).getBj().getId());
			}
			
		}
		System.out.println("2----------------------------");
		
		
	}
}

实体类【注意此处由一个变动】

package entity;

import java.io.Serializable;

public class Student implements Serializable {
	//在类里面添加下面这一句话,固定当前对象和存入文件中的对象UID的值
    private static final long serialVersionUID = 42L;//值可以自己给定

    private int id;
	private String name;
	private String gender;
	private int age;
	
	//当返回类型为ResultMap的时候,
	//如果选择的字段为空,那么mybatis会忽略掉该对应属性。
	//new BanJi()防止返回空字段后,用户调用BanJi对象的成员变量导致报错
	//一般情况下,可以通过if判断避开空的外键
	private BanJi bj=new BanJi();//外键,bj.name;bj.id
	
	
	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 String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public BanJi getBj() {
		return bj;
	}
	public void setBj(BanJi bj) {
		this.bj = bj;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + ", bj=" + bj + "]";
	}
	
}

mybatis.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.cj.jdbc.Driver" />
				<property name="url"
					value="jdbc:mysql://localhost/school?serverTimezone=Asia/Shanghai&amp;useUnicode=true&amp;characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>

	<mappers>
		<mapper resource="dao/StudentDao.xml" />

	</mappers>
</configuration>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值