1、环境搭建
1.1、数据库中创建Teacher表和Student 表,并插入内容
CREATE TABLE `teacher`(
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY(`id`)
) ENGINE = INNODB DEFAULT CHARSET=utf8
INSERT INTO teacher(`id`,`name`) VALUES('1','秦老师');
CREATE TABLE `student`(
`id` INT(10) NOT NULL,
`name` VARCHAR(30) 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
INSERT INTO `student` (`id`,`name`,`tid`) VALUES('1','小明','1');
INSERT INTO `student` (`id`,`name`,`tid`) VALUES('2','小红','1');
INSERT INTO `student` (`id`,`name`,`tid`) VALUES('3','小张','1');
INSERT INTO `student` (`id`,`name`,`tid`) VALUES('4','小李','1');
INSERT INTO `student` (`id`,`name`,`tid`) VALUES('5','小王','1');
1,2、创建实体类Teacher、Student
public class Student { private int id; private String name; //学生需要关联老师 private Teacher teacher; public Student() { } public Student(int id, String name, Teacher teacher) { this.id = id; this.name = name; this.teacher = teacher; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", teacher=" + teacher + '}'; } }
public class Teacher { private int id; private String name; public Teacher() { } public Teacher(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Teacher{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
1.3、建立Mapper接口
public interface StudentMapper { }
public interface TeacherMapper { //里面的内容是用于测试的 @Select("select * from teacher where id =#{tid}") Teacher getTeacher(@Param("tid") int id); }
1.4、建立Mapper.xml文件 (创建空文件,然后把mybatis.xml中的内容复制过去,删掉多余内容,修改两个地方就行)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.kuang.dao.StudentMapper"> </mapper>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.kuang.dao.TeacherMapper"> </mapper>
1.5、在核心配置文件中绑定注册我们的Mapper接口或者文件
<mappers> <mapper class="com.kuang.dao.TeacherMapper"/> <mapper class="com.kuang.dao.StudentMapper"/> </mappers>
1.6、测试查询是否能够成功
public class MyTest { 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(); } }
2、多对1的处理
2.1按照查询嵌套处理
<!-- 思路 1、查询所有的学生信息 2、根据查询出来的学生的tid寻找对应的老师 --> <select id="getStudent" resultMap="StudentTeacher"> select * from student; </select> <resultMap id="StudentTeacher" type="Student"> <result property="id" column="id"/> <result property="name" column="name"/> <!--复杂的属性需要单独处理 对象:association 集合:collection --> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap> <select id="getTeacher" resultType="Teacher"> select * from teacher where id = #{id} </select>
2.2按照结果嵌套查询
<!--按照结果嵌套处理--> <select id="getStudent2" resultMap="StudentTeacher2"> select s.id sid,s.name sname,t.name tname from student s,teacher t where s.tid = t.id; </select> <resultMap id="StudentTeacher2" type="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <association property="teacher" javaType="Teacher"> <result property="name" column="tname"/> </association> </resultMap>
3、一对多
1、按照结果嵌套处理
<!--按结果嵌套查询--> <select id="getTeacher" resultMap="TeacherStudent"> select s.id sid, s.name sname,t.name tname,t.id tid from student s,teacher t where s.tid = t.id and t.id = #{tid} </select> <resultMap id="TeacherStudent" type="Teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> <!--复杂的属性,我们需要单独处理 对象:association 集合:collection javaType=""指定属性的类型 集合中的泛型信息,我们使用ofType获取 --> <collection property="students" ofType="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <result property="tid" column="tid"/> </collection> </resultMap>
2、按照查询嵌套处理
<select id="getTeacher2" resultMap="TeacherStudent2"> select *from mybatis.teacher where id = #{tid} </select> <resultMap id="TeacherStudent2" type="Teacher"> <!--复杂的属性需要单独处理 对象:association 集合:collection --> <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/> </resultMap> <select id="getStudentByTeacherId" resultType="Student"> select * from mybatis.student where tid =#{tid} </select>
小结
1、关联-association【多对一】
2、集合-collection 【一对多】
3、javaType ofType
javaType用来指定实体类中属性的类型(例:private List<Student> students; 类型就是ArrayList)
ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型!(例private List<Student> students; 就是Student)
注意点:1、保证SQL 的可读性,尽量保证通俗易懂
2、注意一对多和多对一中,属性名和字段的问题
3、如果问题不好排查错误,可以使用日志,建议使用Log4j