1、需求
数据库中有两张表,分别是学生表和老师表,它们之间的关系是多对一
即多个学生有一个老师,一个老师对应多个学生
现在要查学生的所有信息,包括老师的信息
2、实现
2.1 数据库
2.2 bean层
public class Student {
private int id;
private String name;
//将老师的信息作为一个属性
private Teacher teacher;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", teacher=" + teacher +
'}';
}
}
public class Teacher {
private int id;
private String name;
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
2.3 dao层
public interface StudentDao {
/**
* 通过id获取学生所有信息
*
* @param id
* @return
*/
Student searchStudentById(int id);
/**
* 获取所有学生信息
*
* @return
*/
List<Student> searchStudent();
}
2.4 编写studentMpapper
<?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">
<--namespace 和接口名一致-->
<mapper namespace="com.ff.dao.StudentDao">
<resultMap id="student" type="com.ff.bean.Student">
<id property="id" column="sid"></id>
<result property="name" column="sname"></result>
<--一个复杂类型的关联;许多结果将包装成这种类型 这里就是将学生对象中的教师属性进行解析
教师属性属于教师类,然后将教师类中的属性和数据库查询出来的教师相关字段进行一一对应
-->
<association property="teacher" javaType="com.ff.bean.Teacher">
<id property="id" column="tid"></id>
<result property="name" column="tname"></result>
</association>
</resultMap>
<--id 和接口中方法名相同-->
<select id="searchStudent" resultMap="student">
SELECT
s.id sid,
s.name sname,
t.id tid,
t.name tname
FROM
student s,
teacher t
WHERE s.teacher_id = t.id
</select>
</mapper>
2.5 在mybatis配置文件中注册映射
<?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="JDBC.properties"></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>
<--编写一个映射文件,就要在Mybatis主配置文件中进行注册-->
<mappers>
<mapper resource="mapper/studentMapper.xml"/>
</mappers>
</configuration>
2.6 测试运行
@Test
public void test1(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
List<Student> students = studentDao.searchStudent();
for (Student stu : students){
System.out.println(stu);
}
sqlSession.close();
}
2.7 运行结果
3、技术点
查询的结果类型为一个Map,这个Map有我们自己对应属性和列名
属性为一个对象的,使用 association 再进行对应
<resultMap id="student" type="com.ff.bean.Student">
<id property="id" column="sid"></id>
<result property="name" column="sname"></result>
<association property="teacher" javaType="com.ff.bean.Teacher">
<id property="id" column="tid"></id>
<result property="name" column="tname"></result>
</association>
</resultMap>