MyBatis的学习之路(一)
在学习MyBatis之前,让我们先了解一下什么是MyBatis呢?
MyBatis和Hibernate一样都是基于ORM(对象关系映射)思想的实现数据操作的持久层框架。Mybatis和Hibernate相比,具有轻量,系统开销小;配置简单,学习成本低(想想Hibernate的配置);能够自定义查询结果等优点。
一、MyBatis的配置文件详解
首先来看一个简单的实例:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!--指定属性--> 7 <properties resource="jdbc.properties"/> 8 <property name="driver" value="com.mysql.jdbc.Driver"/> 9 <property name="url" value="jdbc:mysql://localhost:3306/test"/> 10 </properties> 11 <!--系统设置--> 12 <settings> 13 <setting name="cacheEnabled" value="true"/> 14 <setting name="lazyLoadingEnabled" value="true"/> 15 </settings> 16 <!--指定简写名--> 17 <typeAliases> 18 <package name="yitian.study.entity"/> 19 </typeAliases> 20 <!--配置环境,可以配置多个环境用于测试、调试和生产--> 21 <environments default="development"> 22 <environment id="development"> 23 <transactionManager type="JDBC"/> 24 <dataSource type="POOLED"> 25 <property name="driver" value="${driver}"/> 26 <property name="url" value="${url}"/> 27 <property name="username" value="${username}"/> 28 <property name="password" value="${password}"/> 29 </dataSource> 30 </environment> 31 </environments> 32 <!--配置映射文件--> 33 <mappers> 34 <mapper resource="EntityMapper.xml"/> 35 </mappers> 36 37 </configuration>
a. properties
这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。上面例子中的 driver和url将会由 properties 元素中设置的相应值来替换。 username 和password属性将会由 jdbc.properties 文件中对应的值来替换。这样就为配置提供了诸多灵活选择。
如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
- 在 properties 元素体内指定的属性首先被读取。
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
- 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。
b. settings
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了常见设置中各项的意图、默认值等。
设置参数 | 描述 | 有效值 | 默认值 |
cacheEnabled | 该配置影响的所有映射器中配置的缓存的全局开关。 | true|false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 | true|false | false |
useColumnLabel | 使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。 | true|false | true |
useGeneratedKeys | 允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 | true|false | false |
defaultExecutorType | 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 | true|false | false |
localCacheScope | MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 | JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER | OTHER |
lazyLoadTriggerMethods | 指定哪个对象的方法触发一次延迟加载。 | A method name list separated by commas | equals,clone,hashCode,toString |
c. typeAliases
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
d. environments
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者共享相同 Schema 的多个生产数据库, 想使用相同的 SQL 映射。许多类似的用例。
不过要记住:尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一。
所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推。
注意这里的关键点:
- 默认的环境 ID(比如:default=”development”)。
- 每个 environment 元素定义的环境 ID(比如:id=”development”)。
- 事务管理器的配置(比如:type=”JDBC”)。
- 数据源的配置(比如:type=”POOLED”)。
默认的环境和环境 ID 是一目了然的。随你怎么命名,只要保证默认环境要匹配其中一个环境ID。
事务管理器(transactionManager)
在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):
- JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
- MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
1 <transactionManager type="MANAGED"> 2 <property name="closeConnection" value="false"/> 3 </transactionManager>
注意:如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
e. 映射器Mappers
MyBatis的行为已经配置的好了,接下来就应该书写Sql映射语句了。但是首先我们应该告诉MyBatis去那里加载这些信息。你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL)
1 <!--使用类路径的资源引用--> 2 <mappers> 3 <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> 4 <mapper resource="org/mybatis/builder/BlogMapper.xml"/> 5 <mapper resource="org/mybatis/builder/PostMapper.xml"/> 6 </mappers> 7 <!--使用完全限定资源定位符--> 8 <mappers> 9 <mapper url="file:///var/mappers/ArMapper.xml"/> 10 <mapper url="file:///var/mappers/BMapper.xml"/> 11 <mapper url="file:///var/mappers/CMapper.xml"/> 12 </mappers>
这样MyBatis的配置文件就告一段落,接下来该写实体映射文件---Mapper.xml