Java mapper.xml中常用的标签详解《一》

目录

Java mapper.xml中常用的标签详解《一》

一、示例代码

二、示例分析

三、Debug测试

四、原因分析

五、mapper.xml中使用 resultMap属性

六、修改后结果

七、resultMap和resultType区别简介

7.1. 对象不同

7.2. 描述不同 

7.3. 类型适用不同

7.4.两者的使用说明 

八、 resultType和parameterType区别简介

8.1.resultType的使用

8.2.parameterType的使用


一、示例代码

 业务层代码如图所示

mapper.xml代码如图所示 

二、示例分析

         当前所用属性为parameterType和resultType,让参数输入输出都为某个实体VO,但是可以看到,数据库里已经查到了数据,但在程序的打印测试中,输出结果全为NULL。

三、Debug测试

                  当前参数VO1已经通过sql,传入mapper文件sql执行结果并没有赋值给List2

实体VO中的赋值断点,被跳过执行

四、原因分析

        造成该现象的原因是:sql所需参数和实体VO中参数不对应。只有当数据库表中的字段名称与实体类中的属性名称完全相同,才能直接使用resultType返回类型,后面跟上该实体类的名称。否则一定需要用resultMap进行属性映射,或者给出现变化的字段起别名,否则得到的数据一直没有匹配的实体类与之对应,返回的结果也自然为空。

五、mapper.xml中使用 resultMap属性

<?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.bypay.dao.OrderInfoDao">

    <resultMap id="resultMap" type="com.bypay.entity.OrderInfo">
        <id column="ORDER_ID" jdbcType="VARCHAR" property="ORDER_ID"/>
        <result column="MER_ID" jdbcType="VARCHAR" property="MER_ID"/>
        <result column="MER_NAME" jdbcType="VARCHAR" property="MER_NAME"/>
        <result column="MER_SYS_ID" jdbcType="VARCHAR" property="MER_SYS_ID"/>
        <result column="MER_ORDER_ID" jdbcType="VARCHAR" property="MER_ORDER_ID"/>
        <result column="ICE_NAME" jdbcType="VARCHAR" property="ICE_NAME"/>
        <result column="ORDER_AMT" jdbcType="VARCHAR" property="ORDER_AMT"/>
        <result column="ORDER_STATUS" jdbcType="VARCHAR" property="ORDER_STATUS"/>
        <result column="ORDER_CODE" jdbcType="VARCHAR" property="ORDER_CODE"/>
        <result column="ORDER_DESC" jdbcType="VARCHAR" property="ORDER_DESC"/>
        <result column="ORDER_DATE" jdbcType="VARCHAR" property="ORDER_DATE"/>
    </resultMap>


    <select id="selectOrderInfo1" resultMap="resultMap"
            parameterType="com.bypay.entity.OrderInfo">
        SELECT ORDER_ID,MER_ID,MER_NAME,MER_SYS_ID,MER_ORDER_ID,ICE_NAME,ORDER_AMT,
        ORDER_STATUS,ORDER_CODE,ORDER_DESC,ORDER_DATE
        FROM order_info_${ny}
        <where>
            <if test="ORDER_STATUS != null and ORDER_STATUS != ''">
                AND ORDER_STATUS = #{ORDER_STATUS}
            </if>
            <if test="ORDER_DATE != null and ORDER_DATE != ''">
                AND ORDER_DATE = #{ORDER_DATE}
            </if>
            <if test="ICE_NAME != null and ICE_NAME != ''">
                AND ICE_NAME = #{ICE_NAME}
            </if>
            <if test="SETTLE_DATE != null and SETTLE_DATE != ''">
                AND SETTLE_DATE = #{SETTLE_DATE}
            </if>
            <if test="time1 != null and time1 != ''">
                AND (ORDER_TIME BETWEEN #{time1} and #{time2})
            </if>
        </where>
    </select>
    
</mapper>

六、修改后结果

Debug,将VO1传入sql进行查询 

 进一步Debug之后,进入实体VO的赋值断点

         经过resultMap之后,数据库中查询到的数据,通过实体VO,赋值给List2。

七、resultMap和resultType区别简介

        resultmap与resulttype的区别为:对象不同、描述不同、类型适用不同 

7.1. 对象不同

        resultmap:resultMap如果查询出来的列名和 pojo(Plain Old Java Object)的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。

        resultType:resultType使用resultType进行输出映射,只有查询出来的列名和VO中的属性名一致,该列才可以映射成功。

7.2. 描述不同 

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

        如果你的查询返回的是一个用户列表,但每个用户还包含地址信息,并且地址是一个单独的对象,你需要将地址的列映射到地址对象的属性上,那么你可以这样使用resultMap:

<resultMap id="userResultMap" type="com.example.User">  
      <id property="id" column="user_id" />  
      <result property="name" column="user_name" />  
      <association property="address" javaType="com.example.Address">  
            <id property="id" column="address_id" />  
            <result property="street" column="street_name" />  
            <!-- 其他地址属性...... -->  
      </association>  
</resultMap>  
 


<select id="selectUsers" resultMap="userResultMap">  
      SELECT u.*, a.id as address_id, a.street_name as street_name FROM USER u  
      LEFT JOIN ADDRESS a ON u.address_id = a.id  
</select>

        在这个例子中,userResultMap定义了一个用户对象,其中包含一个地址对象。<association>元素用于处理这种一对一的关系。

        resulTtype:resultType无法查询结果映射到VO对象的vo属性中,根据对结构集查询遍历的需要选择使用resultType还是resultMap。适用于单表查询。

7.3. 类型适用不同

        resultmap:mybatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap。

        resulttype:resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。

        在MyBatis中,resultType和resultMap不应该在同一个<select>, <insert>, <update>, 或 <delete>标签中同时使用。它们是互斥的,意味着你应该选择其中之一来指定如何映射返回的结果集。如果你同时指定了resultType和resultMap,MyBatis会抛出一个异常,因为它不知道应该使用哪一个来进行结果映射。

7.4.两者的使用说明 

        选择resultType还是resultMap主要取决于你的返回数据结构和映射需求。如果你的数据结构简单且列名和属性名匹配,使用resultType会更简洁。如果你的数据结构复杂,或者需要自定义映射规则,那么使用resultMap会提供更大的灵活性。 

八、resultType和parameterType区别简介

8.1.resultType的使用

        resultType指定sql输出结果类型,总共就两种:

        1、基本数据类型.
        2、实体类VO类型,mybatis将sql查询结果的一行记录数据映射为resultType指定数据类型的对象,如果有多条数据,则分别进行映射,并把对象放到容器List中。因此,即使返回是list数组,resultType也是实体VO类型。

8.2.parameterType的使用

       parameterType指定sql输出结果类型,大体分两种:

        1、基本数据类型:int,string,long,date

        基本数据类型取值:#{value}或者${value}获取参数中的值
        2、复杂数据类型:类和Map

        复杂数据类型取值:#{属性名}或${属性名},map中则是#{key}或 ${key}

        注:但一般不只用${value}进行,因为会造成sql注入。sql注入原理及危害,本文不再介绍。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐