MyBatis--resultMap 逃离我推掉我的手 2023-06-07 12:25 10阅读 0赞 # *resultMap:自定义结果集映射规则* # # 1.级联属性封装结果集 # ## 1.1 方式一 ## <mapper namespace="dao.StudentMapper"> <resultMap type="bean.Student" id="MyStudent"> <!-column:指定哪一列,property:指定对应的javaBean属性--> <id column="student_id" property="id"/> <!-- 定义普通列封装规则 --> <result column="student_name" property="studentName"/> <!-- 其他不指定的列会自动封装,建议都写上 --> <result column="sex" property="sex"/> <!--联合查询:级联属性封装结果集--> <result column="school_id" property="school.id"/> <result column="school_name" property="school.schoolName"/> </resultMap> <select id="getStudent" resultMap="MyStudent"> SELECT * FROM student,school WHERE student_id=#{ id} AND student.school_name=school.school_name </select> </mapper> ## 1.2 方式二(association) ## <mapper namespace="dao.StudentMapper"> <resultMap type="bean.Student" id="MyStudent2"> <id column="student_id" property="id"/> <result column="student_name" property="studentName"/> <result column="sex" property="sex"/> <!-- 使用association定义关联的单个对象的封装规则--> <association property="school" javaType="bean.School"> <id column="school_id" property="id"/> <result column="school_name" property="schoolName"/> </association> </resultMap> <select id="getStudent" resultMap="MyStudent2"> SELECT * FROM student,school WHERE student_id=#{ id} AND student.school_name=school.school_name </select> </mapper> # 2.分步查询 # 根据学生的学号查询学校的信息 分步–>1.根据学生学号查询学校姓名 -->2.根据学校姓名查询学校信息 <mapper namespace="dao.StudentMapper"> <resultMap id="MyStudent3" type="bean.Student"> <id column="student_id" property="id"/> <result column="student_name" property="studentName"/> <result column="sex" property="sex"/> <!-- association定义关联对象的封装规则 select:表明当前属性是调用select指定的方法查出的结果 column:指定将哪一列的值传给这个方法 流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性 --> <association property="school" select="dao.SchoolMapper.getSchool" column="school_name"></association> </resultMap> <select id="getStudent2" resultMap="MyStudent3"> SELECT * FROM student WHERE student_id=#{ id} </select> </mapper> # 3.延迟加载 # 延迟加载(懒加载):(按需加载) Student==>School: 查询Student对象的时候,都将一起查询出来。 学校信息在我们使用的时候再去查询; 分段查询的基础之上在mybatis-config.xml加上两个配置: <settings> <!--是否延迟加载 --> <setting name="lazyLoadingEnabled" value="true"/> <!--是否立即全部加载--> <setting name="aggressiveLazyLoading" value="false"/> </settings> # 4.collection标签定义的封装规则 # <!--嵌套结果集的方式,使用collection标签定义关联的集合类型的属性封装规则 --> <resultMap id="MySchool2" type="bean.School"> <id column="school_id" property="id"/> <result column="school.school_name" property="schoolName"/> <!-- collection定义关联集合类型的属性的封装规则 ofType:指定集合里面元素的类型 --> <collection property="students" ofType="bean.Student"> <!-- 定义这个集合中元素的封装规则 --> <id column="student_id" property="id"/> <result column="student_name" property="studentName"/> <result column="sex" property="sex"/> </collection> </resultMap> 扩展:多列的值传递过去: 将多列的值封装map传递; column="{key1=column1,key2=column2}" <association property="school" select="dao.SchoolMapper.getSchool" column="{schoolName=school_name}"></association> fetchType="lazy":表示使用延迟加载; - lazy:延迟 - eager:立即 5.鉴别器(了解) 鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为 <resultMap id="MyStudent4" type="bean.Student"> <id column="student_id" property="id"/> <result column="student_name" property="studentName"/> <!--column:指定判定的列名,javaType:列值对应的java类型 --> <discriminator javaType="string" column="student_name"> <case value="litao" resultType="bean.Student"> <result column="sex" property="studentName"/> </case> </discriminator> </resultMap> 如果查询结果的student\_name是litao则使其sex映射到student\_name
还没有评论,来说两句吧...