Mybatis一对多关系
一、数据库与数据表的建立
学生与班级是一对多的关系,首先创建一个学生表
create table tb_student(
-> id int not null auto_increment,
-> name varchar(10),
-> sex bool default true,
-> age int,
-> address varchar(100),
-> telphone varchar(100),
-> classmateid int not null,
-> primary key(id)
-> );
添加学生信息
insert into tb_student(name,age,address,telphone) values('张三丰',108,'武当山','13262183425');
insert into tb_student(name,age,address,telphone) values('张无忌',24,'光明顶','13423678543');
其次,创建班级表
create table tb_classmate(
-> id int not null auto_increment,
-> name varchar(20),
-> primary key(id)
-> );
添加测试数据
insert into tb_classmate(name) values('武功速成171班');
二、创建Java项目
1.配置数据库连接信息
1)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>
<properties resource="msqldatasource.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--
<mapper resource="com/sky/demo/dao/AccountMapper.xml" />
-->
<package name="com.sky.dao"/>
</mappers>
</configuration>
数据库连接信息msqldatasource.properties内容如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisstudy
username=root
password=123456
三、创建Java bean
1.Student.java内容如下
public class Student {
private int id;
private String name;
private boolean sex;
private int age;
private String address;
private String telphone;
private int classmateid;
private ClassMate classMate;
//省略其setter和getter方法
}
2.ClassMate.java内容如下:
public class ClassMate {
private int id;
private String name;
private List<Student> students;
//省略其setter和getter方法
}
四、创建数据访问层
1.创建Student数据访问层接口
package com.sky.dao;
import com.sky.bean.Student;
import java.util.List;
public interface StudentMapper {
/**
* 根据班级编号取得所有的学生信息
* @param id 班级编号
* @return
*/
public List<Student> getStudentsByClassMateId(int id);
}
2.创建Student的SQL映射
<?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.sky.dao.StudentMapper">
<resultMap id="studentMap" type="com.sky.bean.Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="age" property="age"/>
<result column="address" property="address"/>
<result column="telphone" property="telphone"/>
</resultMap>
<select id="getStudentsByClassMateId" resultMap="studentMap">
select * from tb_student where classmateid = #{id}
</select>
</mapper>
3.创建ClassMate数据访问层接口
package com.sky.dao;
import com.sky.bean.ClassMate;
public interface ClassMateMapper {
/**
* 根据班级id取得班级的信息
* @param id 班级id
* @return 返回该班级的信息
*/
public ClassMate getClassMateById(int id);
}
4.创建ClassMate的SQL映射
<?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.sky.dao.ClassMateMapper">
<resultMap id="classMateMap" type="com.sky.bean.ClassMate">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="students" column="id" ofType="Student"
select="com.sky.dao.StudentMapper.getStudentsByClassMateId">
</collection>
</resultMap>
<select id="getClassMateById" resultMap="classMateMap">
select * from tb_classmate where id = #{id}
</select>
</mapper>
此是一对多关系的实现,在ClassMate的映射中,
<collection property="students" column="id" ofType="Student"
select="com.sky.dao.StudentMapper.getStudentsByClassMateId">
</collection>
为取得学生表中的信息,其中property的值与ClassMateMapper.java中的属性名相同,column的值,因为取得学生信息,是根据班级表的id信息取得的,所以此处的值为 id,select的值,注意要写全类名,否则,会找不到相应的映射信息。
最后,执行结果如下:
package com.sky;
import com.sky.bean.ClassMate;
import com.sky.dao.ClassMateMapper;
import com.sky.util.DBUtil;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class MyDemo1 {
public static void main(String[] args) {
SqlSession session=DBUtil.getSession();
ClassMateMapper mateMapper=session.getMapper(ClassMateMapper.class);
ClassMate classMate=mateMapper.getClassMateById(1);
System.out.println(classMate.toString());
}
}
ClassMate{id=1, name='武功速成171班', students=[Student{id=1, name='张三丰', sex=true, age=108, address='武当山', telphone='13262183425', classmateid=1, classMate=null}, Student{id=2, name='张无忌', sex=true, age=24, address='光明顶', telphone='13423678543', classmateid=1, classMate=null}]}
五、多对一的关系
1.修改Student的接口与映射文件
package com.sky.dao;
import com.sky.bean.Student;
import java.util.List;
public interface StudentMapper {
/**
* 根据班级编号取得所有的学生信息
* @param id 班级编号
* @return
*/
public List<Student> getStudentsByClassMateId(int id);
/**
* 根据学生编号取得学生信息
* @param id 学生编号
* @return 学生信息
*/
public Student getStudentById(int id);
}
<?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.sky.dao.StudentMapper">
<resultMap id="studentMap" type="com.sky.bean.Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="age" property="age"/>
<result column="address" property="address"/>
<result column="telphone" property="telphone"/>
<association property="classMate" column="classmateid"
select="com.sky.dao.ClassMateMapper.getClassMateById">
</association>
</resultMap>
<select id="getStudentsByClassMateId" resultMap="studentMap">
select * from tb_student where classmateid = #{id}
</select>
<select id="getStudentById" resultMap="studentMap">
select * from tb_student where id=#{id}
</select>
</mapper>
运行结果如下:
package com.sky;
import com.sky.bean.ClassMate;
import com.sky.bean.Student;
import com.sky.dao.ClassMateMapper;
import com.sky.dao.StudentMapper;
import com.sky.util.DBUtil;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class MyDemo1 {
public static void main(String[] args) {
SqlSession session=DBUtil.getSession();
StudentMapper studentMapper=session.getMapper(StudentMapper.class);
Student stu=studentMapper.getStudentById(1);
ClassMate classMate=stu.getClassMate();
System.out.println(stu.getName()+"\t"+stu.getAge()+"\t"+stu.getAddress());
System.out.println(classMate.getName());
/*
ClassMateMapper mateMapper=session.getMapper(ClassMateMapper.class);
ClassMate classMate=mateMapper.getClassMateById(1);
System.out.println(classMate.toString());
*/
}
}
张三丰 108 武当山
武功速成171班