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

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注入原理及危害,本文不再介绍。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值