详谈parameterType与resultType的用法

Posted 童小纯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详谈parameterType与resultType的用法相关的知识,希望对你有一定的参考价值。

resultMap      


    表示查询结果集与java对象之间的一种关系,处理查询结果集,映射到java对象。     

       resultMap 是一种“查询结果集---Bean对象”属性名称映射关系,使用resultMap关系可将将查询结果集中的列一一映射到bean对象的各个属性(两者属性名可以不同,配置好映射关系即可),适用与复杂一点的查询。

(1)适用于表的连接查询(在resultMap里面可以配置连接条件,见如下程序association标签)
 

<!-- 订单查询关联用户的resultMap将整个查询的结果映射到cn.itcast.mybatis.po.Orders中   -->  
    <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>

2)适用于表的一对多连接查询,(如,订单对应多个订单明细时,需要根据连接条件订单id匹配订单明细,并且消除重复的订单信息(订单明细中的),如下程序);

<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> 

(3)映射的查询结果集中的列标签可以根据需要灵活变化,并且,在映射关系中,还可以通过typeHandler设置实现查询结果值的类型转换,比如布尔型与0/1的类型转换。

例如:

<resultMap type="hdu.terence.bean.Message" id="MessageResult"> 
    <!--存放Dao值--><!--type是和数据库对应的bean类名Message-->
    <id column="id" jdbcType="INTEGER"property=" id"/><!--主键标签-->
    <result column="COMMAND" jdbcType="VARCHAR" property="command"/>
    <result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
    <result column="CONTENT" jdbcType="VARCHAR" property="content"/>
  </resultMap> 
 
  <select id="queryMessageList" parameterType="hdu.terence.bean.Message" resultMap="MessageResult">
    SELECTID,COMMAND,DESCRIPTION,CONTENT FROM message WHERE 1=1    
    <if test="command!=null and!&quot;&quot;.equals(command.trim())">
    and COMMAND=#command
    </if>
    <if test="description!=null and!&quot;&quot;.equals(description.trim())">
    and DESCRIPTION like '%' #description '%'
    </if> 
  </select>

resultType

resultType 是一种“查询结果集---Bean对象”数据类型映射关系,使用resultType关系,即可使Bean对象接收查询结果集;见名知意,该方法是通过查询结果集中每条记录(属性)的数据类型和Bean对象的数据类型作映射,若两者都相同,则表示匹配成功,Bean可以接收到查询结果。

   但是本方法有局限性,要求Bean对象字段名和查询结果集的属性名相同(可以大小写不同,大小写不敏感)。因为这个局限性,可以省略调resultMap进行属性名映射。

    一般适用于pojo(简单对象)类型数据,简单的单表查询。

   以下是resultType的写法,将其值设置成对应的java类上即可。不需要上述resultMap的映射关系。

<select resultType="User" id="findAll">select *from user </select>
<select resultType="com.itxiaotong.pojo.User" id="findById" parameterType="int">select *from user where id = #userId </select>
<select resultType="com.itxiaotong.pojo.User" id="findByUsernameLike" parameterType="string">
<bind value="'%'+username+'%'" name="likeName"/>
select * from user where username like #likeName 
</select>
<select resultType="com.itxiaotong.pojo.User" id="findPage">select * from user limit #param1,#param2 </select>

<select resultType="com.itxiaotong.pojo.User" id="findPage1">select * from user limit #startIndex,#pageSize </select>
<select resultType="User" id="findPage2" parameterType="PageQuery">select * from user limit #startIndex,#pageSize </select>

其中parameterType="PageQuery"的类是,下列内容

PageQuery.java

package com.itxiaotong.pojo;

public class PageQuery 
    private int startIndex;
    private int pageSize;

    public PageQuery() 
    

    public PageQuery(int startIndex, int pageSize) 
        this.startIndex = startIndex;
        this.pageSize = pageSize;
    

    public int getStartIndex() 
        return startIndex;
    

    public void setStartIndex(int startIndex) 
        this.startIndex = startIndex;
    

    public int getPageSize() 
        return pageSize;
    

    public void setPageSize(int pageSize) 
        this.pageSize = pageSize;
    
<select resultType="com.itxiaotong.pojo.User" id="findPage3" parameterType="map">select * from user limit #startIndex,#pageSize </select>

<select resultType="int" id="findCount">select count(id) from user </select>

parameterType

在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了
parameterType的用法,parameterType为输入参数,在配置的时候,配置相应的
输入参数类型即可。parameterType有基本数据类型和复杂的数据类型配置。
1.基本数据类型,如输入参数只有一个,其数据类型可以是基本的数据类型,也可以是
自己定的类类型。包括int,String,Integer,Date,如下:

(1)根据id进行相应的删除:

(2)添加员工:

2.复杂数据类型:包含java实体类,map。


parameterType例子(一)

 现在有一个Mapper配置文件,以下是片段:

 <select id="queryCommandListByPage" resultMap="CommandResult" >
      select <include refid="columns"/> from command a left join command_content b 
    on a.id=b.command_id
      <where>
          <if test="command.name != null and !"".equals(command.name.trim())">
            and a.name=#command.name
        </if>
        <if test="command.description != null and !"".equals(command.description.trim())">
            and a.description like '%' #command.description '%'
        </if>
      </where>
      <if test="flag==1">
        group by aid
    </if>
      order by id
  </select>
  <sql  id="columns">
      a.id aid,a.name,a.description,b.content,b.id,b.command_id
  </sql>

下面是IService接口:

 /**
     * 拦截器实现分页
     */
    public List<command> queryCommandListByPage(Map<String,Object>parameter);

parameterType例子(二)

<insert id="add" parameterType="com.itxiaotong.pojo.User">insert into user(username, sex, address)values (#username, #sex, #address) </insert>
<update id="update" parameterType="com.itxiaotong.pojo.User">update user set username = #username,sex = #sex,address=#address where id = #id </update>
<delete id="delete" parameterType="int">delete from user where id = #id </delete>
<insert id="add2" parameterType="com.itxiaotong.pojo.User">

     <!-- keyProperty:主键属性名 keyColumn:主键列名 resultType:主键类型 order:执行时机 -->

     <selectKey resultType="int" order="AFTER" keyColumn="id" keyProperty="id">SELECT LAST_INSERT_ID(); </selectKey>
insert into user(username, sex, address)values (#username, #sex, #address) 
</insert>
<select resultType="com.itxiaotong.pojo.User" id="findPage3" parameterType="map">select * from user limit #startIndex,#pageSize </select>

mybatis类型别名

在mybatis中,statement的parameterType指定了输入参数的类型,resultType指定了输出结果的映射类型
可以针对parameterType或resultType中指定的类型,在<typeAliases>中定义别名,然后在parameterType或resultType中使用定义的别名


1:单个别名定义
1):定义别名

<!--
type:类型全限定名
alias:别名
-->
<typeAlias type="org.pine.mybatis.po.User" alias="user"/>

2):使用别名
可以在parameterType或resultType中引用 1)中 已定义的别名

<!-- 根据id查询用户 -->
<select id="queryUserById" parameterType="java.lang.Integer" resultType="user">
select t.id,t.username,t.birthday,t.sex,t.address
from user t
where t.id =#{id}
</select>


2:批量别名定义
1):定义别名

<!--
name:指定 包名
mybatis会自动扫描 包名 下的Java类,自动定义别名。注意:别名就是类名(首字母大写或小写都可以)
-->
<package name="org.pine.mybatis.po"/>

2):使用别名
可以在parameterType或resultType中引用 1)中 已定义的别名

<!-- 根据id查询用户 --> <!-- resultType="User"或者resultType="user"都可以 -->
<select id="queryUserById" parameterType="java.lang.Integer" resultType="user">
select t.id,t.username,t.birthday,t.sex,t.address
from user t
where t.id =#{id}
</select>


























以上是关于详谈parameterType与resultType的用法的主要内容,如果未能解决你的问题,请参考以下文章

parameterType 和 resultType

mybatis 之resultType="HashMap" parameterType="list"

resultmap与resulttype有啥区别

mybatis类型别名

Mybatis映射器

mybatis 中 映射文件 不写 resultType和parameterType,直接在 dao层 方法中写上参数和返回值 就可以?