目录
一.数据库的多对一,一对多问题
多个老师,对应一个老师
对于学生,关联一个老师
对于老师,下面有多个学生--->集合-->assocition和collection
二.设置案例,设置sql,建表(学生和老师)
USE mybatis;
CREATE TABLE student(
`id` INT(10) NOT NULL,
`NAME` VARCHAR(40) DEFAULT NULL,
`tid` INT(10) DEFAULT NULL,
PRIMARY KEY(`id`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY(`tid`) REFERENCES `teacher` (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
CREATE TABLE teacher(
`id` INT(10) NOT NULL,
`name` VARCHAR(40),
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
在表里插入数据--->student(小张,小红,小王,小明,小李)---->teacher表里插入(1,易老师)---》
---------------------------------------》
1. 创建StudentMapper和TeacherMapper接口
public interface StudentMapper
public interface TeacherMapper
2.配置StudentMapper.xml和TeacherMapper.xml
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--核心配置文件-->
<mapper namespace="Dao.StudentMapper">
</mapper>
<!--第二个-->
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--核心配置文件-->
<mapper namespace="Dao.TeacherMapper">
</mapper>
3.在mybatis.xml中注册,注册的方式有很多中,mapper class 和mapper resource也可以
<!-- 每一个都需要在核心配置文件中注册-->
<mappers>
<mapper class="Dao.StudentMapper"/>
<mapper class="Dao.TeacherMapper"/>
</mappers>
4.测试
在TeacherMapper接口加入查询方法
@Select("select *from teacher where id=#{tid}")
Teacher getTeacher(@Param("tid") int id);
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher(1);
System.out.println(teacher);
sqlSession.close();
}
结果:
三.总结,测试环境的搭建
- 导入lombok
- 新建实体类Teacher,Student
- 建立Mapper接口
- 建立Mapper.XML
- 在核心配置文件中注册Mapper接口或者文件
- 测试是否查询成功
四.多对一实现
1.按照结果嵌套
<!--核心配置文件-->
<mapper namespace="Dao.StudentMapper">
<!--思路?查询学生和老师表
根据学生的tid去老师的表中寻找数据-->
<select id="getStudent" resultMap="StudentTeacher">
select *from mybatis.student
</select>
<resultMap id="StudentTeacher" type="Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!-- <result property="tid" column="??"这里明显不可以使用上面的方法-->
<!-- 对于复杂的属性,我们要单独处理
对象:association
集合:collection-->
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="pojo.Teacher">
select *from mybatis.teacher where id=#{id};
</select>
测试:
@Test
public void getStudent(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> studentList = mapper.getStudent();
for (Student student : studentList) {
System.out.println(student);
}
sqlSession.close();
}
回顾mysql,子查询,联表查询
select s.id s.name,t.name from student s,teacher t
where s.tid=t.id
你要想在java里面实现,必须使用这个嵌套查询!!!
五.一对多实现
比如一个老师拥有多个学生,对于老师来说就是一对多
1.环境搭建
和刚刚一样,环境的搭建
实体类:Teacher,这次老师有多个学生
public class Teacher {
private int id;
private String name;
private List<Student> students;
}
student只有一个老师
public class Student {
private int id;
private String name;
private int tid;
}
方法一样,首先创建实体类----》写接口----》编写xml----》写xml(相当于实现接口)
2.写接口,思路按老师的id获得全部的学生
public List<Teacher> getTeacher(@Param("tid") int id);
3.配置TeacherMapper.xml文件
- 现在数据库控制台打出你想要查询的信息
select s.id sid,s.name sname,t.name tname,t.id tid from student s,teacher t where s.tid=t.id;
- 复制到TeacherMapper.xml中<select id="getTeacher" resultMap="TeacherStudent"> select s.id sid,s.name sname,t.name tname,t.id tid from mybatis.student s,mybatis.teacher t where s.tid=t.id and t.id=#{tid}; </select>
注意:为什么这里用的resultMap?1.如果你用的是resultType=Teacher的话,students--》null,因为你的Teacher里面的属性类型是一个List--》集合类型
3.
<!-- 按结果嵌套查询-->
<resultMap id="TeacherStudent" type="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<collection property="students" ofType="Student" >
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
第一个id-->查询结果的tid(因为这个按查询结果的);name---》查询结果的tname
重点来了,students的属性是集合怎么写?答案是 如果属性是对象-->association;对象是集合-->collection
然后,collection property=属性的名字,我们这里用oftype=Student来代替javatype,因为List这个属性不是你想要的,你要的是Student
这里的id---》查询结果的sid;name---》查询结果的sname;tid--tid
4.测试:
@Test
public void getTeacher(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
List<Teacher> teachers = mapper.getTeacher(1);
for (Teacher teacher : teachers) {
System.out.println(teacher);
}
得到的信息是:
Teacher(id=1, name=易老师, students=[Student(id=1, name=小明, tid=1), Student(id=2, name=小红, tid=1), Student(id=3, name=小张, tid=1), Student(id=4, name=小李, tid=1), Student(id=5, name=小王, tid=1)])---------》而不是null