resultType 与 parameterType 的基本使用的区别 :
1、使用 resultType : 主要针对于从数据库中提取相应的数据出来

2、使用parameterType : 主要针对于 将信息存入到数据库中 如: insert 增加数据到数据库中 Update等

resultType是sql语句查询结果集的封装类型,也就是说把sql查询的结果封装在bean里返回回去,是存数据用的。 paramType是从传过来的Bean中取数据放进例如insert语句的values中当实参用,是取数据用的。
MyBatis中 resultTyperesultMap 的区别
resultTyperesultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些 ,可自定义。因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来,但是,resultType就比较鸡肋了,必须字段名一样,比如说 cId和c_id 这种的都不能映射 。下面介绍几个常用的映射关系:

1.单表查询: resultMap:当使用resultMap做SQL语句返回结果类型处理时,通常需要在mapper.xml中定义resultMap进行pojo和相应表字段的对应。
 

<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">
    <!-- 配置映射的订单信息 -->
    <!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id
        column:订单信息的唯 一标识 列
        property:订单信息的唯 一标识 列所映射到Orders中哪个属性
      -->
    <id column="id" property="id"/>
    <result column="user_id" property="userId"/>
    <result column="number" property="number"/>
    <result column="createtime" property="createtime"/>
    <result column="note" property="note"/>        
</resultMap>

2.关联查询(一对一):resultMap对于一对一表连接的处理方式通常为在主表的pojo中添加嵌套另一个表的pojo,然后在mapper.xml中采用association节点元素进行对另一个表的连接处理。例如

<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">
    <!-- 配置映射的订单信息 -->
    <!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id
        column:订单信息的唯 一标识 列
        property:订单信息的唯 一标识 列所映射到Orders中哪个属性
      -->
    <id column="id" property="id"/>
    <result column="user_id" property="userId"/>
    <result column="number" property="number"/>
    <result column="createtime" property="createtime"/>
    <result column="note" property=note/>
    
    <!-- 配置映射的关联的用户信息 -->
    <!-- association:用于映射关联查询单个对象的信息
    property:要将关联查询的用户信息映射到Orders中哪个属性
     -->
    <association property="user"  javaType="cn.itcast.mybatis.po.User">
        <!-- id:关联查询用户的唯 一标识
        column:指定唯 一标识用户信息的列
        javaType:映射到user的哪个属性
         -->
        <id column="user_id" property="id"/>
        <result column="username" property="username"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
    
    </association>
</resultMap>

3.关联查询(一对多):resultMap的处理方式为在订单表数据的pojo中添加一个list,list中为订单明细表的属性,在mapper.xml中采用如下的处理方式:

订单及订单明细的resultMap 使用extends继承,不用在中配置订单信息和用户信息的映射

<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">
	 <!- 订单信息 -->
    <!- 用户信息 -->
    <!- 使用extends继承,不用在中配置订单信息和用户信息的映射 -->
    <!- 订单明细信息
    一个订单关联查询出了多条明细,要使用collection进行映射
    collection:对关联查询到多条记录映射到集合对象中
    property:将关联查询到多条记录映射到cn.itcast.mybatis.po.Orders哪个属性
    ofType:指定映射到list集合属性中pojo的类型
     -->
     <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
         <!-- id:订单明细唯 一标识
         property:要将订单明细的唯 一标识 映射到cn.itcast.mybatis.po.Orderdetail的哪个属性
           -->
         <id column="orderdetail_id" property="id"/>
         <result column="items_id" property="itemsId"/>
         <result column="items_num" property="itemsNum"/>
         <result column="orders_id" property="ordersId"/>
     </collection>
    

</resultMap>

样例 student表(增删改查)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qcby.dao.StudentMapper">
  <resultMap id="BaseResultMap" type="com.qcby.entity.Student">
    <id column="Sid" jdbcType="INTEGER" property="sid" />
    <result column="Snum" jdbcType="VARCHAR" property="snum" />
    <result column="Spassword" jdbcType="VARCHAR" property="spassword" />
    <result column="Sname" jdbcType="VARCHAR" property="sname" />
    <result column="Ssex" jdbcType="VARCHAR" property="ssex" />
    <result column="Sgrade" jdbcType="VARCHAR" property="sgrade" />
    <result column="Smajor" jdbcType="VARCHAR" property="smajor" />
  </resultMap>
  <sql id="Base_Column_List">
    Sid, Snum, Spassword, Sname, Ssex, Sgrade, Smajor
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from student
    where Sid = #{sid,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from student
    where Sid = #{sid,jdbcType=INTEGER}
  </delete>
  <insert id="insert" parameterType="com.qcby.entity.Student">
    insert into student (Sid, Snum, Spassword,
      Sname, Ssex, Sgrade, 
      Smajor)
    values (#{sid,jdbcType=INTEGER}, #{snum,jdbcType=VARCHAR}, #{spassword,jdbcType=VARCHAR}, 
      #{sname,jdbcType=VARCHAR}, #{ssex,jdbcType=VARCHAR}, #{sgrade,jdbcType=VARCHAR}, 
      #{smajor,jdbcType=VARCHAR})
  </insert>
  <insert id="insertSelective" parameterType="com.qcby.entity.Student">
    insert into student
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="sid != null">
        Sid,
      </if>
      <if test="snum != null">
        Snum,
      </if>
      <if test="spassword != null">
        Spassword,
      </if>
      <if test="sname != null">
        Sname,
      </if>
      <if test="ssex != null">
        Ssex,
      </if>
      <if test="sgrade != null">
        Sgrade,
      </if>
      <if test="smajor != null">
        Smajor,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="sid != null">
        #{sid,jdbcType=INTEGER},
      </if>
      <if test="snum != null">
        #{snum,jdbcType=VARCHAR},
      </if>
      <if test="spassword != null">
        #{spassword,jdbcType=VARCHAR},
      </if>
      <if test="sname != null">
        #{sname,jdbcType=VARCHAR},
      </if>
      <if test="ssex != null">
        #{ssex,jdbcType=VARCHAR},
      </if>
      <if test="sgrade != null">
        #{sgrade,jdbcType=VARCHAR},
      </if>
      <if test="smajor != null">
        #{smajor,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.qcby.entity.Student">
    update student
    <set>
      <if test="snum != null">
        Snum = #{snum,jdbcType=VARCHAR},
      </if>
      <if test="spassword != null">
        Spassword = #{spassword,jdbcType=VARCHAR},
      </if>
      <if test="sname != null">
        Sname = #{sname,jdbcType=VARCHAR},
      </if>
      <if test="ssex != null">
        Ssex = #{ssex,jdbcType=VARCHAR},
      </if>
      <if test="sgrade != null">
        Sgrade = #{sgrade,jdbcType=VARCHAR},
      </if>
      <if test="smajor != null">
        Smajor = #{smajor,jdbcType=VARCHAR},
      </if>
    </set>
    where Sid = #{sid,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.qcby.entity.Student">
    update student
    set Snum = #{snum,jdbcType=VARCHAR},
      Spassword = #{spassword,jdbcType=VARCHAR},
      Sname = #{sname,jdbcType=VARCHAR},
      Ssex = #{ssex,jdbcType=VARCHAR},
      Sgrade = #{sgrade,jdbcType=VARCHAR},
      Smajor = #{smajor,jdbcType=VARCHAR}
    where Sid = #{sid,jdbcType=INTEGER}
  </update>


  <select id="stushow"  resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from student
  </select>

  <select id="selectStuBySnum" parameterType="java.lang.String" resultType="com.qcby.entity.Student">
    select
    <include refid="Base_Column_List" />
    from student
    where Snum = #{Snum,jdbcType=VARCHAR}
  </select>
  <select id="selectStuLogin" parameterType="com.qcby.entity.Student" resultType="com.qcby.entity.Student">
    select
    <include refid="Base_Column_List" />
    from student
    where Snum = #{snum,jdbcType=VARCHAR}
    AND Spassword = #{spassword,jdbcType=VARCHAR}
  </select>
</mapper>

注:什么时候必须加上 jdbcType
在 coding 的时候,有时候会发现,比如在 User.xml 中,不管是用 userId = #{userId} 还是 userId = #{userId, jdbcType = Integer},都没有问题。但是什么时候必须要加上 jdbcType 呢?

Mybatis 的官方文档是这样描述 jdbcType 的 :
The JDBC Type from the list of supported types that follows this table. The JDBC type is only required for nullable columns upon insert, update or delete. This is a JDBC requirement, not a MyBatis one. So even if you were coding JDBC directly, you’d need to specify this type – but only for nullable values.

意思是说,只有当将一个空值作用于插入、更新、删除操作时,jdbcType 才是必须的。这是 JDBC 的一个需求,并不是 MyBatis 的。所以即使你是直接编写 JDBC,当它是空的时候,你也一定要指定它的类型,其他情况不需要指定它的类型。

就是说,在大部分时候,我们不需要指定 jdbcType,因为 MyBatis 足够智能地可以辨别出对象的类型。但是如果你传过来的参数是一个 HashMap,其中一个参数是空的,MyBatis 将不能通过 HashMap 来决定对象的类型。因为 HashMap 是一个通用的容器并且如果它本身是空的话,将不会携带任何的类型信息。所以最好的做法是,当值是空的时候去指定它的 jdbcType,这样在之后转换为 db 实现的时候就不会再引起任何问题了。

jdbcType 和 javaType 的对应关系

java 通用工具Result类 java resulttype_mybatis

 

java 通用工具Result类 java resulttype_bc_02