一、多对一
多对一,顾名思义就在一张数据表里有多个记录,他们有个字段对应对是另一个数据的数据,比如多个学生对应一个老师,直接使用select是不能够把另一个数据表的数据查询出来,这时就要用到多对一的查询方法。
在Mybatis里面,结果映射(resultMap)里的一个子元素association就可以实现多对一
association
– 一个复杂类型的关联;许多结果将包装成这种类型 嵌套结果映射 – 关联本身可以是一个 resultMap元素,或者从别处引用一个
相关属性:
property
:映射到列结果的字段或属性。如果用来匹配的 JavaBean 存在给定名字的属性,那么它将会被使用。否则 MyBatis 将会寻找给定名称的字段。 无论是哪一种情形,你都可以使用通常的点式分隔形式进行复杂属性导航。 比如,你可以这样映射一些简单的东西:“username”,或者映射到一些复杂的东西上:“address.street.number”。
javaType
:一个 Java 类的完全限定名,或一个类型别名(关于内置的类型别名,可以参考上面的表格)。 如果你映射到一个 JavaBean,MyBatis 通常可以推断类型。然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证行为与期望的相一致。
column
:数据库中的列名,或者是列的别名。一般情况下,这和传递给 resultSet.getString(columnName) 方法的参数一样。 注意:在使用复合主键的时候,你可以使用 column="{prop1=col1,prop2=col2}" 这样的语法来指定多个传递给嵌套 Select 查询语句的列名。这会使得 prop1 和 prop2 作为参数对象,被设置为对应嵌套 Select 语句的参数。
select
:用于加载复杂类型属性的映射语句的 ID,它会从 column 属性指定的列中检索数据,作为参数传递给目标 select 语句。 具体请参考下面的例子。注意:在使用复合主键的时候,你可以使用 column="{prop1=col1,prop2=col2}" 这样的语法来指定多个传递给嵌套 Select 查询语句的列名。这会使得 prop1 和 prop2 作为参数对象,被设置为对应嵌套 Select 语句的参数。
1.建立数据表
这里我就建立了一个peo和teacher两个数据表,peo对应的是学生,teacher对应了教师,其中peo中的tid字段对应的就是teacher的id字段,查询时主要就是用到tid来查询teacher数据表的数据
2.编写实体类
在工程里创建一个Peo类和Teacher类,分别对应peo和teacher数据表,注意要在Peo类里创建一个Teacher类来存放查询到的teacher信息
3.编写XML映射文件
我这里是分开了两个xml文件,分别对应的是peo和teacher
peo.mapper.xml
<select id="getPeoTeacher" resultMap="PeoTeacher">
select * from peo
</select>
<resultMap id="PeoTeacher" type="Peo">
<association property="teacher" column="tid" javaType="Teacher" select="entity.TeacherMapper.getTeacher">
</association>
</resultMap>
teacher.mapper.xml
<select id="getTeacher" resultType="Teacher" >
select