MyBatis基于xml的一对一、一对多及注意事项

    技术2022-07-11  123

    代码示例

    /** * 教师类 */ public class Teacher { //教师编码 private String tId; //职称 private String rank; //个人基本信息 private BasicInfo basicInfo; //所教学生 private List<Student> studentList; //get set } /** * 教师个人基本信息 */ public class BasicInfo { //姓名 private String tName; //年龄 private String tAge; //get set } /** * 学生 */ public class Student { //姓名 private String SName; //年龄 private String SAge; //get set } <mapper> <resultMap id="TeacherMap" type="Teacher(实体类)"> <id property="tId(POJO对象主键属性)" column="TID(表字段)" jdbcType="VARCHAR"/> <reslut property="rank" column="RANK" jdbcType="VARCHAR"/> <!--一对一教师个人基本信息实体映射--> <association property="basicInfo" javaType="BasicInfo(实体类)" resultMap="basicInfoMap"/> <!--一对多--> <collection property="studentList" ofType="Student(实体类)" resultMap="studentList"/> </resultMap> <resultMap id="basicInfoMap" type="BasicInfo(实体类)"> <reslut property="tName" column="TNAME" jdbcType="VARCHAR"/> <reslut property="tAge" column="TAGE" jdbcType="VARCHAR"/> </resultMap> <resultMap id="studentList" type="Student(实体类)"> <reslut property="SName" column="SNAME" jdbcType="VARCHAR"/> <reslut property="SAge" column="SAGE" jdbcType="VARCHAR"/> </resultMap> <select id="getTeacherInfo" resultMap="TeacherMap(返回值为映射的对象)" parameterType="java.util.Map"> </select> </mapper>

    注意事项

    一、MyBatis的resultMap只用于配置结果如何映射,id的唯一作用就是在嵌套的映射配置时判断数据是否相同,当配置id标签时,MyBatis只需要逐条比较所有数据中id标签字段值是否相同即可,可以提高处理效率。 1、id标签也可以配置多个,比如联合主键时。 2、很可能也会出现没有配置id的情况,这时MyBatis就会把resultMap中所有字段进行比较,如果所有字段的值都相同就合并,只要有一个字段值不同,就不合并。这时,当结果集字段数为M,记录数N,最少M×N次比较,相比配置id时的N次比较,效率相差更多,所以要尽可能配置id标签。 3、在嵌套结果配置id属性时如果查询语句中没有查询id属性配置的列,就会导致id对应的值为null。这种情况下,所有值的id都相同,因此会使嵌套的集合中只有一条数据。所以在配置id列时,查询语句中必须包含该列。

    二、collection 支持的属性以及属性的作用和association 完全相同。虽然association和collection标签是分开介绍的,但是这两者可以组合使用或者互相嵌套使用,也可以使用符合自己需要的任何数据结构,不需要局限于数据库表之间的关联关系。

    Processed: 0.012, SQL: 9