Mybatis第三篇:参数解析
Mybatis的参数传递情况分为:一个参数、Map参数、javaBean参数、多个参数、Collection参数、List参数、Array数组参数。
一、一个参数
Dao层的接口方法中传入的参数只有一个,XML文件中的取值变量可以任意写(#{value}可以写任意值)。
<select id="getUserByName" parameterType="string" resultMap="BaseResultMap"> select * from t_user where `name` = #{value} </select>
二、传入Map对象
多个参数时,传递Map对象,以key作为参数名称,value作为参数值。
1、map参数拼接
Map<String, Object> map = new HashMap<>(); map.put("id", 2L); map.put("name", "啦啦啦"); List<TUser> users = userDao.getUserByMap(map);
2、sql获取参数
<select id="getUserByMap" parameterType="map" resultMap="BaseResultMap"> select * from t_user where `id` = #{id} OR `name` = #{name} </select>
三、传入javaBean对象
参数传递依靠javaBean的字段属性来区分。取值与Map集合相似,传参受到javaBean的字段类型类型限制。
1、javaBean对象创建
UserDto dto = UserDto.builder().id(1L).name("啦啦啦").build(); List<TUser> users = userDao.getUserByDtoBean(dto);
2、sql参数获取
<select id="getUserByDtoBean" parameterType="entity.UserDto" resultMap="BaseResultMap"> select * from t_user where `id` = #{id} OR `name` = #{name} </select>
四、多个参数传参
dao层方法需要多个参数时,若是没有使用mybatis的@Param注解,直接调用方法,Mybatis解析XML文件时会将参数名称解析为arg1, arg0..., param1, param2....
这样的参数名,sql的xml文件使用与dao层方法一样的名称是无法解析的。需要在dao层方法上增加@Param注解,指定解析时应该映射成的参数名。
1、dao层接口方法,未加@Param注解
List<TUser> getUserByParams(Long id, String name);
2、sal参数获取
<select id="getUserByParams" resultMap="BaseResultMap"> select * from t_user where `id` = #{id} OR `name` = #{name} </select>
3、执行结果报错
### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter ‘id‘ not found. Available parameters are [arg1, arg0, param1, param2] ### Cause: org.apache.ibatis.binding.BindingException: Parameter ‘id‘ not found. Available parameters are [arg1, arg0, param1, param2]
4、调整dao层的接口方法,增加注解@Param
List<TUser> getUserByParams(@Param("id") Long id, @Param("name") String name);
五、传递List集合
dao层接口中若是没有使用@Param注解,XML文件的sql直接使用list进行判断,若是使用了@Param注解对参数进行命名,要严格按照@Param注解的命名来。
1、dao层方法
List<TUser> getUserByList( List idlist);
2、参数拼接
List<Long> ids = Arrays.asList(1L, 2L); List<TUser> users = userDao.getUserByList(ids);
3、sql参数获取
<select id="getUserByList" parameterType="list" resultMap="BaseResultMap"> select * from t_user where <if test="list != null and list.size() > 0"> `id` IN <foreach collection="list" index="index" close=")" open="(" item="id" separator=","> #{id} </foreach> </if>
六、参数解析的相关源码
。。。。。