MyBatis实现一对多

本文详细介绍了使用MyBatis实现一对多关系的步骤,包括导入MyBatis和MySQL驱动jar包,创建person和food两张表,编写对应SQL语句,创建实体类,设置实体映射文件及MyBatis主配置文件,最后编写测试类并展示运行结果。

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

第一步:导入两个jar包分别为mybatis-3.2.3.jar和mysql-connector-java-5.1.25-bin.jar,如下图所示:
在这里插入图片描述
第二步:创建两张表(本人两张表分别为person和food),如下图所示:
person表
在这里插入图片描述
food表
在这里插入图片描述
以下是几条相关SQL语句:
创建数据库语句:create database 数据库名;
创建表语句:create table 表名(id(字段名) int(数据类型)primary key(设置主键), name varchar(10) , sex varchar(10) );
添加值:insert into 表名(id,name,sex) values (1,“李四”,“男”);
注:一张表中只能设置一个主键
第三步:创建改表相对应的实体类:
推荐类与表名同名(类命名规范:类名首字母大写)
Person类:

package com.zhiyuan.Bean;

import java.io.Serializable;
import java.util.List;

public class Person implements Serializable{
//implements:用于实现接口
//Serializable:接口是启用其序列化功能的接口
	private int id;
	private String name;
	private String sex;
//以上三个属性推荐与数据库里面的字段名保持一致
	private List<Food> list;
//list用于接收多条记录
	public List<Food> getList() {
		return list;
	}
	public void setList(List<Food> list) {
		this.list = list;
	}
	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 getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
//以上get和set方法可以通过鼠标右击》然后将鼠标放在Source上》Generate Getters and Setters...》勾选你需要生成get,set的属性点击ok即可
	
}

Food类:

package com.zhiyuan.Bean;

import java.io.Serializable;

public class Food implements Serializable{
	private int id;
	private int p_id;
	private String fname;
	private String fkouwei;
	private Person person;//用于实现多对一,在此可有可无
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getP_id() {
		return p_id;
	}
	public void setP_id(int p_id) {
		this.p_id = p_id;
	}
	public String getFname() {
		return fname;
	}
	public void setFname(String fname) {
		this.fname = fname;
	}
	public String getFkouwei() {
		return fkouwei;
	}
	public void setFkouwei(String fkouwei) {
		this.fkouwei = fkouwei;
	}
	
}

第四步:创建好实体映射文件
推荐映射文件名与实体类名保存一致(文件名全部小写)
person.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "mybatis-3-mapper" "mybatis-3-mapper.dtd" >
<mapper namespace="com.zhiyuan.Bean">
<!--  namespace:命名空间,com.zhiyuan.Bean:实体类包名 -->
	<resultMap type="person" id="aa">
	<!-- type:如果在主配置文件中配置了别名,这里可以写别名,如没有配置这里写Person类全路径 -->
		<result property="id" column="id"/>
		<!-- property:与实体类中的属性名保持一致,column与数据库里面的字段名保持一致 -->
		<result property="name" column="name"/>
		<result property="sex" column="sex"/>
		<collection property="list" ofType="Food" column="p_id">
		<!-- 一对多用collection,多对一用association -->
		<!-- ofType:和type用法一样,column:两表之间有关系的字段 -->
			<result property="id" column="id"/>
			<result property="p_id" column="p_id"/>
			<result property="fname" column="fname"/>
			<result property="fkouwei" column="fkouwei"/>
		</collection>
	</resultMap>
	<select id="GetID" parameterType="int" resultMap="aa">
	<!-- id:唯一标识符,parameterType:传入参数类型,resultMap:本人理解为自定义返回参数类型,详细可以参考:http://www.cnblogs.com/fsjohnhuang/p/4076592.html,resultMap中aa与resultMap泛型id值保持一致  -->
		select * from person,food where person.id=food.p_id and person.id=#{id}
		<!-- 查询语句,#{id}:表示占位符 -->
	</select>
</mapper>

第五步:创建好MaBatis的主配置文件
推荐映射文件名与实体类名保存一致(文件名全部小写)
config.xml主配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "mybatis-3-config" "mybatis-3-config.dtd" >
<configuration>
	<typeAliases>
	<!-- 配置别名 -->
		<package name="com.zhiyuan.Bean"/>
		<!-- 批量定义别名:name:指定包名,mybatis自动扫描包中的类,自动定义别名,别名就是类名(首字母大小写都可以) -->
	</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/数据库名"/>
				<property name="username" value="用户名"/>
				<property name="password" value="密码"/>
			</dataSource>
		</environment>
	</environments>
	
	<mappers>
		<mapper resource="com/zhiyuan/Dao/person.xml"/>
		<!-- 映射路径,person.xml的路径 -->
	</mappers>
</configuration>

第六步:编译测试类
Text测试类:

package com.zhiyuan.Text;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

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

import com.zhiyuan.Bean.Food;
import com.zhiyuan.Bean.Person;

public class Text {

	public static void main(String[] args) throws IOException {
		Reader reader = Resources.getResourceAsReader("config.xml");
		//通过Resources类调用getResourceAsReader方法来获取 config主配置文件并用Reader来进行接收
		SqlSessionFactory session = new SqlSessionFactoryBuilder().build(reader);//创建工厂回话
		Person person = session.openSession().selectOne("com.zhiyuan.Bean.GetID",1);
		//openSession用来创建Sqlsession,selectOne用来查询一条记录(一条记录用实体类接收),selectList用来查询一条或多条记录
		System.out.println("ID:"+person.getId()+"  姓名:"+person.getName()+"  性别:"+person.getSex());
		List<Food> list = person.getList();
		for (Food food : list) {
		<!-- 加强for循环(接收类型 属性名:list集合名) -->
			System.out.println("ID:"+food.getId()+"  P_Id:"+food.getP_id()+"  食物名:"+food.getFname()+"  口味:"+food.getFkouwei());
		}
	}

}

运行结果如下图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值