MyBatis:ResultMap实现高级结果集映射

  • 取值时,#{}取出的sql语句中相对应的位置为占位符?,而${}则将值填入。

    • {}通过预编译的方式,将参数设置到sql语句中。可以方式sql注入。

    • ${}取出的值直接拼接在sql语句中。
    • 大部分情况,使用#{}。
    • 在原生jdbc不支持占位符的情况下,使用${}
  • javaType:通常需要在某些特定环境下被设置。

    • 某些不支持null值的数据库,如Oracle

    • 在传值的时候注明jdbcType=NULL

      #{email,jdbcType=null}
      
    • 也可以在全局配置文件中将jdbcTypeForNull修改为NULL

  • 查询时,如果返回值类型为list则在映射文件中配置时设置返回值时,设置list集合中元素的类型。

  • 查询某一条记录的map时,在映射文件中配置时设置返回值时,设置为Map。

    • Key为列名,Value为所对应的值
  • 查询多条记录并封装成Map时,如需指定key则需要通过注解来设置。

    @MapKey("id")
    

ResultMap实现高级结果集映射

  • ResultMap可以自定义结果集映射规则。
  • ResultMap和ResultType只能使用一个
  • 为数据库里的每一个数据添加一个类的属性进行映射。并将id(唯一标识)给这个select标签上的resultMap
<resultMap id="MyGuild" type="com.boerk.mybatis.pojo.Guild">
   <id column="guild_id" property="guildID"></id>
   <result column="guild_name" property="guildName"></result>
   <result column="guild_pwd" property="guildPwd"></result>
   <result column="guild_job" property="guildJob"></result>
   <result column="guild_belief" property="guildBelief"></result>
   <result column="guild_influence" property="guildInfluence"></result>
   <result column="guild_specialty" property="guildSpecialty"></result>
   <result column="guild_level" property="guildLevel"></result>
</resultMap>
<select id="getGuildId" resultMap="MyGuild">
  • 联合查询时,可以使用级联属性封装结果集。

    • 某一个实体类是另一个实体类的一条属性时。

    • 举例:deptNO和deptName是dept对象的属性,dept对象是emp的一条属性。因此封装时

      <result column="dept_name" property="dept.deptName"/>
      
    • 或者直接使用association标签:可以指定联合的javabean对象。(定义在resultMap内侧)

      <!--property="dept":指定哪一个是联合对象
      	javaType="com.boerk.batis.pojo.Dept":指定联合对象的类型。
      -->
      <association property="dept" javaType="com.boerk.batis.pojo.Dept"></association>
      
    • 可以通过association标签进行分步式的查询

      <!--select="xx.xx"表明当前属性是调用select指定的方法查出的结果
      	column="d.id":指定将哪一列的值传给这个方法-->
      <association property="dept" select="xxx.xx" column="d.id"></association>
      
    • 可以通过在全局配置中配置lazyLoadingEnabled=true以及aggressiveLazyLoading=false来达成延迟加载,只有在需要的时候才会执行sql来节省资源。

    • 使用clooection标签来定义关联集合类型的属性的封装规则。

      <resultMap id="hello" type="com.boerk.mybatis.pojo.Department">
          <id column="department_id" property="departmentId"></id>
          <result column="department_name" property="departmentName"></result>
          <collection property="list" ofType="com.boerk.mybatis.pojo.Employee">
               <id column="employee_id" property="employeeId"></id>
               <result column="last_name" property="lastName"></result>
               <result column="email" property="email"></result>
          </collection>
      </resultMap>
      
    • discriminator:鉴别器。mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装的行为

      • column:根据这一类的值来判断
      • javaType:这一类的类型
      • 通过改变value里的值进行判断(类似switch)
posted @ 2022-01-09 23:09  Boerk  阅读(117)  评论(0)    收藏  举报