介绍
MyBatis是Apache的一个Java开源项目,原名为IBatis,后因项目托管平台的迁移更名为MyBatis。MyBatis是一款支持动态SQL语句的持久层框架,目的让开发人员精力集中在SQL上。
MyBatis特点:
-
采用配置文件动态管理SQL语句
-
-
数据库连接池配置的持久层框架
整体架构
MyBatis由数据源配置文件、SQL映射配置文件、会话工厂、会话、执行器以及底层封装对象组成。
数据源配置文件
数据库的数据源是配置在SqlMapConfig.xml(文件名可更改)配置文件中,其中配置了数据库驱动、数据库连接地址、数据库用户名和密码、事务管理等参数,还可以配置连接池的连接数和空闲时间等详细参数。
SqlMapConfig.xml(最初级的配置)
SQL映射配置文件
MyBatis将SQL配置在独立的配置文件Mapper.xml中,在这个配置文件中可以配置任何类型的SQL语句。对应SQL语句执行所需的参数,以及查询语句返回的结果集对象,都可以在配置文件中配置。配置文件,完成了对SQL语句以及输入输出参数的映射配置。
Mapper.xml(部分配置)
会话工厂与会话
MyBatis处理这些配置信息的核心对象就是"会话工厂"与"会话"。
SqlSessionFactory类会根据Resources资源信息加载对象,获取开发人员在项目中配置的数据库连接池配置文件SqlMapConfig.xml的信息,从而产生一种可以与数据库交互的会话实例类-SqlSession.
运行流程
SqlSessionFactory会话工厂会通过Resource资源信息加载对象获取SqlMapConfig.xml配置文件信息,然后产生可以与数据库进行交互的会话实例类SqlSession。会话实例类SqlSession可以根据Mapper配置文件中的SQL配置,去执行相应的增删查改操作。而在SqlSession类内部,是通过执行器Executor(分为基本执行器和缓存执行器)对数据库进行操作。执行器Executor与数据库交互,依靠的是底层封装对象Mappered Statement,它封装了从Mapper文件中读取的信息(包括SQL语句、输入参数、输出结果类型)。通过Executor与底层封装对象Mappered Statement的结合,就实现了与数据库进行交互的功能。
配置文件详解
SqlMapConfig
包含了数据库连接信息和Mapper映射文件的加载路径、全局参数以及类型别名等一系列MyBatis的核心配置信息。
配置名称 | 配置含义 | 配置简介 |
---|---|---|
configuration | 包裹所有配置标签 | 整个配置文件的顶级标签 |
properties | 属性 | 可以引入外部配置,也可以自己配置 |
setting | 全局配置参数 | 用来配置一些改变运行时行为的信息,例:延迟机制、延迟加载等 |
typeAliases | 类型别名 | 设置一些别名来代替Java的长类型声明 |
typeHandlers | 类型处理器 | 将SQL中返回的数据库类型转换为相应的Java类型的处理器配置 |
objectFactory | 对象工厂 | 实例化目标类的工厂类配置 |
plugins | 插件 | 修改MyBatis的核心行为 |
environments | 环境集合属性对象 | 数据库环境信息的集合 |
environment | 环境子属性对象 | 数据库环境配置的详细配置 |
tranasctionManager | 事务管理 | 指定MyBatis的事务管理器 |
dataSource | 数据源 | type指定连接类型,property指定数据库连接池的其他信息 |
mappers | 映射器 | 配置SQL映射文件的位置。 |
prooerties
可以供整个配置文件中的其他配置使用,properties标签可以引入一个可动态变换的外部配置。在properties标签内部放property标签,来配置子元素信息。通过property标签的name属性取得相应的value值。
properties标签配置样例
//避免了数据库信息的"硬编码"
<propreties resource="org/mybatis/test/db.properties">
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</propreties>
db.property文件配置样例
driver=com.mybatis.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8
username=root
password=root
<dataSource type="POOLED">
<property name="deriver" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</dataSource>
setting
setting配置缓存、延迟加载、结果集控制、执行器、分页设置、命名规则等控制性参数,与MyBatis的运行性能息息相关。
属性名 | 含义 | 默认值 |
---|---|---|
cacheEnabled | 是否使用缓存 | true |
lazyLoadingEnabled | 是否开启延迟加载 | false |
aggressiveLazyLoading | 是否按需加载属性 | false |
defaultScriptingLanguage | 动态SQL默认语言 | org.agache.ibatis.scriping.xmltags.XMLLanguageDriver |
完整的setting配置样例
<settings>
<setting name="cacheEnabled" value="true"></setting>
<setting name="lazyLoadingEnabled" value="true"></setting>
<setting name="multipleResultSetsEnable" value="true"></setting>
<setting name="useColumnLabel" value="true"></setting>
<setting name="useGeneratedKeys" value="false"></setting>
<setting name="autoMappingBehavior" value="PARTIAL"></setting>
<setting name="autoMappingUnknownCoolumnBehavior" value="WARNING"></setting>
<setting name="defaultExecutorType" value="SIMPLE"></setting>
<setting name="defaultStatementTimeout" value="25"></setting>
<setting name="defaultFetchSize" value="100"></setting>
<setting name="safeRowBoundsEnabled" value="false"></setting>
<setting name="mapUnderscoreToCamelCase" value="false"></setting>
<setting name="localCacheScope" value="SESSION"></setting>
<setting name="jdbcTypeForNull" value="OTHER"></setting>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"></setting>
</settings>
typeAliases
常使用paramterType、resultType之类的参数设置SQL语句的输入/输出参数,一般参数都是一个Java类型的数据,有基本数据类型或封装类型,但是一般都要声明该类型的全路径名称。
配置示例
<typeAliases>
<typeAlias name="com.mybatis.po"></typeAlias>
</typeAliases>
在SQL映射配置文件中可以使用别名来指定输入/输出参数的类型
<select id="findUserByUsername" parameterType="str" resultType="user">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
别名可以使用@Alias注解来实现,在需指定别名的类声明头添加即可
typeHandlers
将从数据库获取的值以合适的方式转换为Java类型,或者将Java类型的参数转换为数据库对应的类型。使用typeHandlers配置一个自己的类型处理器分为三步:1.编写类型处理器类 2.在MyBatis全局配置文件中配置该类型处理器 3.在SQL映射配置文件中使用
objectFactory
实例化查询结果对应的目标类,有两种方式将查询结果的值映射到对应的目标类,一是通过目标类的默认构造方法,另外一种通过目标类的有参构造方法。想改写默认的对象工厂,可以继承DefaultObjectFactory来创建自己的对象工厂。
plugins
可以很好地对方法的调用进行监控,而且还可以修改或重写方法的行为逻辑,主要是对某种方法进行拦截调用的机制。实现plugin只需继承Interceptor接口,并且指定需要拦截的方法的签名信息即可。
environments
放置有关数据库连接数据的配置标签,所有与外部数据库进行交互的数据都配置在该标签中。每一个environment,代表多个数据库环境的配置信息,都包含事务管理器和数据源信息。事务管理器有两种类型:JDBC和MANAGED,JDBC相当于直接使用JDBC的提交和回滚。设置为MANAGED,则不提交和回滚连接,而是由容器来管理事务的生命周期,默认是关闭状态。
Mybatis有三种内建的数据源类型:UNPOOLED、POOLED、JNDI。UNPLOOED设置每次请求时打开和关闭连接;POOLED设置一个管理数据库连接的资源池,用来合理控制数据库的连接和关闭次数;JNDI配置连接外部数据源的信息
DataSource配置信息
属性名称 | 作用 |
---|---|
driver | JDBC驱动名称,可以使用"."为驱动添加其他属性 |
url | 数据库连接地址 |
username | 数据库连接用户名 |
password | 数据库连接密码 |
defaultTransactionIsolationLevel | 默认连接事务的隔离级别 |
MyBatis要兼容各个数据库厂商的SQL语言规则,还需在全局中配置“databaseIdProvider”参数。
mappers
用来配置需要加载的SQL映射配置文件的路径的,mappers的子标签mapper都是一个独立的Mapper映射配置文件的路径,可以使用相对路径、绝对路径、接口信息、接口所在的包。
Mapper
主要用来配置SQL映射语句的,根据不同的SQL语句性质,使用不同的标签来包裹。
标签名称 | 作用 |
---|---|
insert | 插入语句 |
update | 更新语句 |
delete | 删除语句 |
select | 查询语句 |
resultMap | 将数据库结果集取出的数据映射到实体对象的相应字段中 |
Mapper自动映射
如果SQL语句查询的结果中有列名与该Java包装类中的属性名一致,则该字段就会被映射到该属性上。自动映射有三种模式:NONE、PARTIAL、FULL。NONE表示不启用自动映射;PARTIAL表示只对非嵌套的resultMap进行自动映射;FULL表示对所有的resultMap都进行自动映射,默认为PARTIAL,对于FULL模式,不管resultMap是嵌套还是非嵌套都会自动映射,慎重使用防止数据混乱。
缓存结构
MyBatis提供一级缓存和二级缓存的机制。一级缓存是SqlSession级别的缓存。二级缓存是Mapper级别的缓存,多个SqlSession类的实例对象操作同一个Mapper配置文件中的SQL语句,多个SqlSession类的实例对象可以共用二级缓存,二级缓存是跨SqlSession的。
要开启二级缓存,需要在MyBatis的全局配置文件SqlMapConfig.xml中配置setting属性,name值为"cacheEnabled",value的值为"true"。还需要在mapper.xml中添加一个cache标签即可。
二级缓存的特点:
-
缓存以namespace为单位,不同的namespace下的操作互不影响
-
增、删、改操作会清空namespace下的全部缓存
-
通常使用MyBatis Generator(逆向工程)生成的代码中,各个表都是独立的,每个表都有自己的namespace。