MyBatis Select与ResultMap

Select标签

  1. 单个参数mybatis不会做特殊处理,#{参数名}取出数值

  2. 多个参数mybatis会将其封装成一个map

  • map的key: param1…paramN或者参数的索引(arg0,arg1,…) 通过key可以取出value
  1. 如果明确指定的参数,在接口的方法参数钱增加注解.如下:
Employee findByIdAndName(@Param("id") Integer id, @Param("lastname") String lastName);
  1. 可以直接传递一个map(不经常使用,方便);
//返回map key是属性名 value就是对应的值 进行封装
Employee findByIdAndName(Map<String,Object> map); 
  1. 但有多个数据,同时经常使用,编写一个VO数据传输对象,例如 PageResultBean

  2. 如果是传递的是Collection(List,Set)类型或者是数组会进行特殊处理,封装在map当中。

  • key: Collection(collection),如果是List类型可以使用(list),数组类型使用(array)

  • value: list[0],array[0]….

  • 为了不混乱可以使用@Param注解指定的key值

  • {list[0]} 获取

  1. 如果返回给一个集合,resultType写集合中的元素类型

<select id="findAll" resultType="Employee" parameterType="integer">
    select * from tbl_employee
select>
  1. 返回一条记录的map,key是列名,value是对应的值,resultType使用map(Mybatis已经取了别名)

<select id="findByIdReturnMap" resultType="map">
    select * from tbl_employee where id=#{id}
select>
  1. 返回list类型的map mapList
<select id="findAllEmployeeReturnMap" resultType="map">
       select * from tbl_employee
select>

List<String,Object>> findAllEmployeeReturnMap();
  1. 返回多条记录的map, (key,pojo) key是主键(使用注解在需要的方法上告诉Mybatis封装map时使用什么作为key),value是记录封装后的javaBean,resultType使用map
 // 指定employee的那个属性作为map的key   可选择其他字段
    @MapKey("id")
    Map<String,Employee> findAllReturnMap();

返回多条记录的map xml配置

<select id="findAllReturnMap" resultType="map">
    select * from tbl_employee
select>

resultMap

1.mybatis 结果集映射

  • 1.自动映射 列名和属性名一致
  • 2.开启驼峰命名 满足规则 进行映射
  • 3.resultMap 自定义结果集映射规则

2.resultMap 自定义结果映射规则,

type自定义规则的java类型, id唯一命名方便引用。

定义主键 将指定的主键映射为javaBean属性,底层进行优化,column指定哪一个字段,property指定对应的javaBean属性

定义普通列 column数据库字段,property为javaBean属性。

3.使用resultMap的映射配置

对于没有写入标签的属性与字段会自动封装,但是为了后期检查的方便写了resultMap标签就应当全部写入 。

<resultMap id="empMap" type="Employee">
    <id column="id" property="id">id>
    <result column="last_name" property="lastName">result>
    <result column="gender" property="gender">result>
    <result column="email" property="email">result>
resultMap>

<select id="getEmpById" resultMap="empMap">
    select * from tbl_employee where id=#{id}
select>

4联合查询 级联属性封装结果集

 <resultMap id="EmpAndDept" type="Employee">

        <id column="eid" property="id">id>
        <result column="last_name" property="lastName">result>
        <result column="gender" property="gender">result>
        <result column="email" property="email">result>
     
      
        <result column="did" property="dept.id">result>
        <result column="dept_name" property="dept.departmentName">result>
    resultMap>

5.association属性 级联封装结果集

在多表联查时,association属性可以指定联名的javaBean对象 关联单个对象,property指定对象中需要联名的属性, javaType指定该字段的对象。

 
    <resultMap id="EmpAndDept2" type="Employee">

        <id column="eid" property="id">id>
        <result column="last_name" property="lastName">result>
        <result column="gender" property="gender">result>
        <result column="email" property="email">result>

        <association property="dept" javaType="com.pyc.pojo.Dept">
           <id column="did" property="id">id>
            <result column="dept_name" property="departmentName">result>
        association>
    resultMap>

6.association进行分段查询

说明:1.先按照员工id查询员工信息 2.根据查询员工的d_id值去查询dept信息 3.设置到employee中

  1. association定义关联对象的封装规则

  2. select 表明这个属性是调用select方法查询的结果

  3. column 指定将哪一列的值穿给这个方法

  4. 流程 使用select指定mapper中的方法 (传入column指定的这列参数的值)查出对象,并封装给properties

  5. association内部的id标签是指联名对象数据表的主键,倘若与resultMap的id相同,则为resultMap的id。

 <resultMap id="EmpAndDeptByStep" type="employee">
        <id column="id" property="id">id>
        <result column="last_name" property="lastName">result>
        <result column="gender" property="gender">result>
        <result column="email" property="email">result>

        <association property="dept" select="com.pyc.mapper.DepartmentMapper.getDeptById" column="did">
     association>

    resultMap>

    <select id="getEmpAndDeptByIdStep" resultMap="EmpAndDeptByStep">
        select * from tbl_employee where id=#{id}
    select>
  1. 分段查询支持延迟加载。由于每次查询时都会将所有结果全部查询出来,但希望能够在需要的时候才查询以此节约数据库资源。只需要在分段查询的基础上添加配置。

  2. lazyLoadingEnabled :延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。

  3. aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载。

 
        <setting name="lazyLoadingEnabled" value="true">setting>
        <setting name="aggressiveLazyLoading" value="false">setting>
  1. collection属性

1.定义关联集合类型的属性封装规则,property指定对象的集合属性名称,ofType指定集合内部元素类型,在其内部定义其余字段的规则:

<resultMap id="getDept" type="dept">
    <id column="did" property="id">id>
    <result column="dept_name" property="departmentName">result>

    <collection property="emps" ofType="employee">
        
        <id column="eid" property="id">id>
        <result column="last_name" property="lastName">result>
        <result column="gender" property="gender">result>
        <result column="email" property="email">result>
    collection>
resultMap>


<select id="getDeptByIdPlus" resultMap="getDept">
    SELECT  *,e.id eid
    FROM tbl_dept d LEFT JOIN tbl_employee e
    ON d.`id`=e.`did`
    WHERE d.`id`=#{id}
select>

2.可以使用collection标签完成分段查询

使用column传递多值参数将多列值封装map {k1:v1,k2:v2}

例如 column=“{key1:column1,key2:column2}”

fetchType 可以设置加载情况 优先于全局的配置lazy eager

 <resultMap id="getDeptByStep" type="dept">

        <id column="id" property="id">id>
        <result column="dept_name" property="departmentName">result>
	
     
     
        <collection fetchType="lazy" property="emps" select="com.pyc.mapper.EmployeeMapper.getEmpsByDeptId" column="id">
            <id column="id" property="id">id>
            <result column="last_name" property="lastName">result>
            <result column="gender" property="gender">result>
            <result column="email" property="email">result>
        collection>
    resultMap>

discriminator

通过此标签判断某列的值,然后根据某列的值改变封装行为。例如:若从数据库中查找的logName是Tom就筛选出用户信息,否则不筛选;如果是Jerry,就把orderMess列内容赋值为sum列内容。column确认要判断的列名,javaType确认列的java类型。

  1. discriminator标签常用的2个属性讲解:

    • column:设置要进行鉴别比较值的列名。
    • javaType:指定列的类型,保证使用相同的Java类型来比较值。
  2. discriminator标签可以有1个或多个case标签,case标签包含以下3个属性:

    • value:该值为discriminator标签column属性用来匹配的值。
    • resultMap:当column的值和value的值匹配时,可以配置使用resultMap指定的映射,resultMap优先级高于resultType。
    • resultType:当column的值和value的值匹配时,用于配置使用resultType指定的映射。
    • case标签下面可以包含的标签和resultMap一样,用法也一样。
    用法类似于switch case
    <discriminator column="enabled" javaType="int">
            <case value="1" resultMap="rolePrivilegeListMapSelect"/>
            <case value="0" resultMap="roleMapExtend"/>
    discriminator>
    

你可能感兴趣的:(MyBatis)