Mybatis学习笔记(二)------xml方式多表查询(多对一)

本文详细介绍了使用MyBatis进行多对一查询的方法,包括实体类设计、映射文件配置、数据库连接和测试类实现。通过具体示例,展示了如何在Java中处理多对一关系,实现数据的高效查询。

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

编写目的:总结使用mybatis的相关经验和自己遇到一些bug以及需要注意的地方

1、在使用多对一查询时,属性使用Javatype

2、在数据查找时,如果所查的表的主键相同时,可能出现只查出一个结构,这是mybatis内部处理机制,不做研究,出现这种类似问题,只需要更该某个主键即可

一、目录结构

二、具体实现

2.1实体类EStudent

package com.student.entity;

public class EStudent {
	private long id;
	private String name;
    private int age;
    private	Major major;//面向对象的方式
    
	  // getter,setter方法

	  public Major getMajor() {
		return major;
	}

	public void setMajor(Major major) {
		this.major = major;
	}

	public long getId() {
		return id;
	}

	public void setId(long 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;
	}

	/**
	   * 必须提供一个无参数的构造函数
	   */
	public EStudent(){}
}

 2.2实体类Major

public class Major {
	private int stu_id;
	private String major_name;
	public int getStu_id() {
		return stu_id;
	}
	public void setStu_id(int stu_id) {
		this.stu_id = stu_id;
	}
	public String getName() {
		return major_name;
	}
	public void setName(String name) {
		this.major_name = name;
	}
	
}

 2.3映射文件配置EstudentMapper

<?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.student.entity.test">
	<select id="getStudent" resultMap="selectStudent">
		SELECT
		estudent.id,
		esmajor.major,
		estudent.`name`,estudent.age FROM estudent ,esmajor
		WHERE
		estudent.stu_id=esmajor.id
	</select>
	<insert id="insertStudent" parameterType="com.student.entity.EStudent">
		INSERT INTO estudent(id,`name`,age,stu_id)VALUES(#{id},#{name},#{age},#{major.stu_id});
	</insert>
	<update id="updateStudent" parameterType="hashmap">
		update estudent set name=#{name},stu_id=#{stu_id} where id=#{id} 
	</update>
	<delete id="deleteStudent" parameterType="com.student.entity.EStudent">
		delete from estudent where estudent.id = #{id}
	</delete>
	<resultMap id="selectStudent" type="com.student.entity.EStudent">
		<id property="id" column="id" />
		<result property="name" column="name" />
		<!-- 这里获取关联对象的数据 -->
        <!--使用多对一,多对多查询时,这里使用javaType-->
		<association property="major" javaType="com.student.entity.Major">
			<id property="stu_id" column="id"/>
			<result property="major_name" column="major" />
		</association>
	</resultMap>
</mapper>

 

2.4数据库链接ConnectionSql

import java.io.IOException;

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

public class ConnectionSql {
	static SqlSessionFactory factory;
	
	static {
		String resource="batis.xml";
		try {
			if(factory==null) {
				factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource));
				
			}
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
	public static SqlSession getSession() {
		return factory.openSession();
	}
}

 2.5测试类MybatisTes1

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

import org.apache.ibatis.session.SqlSession;

import com.student.entity.EStudent;
import com.student.entity.Major;
import com.student.jdbc.ConnectionSql;

public class MybatisTest1 {
	public static void main(String[] args) {
		SqlSession session = ConnectionSql.getSession();
		//查找操作
		List<EStudent> listStu = session.selectList("com.student.entity.test.getStudent");
		for (EStudent eStudent : listStu) {
			System.out.println(eStudent.getName()+" "+eStudent.getMajor().getName());
		}
		//插入操作
		/*
		EStudent stu = new EStudent();
		Major major =new Major();
		major.setStu_id(3);
		stu.setId(2);
		stu.setName("范小明");
		stu.setAge(20);
		stu.setMajor(major);
		int a = session.insert("com.student.entity.test.insertStudent", stu);
		*/
		/*
		//更新操作,这里使用是动态SQL语句,通过hashMap传递值
		HashMap<String,Object> argMap = new HashMap<>();
		argMap.put("id", 1);
		argMap.put("stu_id", 4);
		argMap.put("name", "汪坤");
		int b = session.update("com.student.entity.test.updateStudent", argMap);
		*/
		EStudent stu = new EStudent();
		Major major =new Major();
		stu.setId(3);
		int c = session.update("com.student.entity.test.deleteStudent", stu);
		System.out.println(c);
		session.commit();
	}
}

2.6数据库文件配置

<?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>
	
		
	<typeAliases>
        <typeAlias  type="com.student.entity.EStudent" alias="Student"/>
    </typeAliases>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/db_batis?useUnicode=true&amp;characterEncoding=utf8" />
				<property name="username" value="root" />
				<property name="password" value="" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com\student\entity\EstudentMapper.xml" />
	</mappers>
</configuration>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小生不财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值