映射器的主要元素

元素名称 描述 备注
select 查询语句 可以自定义参数,返回结果集等
insert 插入语句 执行后返回一个整数,代表插入的条数
update 更新语句 执行后返回一个整数,代表更新的条数
delete 删除语句 执行后返回一个整数,代表删除的条数
parameterMap 定义参数映射关系 即将被删除的元素,不建议大家使用
sql 允许定义一部分的SQL,然后在各个地方引用它 例如,一张表列名,我们可以一次定义,在多个SQL语句中使用
resultMap 用来描述从数据库结果集中来加载对象 它将提供映射规则
cache 给定命名空间的缓存配置
insert 其他命名空间缓存配置的引用

本章介绍 select 元素中传递多个参数的处理方式。

测试类:com.yjw.demo.MulParametersTest

使用 Map 传递参数(不建议使用)


使用 MyBatis 提供的 Map 接口作为参数来实现。

StudentDao

  1. /**
  2. * 使用 Map 传递参数
  3. *
  4. * @param params
  5. * @return
  6. */
  7. List<StudentDO> listByMap(Map<String, String> params);

StudentMapper.xml

  1. <!-- 使用 Map 传递参数 -->
  2. <select id="listByMap" parameterType="map" resultMap="BaseResultMap">
  3. select
  4. <include refid="Base_Column_List" />
  5. from t_student
  6. <where>
  7. <if test="ids != null and ids.size() > 0">
  8. AND id IN
  9. <foreach collection="ids" item="item" open="(" close=")" separator=",">
  10. #{item}
  11. </foreach>
  12. </if>
  13. <if test="name != null and name != ''">
  14. AND name LIKE CONCAT('%', #{name}, '%')
  15. </if>
  16. <if test="sex != null">
  17. AND sex = #{sex}
  18. </if>
  19. <if test="selfcardNo != null">
  20. AND selfcard_no = #{selfcardNo}
  21. </if>
  22. </where>
  23. </select>

这个方法虽然简单,但是有一个弊端:这样设置的参数使用 Map,而 Map 需要键值对应,由于业务关联性不强,造成代码可读性低。

使用注解方式传递参数(参数少时可以使用)

使用 MyBatis 的参数注解 @Param(org.apache.ibatis.annotations.Param)来实现想要的功能。

StudentDao

  1. /**
  2. * 使用注解方式传递参数
  3. *
  4. * @param name
  5. * @param sex
  6. * @return
  7. */
  8. List<StudentDO> listByParamAnnotation(@Param("name") String name,
  9. @Param("sex") Sex sex);

StudentMapper.xml

把映射器的 XML 修改为无需定义参数类型。

  1. <!-- 使用注解方式传递参数 -->
  2. <select id="listByParamAnnotation" resultMap="BaseResultMap">
  3. select
  4. <include refid="Base_Column_List" />
  5. from t_student
  6. <where>
  7. <if test="name != null and name != ''">
  8. AND name LIKE CONCAT('%', #{name}, '%')
  9. </if>
  10. <if test="sex != null">
  11. AND sex = #{sex}
  12. </if>
  13. </where>
  14. </select>

当我们把参数传递给后台的时候,通过 @Param 提供的名称 MyBatis 就会知道 #{name} 代表 name参数,参数的可读性大大提高了。但是这回引起另一个麻烦,一条 SQL 拥有 10 个参数的查询,如果我们都使用 @Param 方式,那么参数将十分复杂,可读性依旧不高,不过 MyBatis 为我们提供了 JavaBean 定义参数的方式来解决这个问题。

使用 JavaBean 传递参数

在参数过多的情况下,MyBatis 允许组织一个 JavaBean,通过简单的 setter 和 getter 方法设置参数,这样就可以提高我们的可读性。

首先,定义一个 StudentQuery 的 JavaBean

  1. public class StudentQuery extends PageQuery {
  2. private List<Long> ids;
  3. private String name;
  4. private Byte sex;
  5. private Long selfcardNo;
  6. // get set 方法
  7. }

StudentDao

  1. /**
  2. * 根据条件获取学生信息
  3. *
  4. * @param studentQuery
  5. * @return
  6. */
  7. List<StudentDO> listByConditions(StudentQuery studentQuery);

StudentMapper.xml

  1. <!-- 根据条件获取学生信息-->
  2. <select id="listByConditions" parameterType="studentQuery" resultMap="BaseResultMap">
  3. select
  4. <include refid="Base_Column_List" />
  5. from t_student
  6. <where>
  7. <if test="ids != null and ids.size() > 0">
  8. AND id IN
  9. <foreach collection="ids" item="item" open="(" close=")" separator=",">
  10. #{item}
  11. </foreach>
  12. </if>
  13. <if test="name != null and name != ''">
  14. AND name LIKE CONCAT('%', #{name}, '%')
  15. </if>
  16. <if test="sex != null">
  17. AND sex = #{sex}
  18. </if>
  19. <if test="selfcardNo != null">
  20. AND selfcard_no = #{selfcardNo}
  21. </if>
  22. </where>
  23. </select>

总结

下面对各种方式加以总结,以利于我们在实际操作中的应用。

  • 使用 Map 传递参数。因为 Map 导致业务可读性的丧失,从而导致后续扩展和维护的困难,我们应该在实际的应用中果断废弃这样的传递参数的方式。
  • 使用 @Param 注解传递多个参数,这种方式的使用受到参数个数(n)的影响。当 n<= 5 时,它是最佳的传参方式,它比用 JavaBean 更好,因为它更加直观;当 n>5 时,多个参数将给调用带来困难。
  • 当参数个数多于5个时,建议使用 JavaBean 方式。

作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/gnr77i 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。