一对多映射通常是在多的一方设置外键,即多方维护关系。
一个班级有多个学生,但一个学生只有一个班级,接下来就写个例子
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();
}
}
测试结果