IllegalArgumentException异常产生原因及解决方案
01 异常发生场景
- 当我在使用mybatis执行MySQL语法时出现的bug
<!--mybatis的映射-->
<resultMap id="OrdersVoResult" type="OrdersVo">
<!-- id配置的是主键,就是表的主键 -->
<!-- property是实体类的属性名 -->
<!-- cloumn是sql查询出来的字段名 -->
<id property="orderId" column="order_id"></id>
<!-- result是其他的字段 -->
<result property="orderNum" column="order_num"></result>
<result property="orderTime" column="order_time"></result>
<collection property="products" javaType="ordersDtlVo">
<id property="orderDtlId" column="order_dtl_id"></id>
<result property="productId" column="product_id"></result>
<result property="productName" column="product_name"></result>
<result property="productSellingPrice" column="product_selling_price"></result>
<result property="num" column="num"></result>
<result property="productPicture" column="product_picture"></result>
</collection>
</resultMap>
<select id="selectOrders" resultMap="OrdersVoResult">
SELECT
t1.order_id,
t1.create_time,
t1.order_num,
t2.order_dtl_id,
t2.product_id,
t2.product_name,
t2.product_selling_price,
t2.num,
t2.product_price
FROM
orders AS t1
left JOIN
orders_dtl AS t2
ON t1.order_id = t2.order_id
WHERE
t1.user_id = #{userId}
</select>
02 异常的产生原因
-
在数据库里SQL语句的执行是没有问题的
-
经过查询百度,发现是非法传参异常,也就是参数传的类型冲突,但是我前前后后对了好几次参数,确定了实体类参数对应没有问题
-
那么问题出在哪里呢?经过查询mybatis3的官方文档,我找到了问题的所在
-
javaType
一个 Java 类的全限定名,或一个类型别名(关于内置的类型别名,可以参考上面的表格)。 如果你映射到一个 JavaBean,MyBatis 通常可以推断类型 ofType
也是一个 Java 类的全限定名,但映射对应的参数是数组 -
我的实体类
public class OrdersVo { private Long orderId; private String orderNum; private Date orderTime; private List<OrdersDtlVo> products; }
-
很明显可以看出其中一个参数是list集合,但我简单的使用
javaType
设置路径,所以才造成了IllegalArgumentException(参数映射问题)
03 解决方式
-
很简单,在映射集合时,使用
ofType
映射对应的参数即可 -
修改后的mybtais映射
-
<resultMap id="OrdersVoResult" type="OrdersVo"> <!-- id配置的是主键,就是表的主键 --> <!-- property是实体类的属性名 --> <!-- cloumn是sql查询出来的字段名 --> <id property="orderId" column="order_id"></id> <!-- result是其他的字段 --> <result property="orderNum" column="order_num"></result> <result property="orderTime" column="order_time"></result> <collection property="products" ofType="ordersDtlVo"> <id property="orderDtlId" column="order_dtl_id"></id> <result property="productId" column="product_id"></result> <result property="productName" column="product_name"></result> <result property="productSellingPrice" column="product_selling_price"></result> <result property="num" column="num"></result> <result property="productPicture" column="product_picture"></result> </collection> </resultMap> <select id="selectOrders" resultMap="OrdersVoResult"> SELECT t1.order_id, t1.create_time, t1.order_num, t2.order_dtl_id, t2.product_id, t2.product_name, t2.product_selling_price, t2.num, t2.product_price FROM orders AS t1 left JOIN orders_dtl AS t2 ON t1.order_id = t2.order_id WHERE t1.user_id = #{userId} </select>