MyBatis笔记五之一对多映射

一对多映射通常是在多的一方设置外键,即多方维护关系。

一个班级有多个学生,但一个学生只有一个班级,接下来就写个例子

1、在数据库mybatis中创建班级表和学生表,并插入几条数据:

create table clazz(
    -> id int primary key auto_increment,
    -> code char(18),
    -> name char(18));
 create table student(
    -> id int primary key auto_increment,
    -> name char(18),
    -> age int,
    -> clazz_id int,
    -> foreign key(clazz_id) references clazz(id));
insert into clazz values(1,'2016','软件4班');

insert into student values(1,'张三',18,1);
insert into student values(2,'李四',19,1);
insert into student values(3,'王五',19,1);

2、编写对应的pojo对象

package pojo;

import java.util.List;

public class Clazz {

	private Integer id;
	private String code;
	private String c_name;
	private List<Student>  students;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getC_name() {
		return c_name;
	}
	public void setC_name(String c_name) {
		this.c_name = c_name;
	}
	public List<Student> getStudents() {
		return students;
	}
	public void setStudents(List<Student> students) {
		this.students = students;
	}
}
package pojo;

public class Student {

	private Integer id;
	private String name;
	private int age;
	private Clazz clazz;
	public Integer getId() {
		return id;
	}
	public void setId(Integer 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 Clazz getClazz() {
		return clazz;
	}
	public void setClazz(Clazz clazz) {
		this.clazz = clazz;
	}
}

3、编写映射文件,位于src/mapping目录下

ClazzMapper.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="mapping.ClazzMapper">
	<resultMap type="pojo.Clazz" id="clazzResultMap">
		<id property="id" column="id"/>
		<result property="code" column="code"/>
		<result property="c_name" column="name"/>
		<!-- 一对多关联映射 ,fetchType指定为懒加载-->
		<collection property="students" column="id" javaType="ArrayList" ofType="pojo.Student" fetchType="lazy" select="mapping.StudentMapper.selectStudentByClazzId">
			<id property="id" column="id"/>
			<result property="name" column="name"/>
			<result property="age" column="age"/>
		</collection>
	</resultMap>
	<!-- 根据id查询班级信息 -->
	<select id="selectClazzById" parameterType="int" resultMap="clazzResultMap">
		SELECT*FROM cLazz WHERE id=#{id}
	</select>
</mapper>

StudentMapper.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="mapping.StudentMapper">
	<!-- 根据班级id查询学生信息 -->
	<select id="selectStudentByClazzId" parameterType="int" resultMap="studentResultMap">
		SELECT * FROM student WHERE  clazz_id = #{id}
	</select>
	<!-- 根据id查询学生信息,多表连接,返回resultMap -->
	<select id="selectStudentById" parameterType="int" resultMap="studentResultMap">
		SELECT*FROM student s,clazz c
		WHERE s.clazz_id=c.id  AND s.id=#{id}
	</select>
	
	<resultMap type="pojo.Student" id="studentResultMap">
		<id property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="age" column="age"/>
		<!-- 多对一关联 -->
		<association property="clazz" javaType="pojo.Clazz">
			<id property="id" column="id"/>
			<result property="code" column="code"/>
			<result property="c_name" column="name"/>
		</association>
	</resultMap>
</mapper>

4、在mapping目录下再新建两个mapper代理接口

package mapping;

import pojo.Clazz;

public interface ClazzMapper {

	Clazz selectClazzById(Integer id);
}
package mapping;

import pojo.Student;

public interface StudentMapper {

	Student selectStudentById(Integer id);
}

5、在mybatis-config.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>
    
	<settings>
		<!-- 指定所有日志的具体实现 -->
		<setting name="logImpl" value="LOG4J"/>
		<!-- 懒加载的配置 -->
		<setting name="lazyLoadingEnabled" value="true"/>
		<setting name="aggressiveLazyLoading" value="false"/>
	</settings>
	<!-- 环境配置 -->
	<environments default="mysql">
		<environment id="mysql">
			<!-- 指定事务管理类型 -->
			<transactionManager type="JDBC" />
			<!-- 配置数据源,POOLED是JDBC连接对象的数据源连接池的实现 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
				<property name="username" value="root"/>
				<property name="password" value="root"/>
			</dataSource>
		</environment>
	</environments>
	<!-- mappers告诉mybatis找持久化类的映射文件 -->
	<mappers>
		<mapper resource="mapping/StudentMapper.xml"/>
		<mapper resource="mapping/ClazzMapper.xml"/>
	</mappers>
</configuration>

6、编写SqlSession工厂类,用于读取mybatis-config.xml配置文件并生成SqlSession,位于src/factory目录下

package factory;

import java.io.IOException;
import java.io.InputStream;

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 MyFactory {

	private static SqlSessionFactory ssf = null;
	static{
		try {
			InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
			ssf = new SqlSessionFactoryBuilder().build(is);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//获取SqlSession的静态方法
	public static SqlSession getSqlSession(){
		return ssf.openSession();
	}
	//获取SqlSessionFactory的静态方法
		public static SqlSessionFactory getSqlSessionFactory(){
			return ssf;
		}
}

7、编写一对多测试类

package reflectTest;

import org.apache.ibatis.session.SqlSession;

import factory.MyFactory;
import mapping.ClazzMapper;
import mapping.StudentMapper;
import pojo.Clazz;
import pojo.Student;

public class OneToMany {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SqlSession session = MyFactory.getSqlSession();
		//查询李四(2号)所在的班级
		StudentMapper sm =  session.getMapper(StudentMapper.class);
		Student lisi = sm.selectStudentById(2);
		System.out.println("李四的班级为:"+lisi.getClazz().getCode());
		//查询1号班级所对应的学生信息
		ClazzMapper cm = session.getMapper(ClazzMapper.class);
		Clazz clazz = cm.selectClazzById(1);
		System.out.println(clazz.getCode()+clazz.getC_name()+"的学生信息如下:");
		for(Student s:clazz.getStudents()){
			System.out.println(s.getName()+"-"+s.getAge());
		}
		session.commit();
		session.close();
	}
}

测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值