Mybatis 坑路4 -> 基于 XML 配置映射器2

基于 XML 配置映射器

配置动态 SQL

处理枚举类型

处理 CLOB/BLOB 类型

传入多个输入参数

缓存

集成 Ehcache

配置动态 SQL

  有时候,静态的 SQL 语句并不能满足应用程序的需求。我们可以根据一些条件,来动态地构建 SQL 语句。
  例如,在 Web 应用程序中,有可能有一些搜索界面,需要输入一个或多个选项,然后根据这些已选择的条件去执行检索操作。在实现这种类型的搜索功能,我们可能需要根据这些条件来构建动态的 SQL 语句。如果用户提供了任何输入条件,我们需要将那个条件添加到 SQL 语句的 WHERE 子句中。
  MyBatis 通过使用元素提供了对构造动态 SQL 语句的高级别支持。
  元素被用来有条件地嵌入 SQL 片段,如果测试条件被复制为 true。则相应的 SQL 片段将会被添加到 SQL 语句中。

SELECT * FROM COURSES WHERE TUTOR_ID=#{tutorId}

	AND NAME LIKE #{courseName}


	AND START_DATE >#{startDate}


	



  MyBatis 计算 测试条件的值,且使用第一个值为 TRUE 的子句。如果没有条件为 true,则使用内的子句。
  有时候,所有的查询条件应该是可选的。在需要使用至少一种查询条件的情况下,我们应该使用 WHERE 子句。并且,如果有多个条件,我们需要在条件中添加 AND 或 OR。MyBatis 提供了元素支持这种类型的动态 SQL 语句。

SELECT * FROM COURSES

	
		AND TUTOR_ID = #{tutorId}
	
	
		AND NAME LIKE #{courseName}
	
	
		AND START_DATE >= #{startDate}
	

  元素和元素类似,但是提供了在添加前缀/后缀或者移出前缀/后缀方面提供更大的灵活性。

SELECT * FROM COURSES

	
		TUTOR_ID = #{tutorId}
	
	
		AND NAME LIKE #{courseName}
	

  这里如果任意一个条件为 true,元素会插入 WHERE,并且移出紧跟 WHERE 后面的 AND 或者 OR
可以迭代遍历一个数组或者列表,构造 AND/OR 条件或一个 IN 子句。

SELECT * FROM COURSES

	
		
			OR TUTOR_ID = #{tutorId}
		
	

  元素和元素类似,如果其内部条件判断有任何内容返回时,他会插入 SET SQL 片段

UPDATE STUDENTS

	name=#{name},
	email=#{email},
	phone=#{phone},

WHERE STUD_ID = #{id}

  如果条件返回了任何文本内容,将会插入 set 关键字和其文本内容,并且会剔除末尾的“,”

处理枚举类型

  MyBatis 支持开箱方式持久化 enum 类型属性。假设 STUDENTS 表中有一列 gender 存储 “MALE” 或者 “FEMALE” 两种值。并且,Student 对象有一个 enum 类型的 gender 属性。
  默认情况下,MyBatis 使用 EnumTypeHandler 类处理 enum 类型的 Java 属性,并且将其存储为 enum 值的名称。且不需要为此做任何额外的配置,就可以像使用基本数据类型属性一样使用 enum 类型属性。
  如果你希望存储原 enum 的顺序位置,而不是 enum 名,则需要明确地配置它。需要在 mybatis-config.xml 文件中配置 EnumOrdinalTypeHandler:


处理 CLOB/BLOB 类型

  MyBatis 提供了内建的对 CLOB/BLOB 类型列的映射处理支持。默认情况下,MyBatis 将 CLOB 类型的列映射到 java.lang.String 类型上、而把 BLOB 列映射到 byte[] 类型上。

####传入多个输入参数
  MyBatis 中的映射语句有一个 parameterType 属性来制定输入参数的类型。如果我们想给映射语句传入多个参数的话,可以将所有的输入参数放到 HashMap 中,将 HashMap 传递给映射语句。
  MyBatis 还提供了另外一种传递多个输入参数给映射语句的方法。假设我们想通过给定的 name 和 email 信息查找学生信息,定义查询接口如下:

List findAllStudentByNameAndEmail(String name,String email);


  这里的 #{param1} 引用第一个参数 name,而 #{param2} 引用了第二个参数 email。

  MyBatis 还提供了一种传递多个输入参数给映射语句的方法。是通过使用 @Param 注解:

List findAllStudentByNameAndEmail(@Param("name")String name,@Param("email")String email);


缓存

  将从数据库中加载的数据缓存到内存中,是很多应用程序为了提高性能而采取的一贯做法。MyBatis 对通过映射的 SELECT 语句加载的查询结果提供了内建的缓存支持。默认情况下,启用一级缓存:即,一级缓存基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 SqlSession,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清除。
  我们可以在 SQL 映射器 XML 配置文件中使用 元素添加全局二级缓存。其存储作用域为 Mapper(Namespace)。
  当加入了元素,将会出现以下情况:

所有的在映射语句文件定义的