多对一和一对多
作者:互联网
多对一查询的实现方式
1.子查询 [SQL简单,映射复杂]
Student 类: int id ;String name; Teacher teacher
Teacher类:int id ; String name;
<!-- 思路1: 1.查询所有的学生 2.根据查询出来的学生的tid,寻找对应的老师 --> <select id="getStudent" resultMap="Student_Teacher"> select * from mybatis.student </select> <resultMap id="Student_Teacher" type="Student"> <!-- 复杂的属性单独处理 对象association 集合collection--> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap> <select id="getTeacher" resultType="Teacher"> select * from mybatis.teacher where id=#{id_sb} </select>
在student表内利用getStudent获取全部的学生 返回类型为Student , 但是因为学生的属性是 ID name 和 teacher对象, 所以返回类型需要使用resultMap加以"扩展", 在里面进行新的关系映射( teacher对象映射为tid字段),并且指定javaType ,然后根据映射的字段,在teacher表内查询(结果赋给student对象的teacher属性)
2.连表查询(推荐) [SQL复杂,映射简单]
直接通过sql语句查询出来,然后映射到属性
<select id="getStudent" resultMap="Student_Teacher"> 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 </select> <resultMap id="Student_Teacher" type="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <association property="teacher" javaType="Teacher"> <result property="name" column="tname"/> <result property="id" column="tid"/> </association> </resultMap>
通过起别名和连表查询在数据库中得到新表α
仍然通过resultMap"扩展", 经过与新表α属性名-字段的关系映射 ,直接获得结果
属性名:JAVA类中的属性名
字段:数据库中的字段
一对多实现
<select id="get_Teacher_students" resultMap="Student_Teacher"> 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=#{id} </select> <resultMap id="Student_Teacher" type="Teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> <collection property="student" ofType="Student" > <result property="name" column="sname"/> <result property="id" column="sid"/> </collection> </resultMap>
数据库
teacher:id name
studnet: id name tid (tid=id)
使用嵌套查询实现:
javaType="ArrayList" :指定实体类中属性的类型 (可省略)
ofType="Student" :指定映射到list或者集合中的类型,泛型中的约束类型()
<select id="get_Teacher_students02" resultMap="Student_Teacher02"> select * from mybatis.teacher where id=#{tid} </select> <resultMap id="Student_Teacher02" type="Teacher"> <collection property="student" javaType="ArrayList" ofType="Student" select="getStudentByteacher" column="id"/> </resultMap> <select id="getStudentByteacher" resultType="Student"> select * from mybatis.student where tid=#{tid_sb} </select>
先select查询到指定ID的老师, 对返回结果进行拓展, 里面的student集合α(通过另外一个select 查询得到)
select :利用colum传递查询的条件id(老师的id) 对学生表的tid字段进行查询,得到符合条件的student集合α
mysql引擎
InnoDB的底层原理
索引
索引优化
标签:name,teacher,mybatis,student,tid,一对,id 来源: https://www.cnblogs.com/liujinmeng/p/16158550.html