Mybatis多对一查询
Mybatis多对一的查询主要有两种 第一种是查询嵌套处理,另一种是按照结果嵌套处理 如今一般第二种较为主流
首先创建两个表,以教师表和学生表为例
--教师表 create table teacher( id int(15) primary key default null, name varchar(30) default null )ENGINE=INNODB DEFAULT CHARSET=UTF8; insert into teacher (id,name) values (1,‘刘老师’);
--学生表 create table student( id int(15) primary key default null, name varchar(30) default null, tid int(10) default null, key teacher_id (tid), constraint teacher_id 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);
我们在数据库中使用的语句是
select * from student s,teacher t where s.tid=t.id;
接下来使用嵌套处理——
查询嵌套处理
学生实体类
package com.mos3y.enity; public class Student { private int id; private String name; //getter setter 无参构造 toString方法
教师实体类
public class Teacher { private int id; private String name; //getter setter 无参构造 toString方法 }
注意:框架主要是通过反射来获取对象,主要通过以下代码,所以必须声明无参构造,否则就会报错
Class class1 = Class.forName(className); Object o1 = class1.newInstance();//调用无参构造方法生成对象
接下来设计接口,通过一个集合来获取学生的所有信息及对应的教师
public interface StudentMapper { List<Student> getStudent(); }
编写配置文件
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mos3y.Mapper.StudentMapper"> <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 property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap> <select id="getTeacher" resultType="Teacher"> select * from teacher where id=#{tid} </select> </mapper>
首先创建对应接口的查询 查询学生的所有信息,因为返回值的学生对应一个教师对象 所以这里使用resultMap结果集映射
在resultMap中设置Student实体类对应的属性类型 因为多个学生关联一个老师,老师对象就是用association来表示,column是对应教师的tid 来传给下一个查询,通过声明
select="getTeacher"来引用下一个查询
以上主要通过结果集映射来解决
-
根据查询所有的学生信息
-
对于结果集映射 对于普通字段可以通过使用result来解决
但是对于复杂的属性,就需要单独处理 对象使用 association 集合使用connection
property来表示实体类中的对象,clumn表示数据库中的字段,javaType是表示这个字段的java类型,然后通过查询来获取对象的信息