基于 XML 配置映射器
配置动态 SQL
处理枚举类型
处理 CLOB/BLOB 类型
传入多个输入参数
缓存
集成 Ehcache
有时候,静态的 SQL 语句并不能满足应用程序的需求。我们可以根据一些条件,来动态地构建 SQL 语句。
例如,在 Web 应用程序中,有可能有一些搜索界面,需要输入一个或多个选项,然后根据这些已选择的条件去执行检索操作。在实现这种类型的搜索功能,我们可能需要根据这些条件来构建动态的 SQL 语句。如果用户提供了任何输入条件,我们需要将那个条件添加到 SQL 语句的 WHERE 子句中。
MyBatis 通过使用
SELECT * FROM COURSES WHERE TUTOR_ID=#{tutorId}
AND NAME LIKE #{courseName}
AND START_DATE >#{startDate}
MyBatis 计算
有时候,所有的查询条件应该是可选的。在需要使用至少一种查询条件的情况下,我们应该使用 WHERE 子句。并且,如果有多个条件,我们需要在条件中添加 AND 或 OR。MyBatis 提供了
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}
这里如果任意一个
SELECT * FROM COURSES
OR TUTOR_ID = #{tutorId}
UPDATE STUDENTS
name=#{name},
email=#{email},
phone=#{phone},
WHERE STUD_ID = #{id}
如果
MyBatis 支持开箱方式持久化 enum 类型属性。假设 STUDENTS 表中有一列 gender 存储 “MALE” 或者 “FEMALE” 两种值。并且,Student 对象有一个 enum 类型的 gender 属性。
默认情况下,MyBatis 使用 EnumTypeHandler 类处理 enum 类型的 Java 属性,并且将其存储为 enum 值的名称。且不需要为此做任何额外的配置,就可以像使用基本数据类型属性一样使用 enum 类型属性。
如果你希望存储原 enum 的顺序位置,而不是 enum 名,则需要明确地配置它。需要在 mybatis-config.xml 文件中配置 EnumOrdinalTypeHandler:
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 配置文件中使用
当加入了
所有的在映射语句文件定义的
也可以通过复写默认属性来自定义缓存的行为:
- eviction:此处定义缓存的移出机制。默认值是 LRU,其可能的值有:LRU(least recently used,最近最少使用),FIFO(first in first out,先进先出),SOFT(soft reference,软引用),WEAK(weak reference,弱引用)。
flushInterval:定义缓存刷新间隔,以毫秒计。默认情况下不设置。所以不使用刷新间隔,缓存 cache 只有调用语句的时候刷新。- size:此表示缓存 cache 中能容纳的最大元素数。默认值是 1024,你可以设置成任意的正整数。
- readOnly:一个只读的缓存 cache 会对所有的调用者返回被缓存对象的同一个实例(实际返回的是被返回对象的一份引用)。一个读/写缓存 cache 将会返回被返回对象的一份拷贝(通过序列化)。默认情况下设置为 false。可能的值有 false 和 true。
默认的映射语句的 cache 配置如下:
官网上提供了一个 MyBatis-ehcache.jar 的包用于整合 ehcache 缓存,文档中还说明需要一个 ehcache-core.jar 的包,除了这两个包之外有几个包也是必须的,官方并没有说明,以下是需要加入的所有和 ehcache 相关的包:
1.ehcache-core-2.4.4.jar
2.mybatis-ehcache-1.0.0.jar
3.slf4j-api-1.6.1.jar
4.slf4j-log4j12-1.6.2.jar
当然也可以直接在 Maven 构建工具中使用
org.mybatis.caches
mybatis-ehcache
1.1.0
新建一个 Ehcache 的配置文件,该文件名必须为 ehcache.xml,放在类路径下面。
Sql mapper 配置文件里面加入以下内容(二选一)
会输出日志
不会输出日志
Ehcache 配置文件示例:http://ehcache.org/ehcache.xml