Java mapper.xml中常用的标签详解《二》
Java mapper.xml中常用的标签详解
Java mapper.xml中常用的标签详解《一》
目录
八、 resultType和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)