MyBatis的全局配置文件包含设置(settings)和属性(properties)信息,文档结构如下:
目的:为了在全局配置文件(mybatis-config.xml)中有代码提示,需要引入dtd约束(dtd文件是用来规定xml中的标签语法规则的)
步骤1:打开mybatis的全局配置文件(mybatis-config.xml),ctrl+鼠标移动到配置文件中的dtd网址,即可在线下载dtd文件
步骤2:下载完成后,点击eclipse中Window--->Preference--->XML--->XML Catalog。然后点击Add添加,Key中填写dtd文件网址,Key type选择URI,Location中选择要引入的dtd文件,最后点击ok即可
步骤1:找到mybatis-3.4.1.jar包,使用解压缩软件打开,按照mybatis-3.4.1.jar\org\apache\ibatis\builder\xml这个路径,即可找到两个dtd文件,将这两个文件复制出来即可。
步骤2:点击eclipse中Window--->Preference--->XML--->XML Catalog。然后点击Add添加,Key中填写dtd文件网址,Key type选择URI,Location中选择要引入的dtd文件,最后点击ok即可
properties标签可以引入外部properties配置文件的内容
properties标签有两个参数:
- 第一个参数(resource):引入类路径下的资源
- 第二个参数(url):引入网络路径或磁盘路径下的资源
示例:通过properties标签,引入properties文件中的数据源信息
步骤1:创建properties文件(此处在全局配置文件的文件夹下创建)
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
步骤2:修改全局配置文件,通过properties标签引入properties文件,并读取数据源信息
mybatis中settings是最复杂的配置,它能深刻影响mybatis底层的运行,但是在大部分情况下使用默认值便可以运行,所以在大部分情况下不需要大量配置它,只需要修改一些常用的规则即可,比如自动映射,驼峰命名映射,级联规则,是否启动缓存,执行器类型等。
settings标签的配置项说明如下:
配置项 | 作用 | 配置选项 | 默认值 |
cacheEnabled | 该配置影响所有映射器中配置缓存的全局开关 | true|false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。在特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态 | true|false | false |
aggressiveLazyLoading | 当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载 | true|false | 版本3.4.1 (不包含) 之前 true,之后 false |
multipleResultSetsEnabled | 是否允许单一语句返回多结果集(需要兼容驱动) |
true|false | true |
useColumnLabel | 使用列标签代替列名。不同的驱动会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果 | true|false | true |
useGeneratedKeys | 允许JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby) | true|false | false |
autoMappingBehavior | 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射。 PARTIAL 表示只会自动映射,没有定义嵌套结果集和映射结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套) |
NONE、PARTIAL、FULL | PARTIAL |
autoMappingUnknownColumnBehavior | 指定自动映射当中未知列(或未知属性类型)时的行为。 默认是不处理,只有当日志级别达到 WARN 级别或者以下,才会显示相关日志,如果处理失败会抛出 SqlSessionException 异常 | NONE、WARNING、FAILING | NONE |
defaultExecutorType | 配置默认的执行器。SIMPLE 是普通的执行器;REUSE 会重用预处理语句(prepared statements);BATCH 执行器将重用语句并执行批量更新 | SIMPLE、REUSE、BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间,它决定驱动等待数据库响应的秒数 | 任何正整数 | Not Set (null) |
defaultFetchSize | 设置数据库驱动程序默认返回的条数限制,此参数可以重新设置 | 任何正整数 | Not Set (null) |
safeRowBoundsEnabled | 允许在嵌套语句中使用分页(RowBounds)。如果允许,设置 false | true|false | false |
safeResultHandlerEnabled | 允许在嵌套语句中使用分页(ResultHandler)。如果允许,设置false | true|false | true |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射 | true|false | false |
localCacheScope | MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速联复嵌套査询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlScssion 的不同调用将不会共享数据 |
SESSION|STATEMENT | SESSION |
jdbcTypeForNull | 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER | NULL、VARCHAR、OTHER | OTHER |
lazyLoadTriggerMethods | 指定哪个对象的方法触发一次延迟加载 | — | equals、clone、hashCode、toString |
defaultScriptingLanguage | 指定动态 SQL 生成的默认语言 | — | org.apache.ibatis .script.ing.xmltags .XMLDynamicLanguageDriver |
callSettersOnNulls | 指定当结果集中值为 null 时,是否调用映射对象的 setter(map 对象时为 put)方法,这对于 Map.kcySet() 依赖或 null 值初始化时是有用的。注意,基本类型(int、boolean 等)不能设置成 null | true|false | false |
logPrefix | 指定 MyBatis 增加到日志名称的前缀 | 任何字符串 | Not set |
loglmpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动査找 | SLF4J|LOG4J|LOG4J2|JDK_LOGGING |COMMONS_LOGGING |ST DOUT_LOGGING|NO_LOGGING |
Not set |
proxyFactory | 指定 MyBatis 创建具有延迟加栽能力的对象所用到的代理工具 | CGLIB|JAVASSIST | JAVASSIST (MyBatis 版本为 3.3 及以上的) |
vfsImpl | 指定 VFS 的实现类 | 提供 VFS 类的全限定名,如果存在多个,可以使用逗号分隔 | Not set |
useActualParamName | 允许用方法参数中声明的实际名称引用参数。要使用此功能,项目必须被编译为 Java 8 参数的选择。(从版本 3.4.1 开始可以使用) | true|false | true |
示例:mapUnderscoreToCamelCase(是否开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射)
数据库表设计:
数据库表对应的JavaBean:
settings标签中的mapUnderscoreToCamelCase属性,默认是false,即未开启自动驼峰命名规则映射,此时通过mybatis获取数据表中的信息,由于数据库表中last_name和JavaBean中lastName命名不同,不能直接映射,所以查询的字段为null
解决方案:
(1)为数据表中的列定义别名,别名对应JavaBean中的字段名
(2)将settings标签中的mapUnderscoreToCamelCase属性设置为true,即开启自动驼峰命名规则映射
typeAliases标签为某个Java类型起别名
(1)typeAliases标签下的typeAlias标签有两个参数:
- 第一个参数(type):指定要起别名的类型全类名,默认别名就是类名的小写
- 第二个参数(alias):指定新的别名
(2)typeAliases标签下的package标签,可以为某个包下的所有类批量起别名
- 第一个参数(name):指定包名(为当前包以及下面所有的后代包的每一个类起一个默认别名,即类名小写)
(3)批量起别名时,如果有类名冲突,可以使用@Alias注解为某个类指定新的类名
示例1:使用typeAlias标签为某个类起别名
步骤1:在全局配置文件mybatis-config.xml中,为Employee类起别名
步骤2:在sql映射文件中,直接使用上述别名即可
示例2:使用package标签为包下的所有类起别名
步骤1:在全局配置文件mybatis-config.xml中,为com.csu.marden包下的所有类起别名,默认为类名小写
步骤2:在sql映射文件中,直接使用上述别名即可
mybatis中通过typeHandlers标签完成JDBC类型与Java类型的转换。即mybatis在设置预处理语句中的参数或从结果集中取出一个值时,都会用类型处理器将获取到的值以合适的方式转换成Java类型。
类型处理器 | Java类型 | JDBC类型 |
BooleanTypeHandler | java.lang.Boolean, boolean | 数据库兼容的BOOLEAN |
ByteTypeHandler | java.lang.Byte, byte | 数据库兼容的NUMERIC 或BYTE |
ShortTypeHandler | java.lang.Short, short | 数据库兼容的NUMERIC 或SHORT INTEGER |
IntegerTypeHandler | java.lang.Integer, int | 数据库兼容的NUMERIC 或INTEGER |
LongTypeHandler | java.lang.Long, long | 数据库兼容的NUMERIC 或LONG INTEGER |
FloatTypeHandler | java.lang.Float, float | 数据库兼容的NUMERIC 或FLOAT |
DoubleTypeHandler | java.lang.Double, double | 数据库兼容的NUMERIC 或DOUBLE |
BigDecimalTypeHandler | java.math.BigDecimal | 数据库兼容的NUMERIC 或DECIMAL |
StringTypeHandler | java.lang.String | CHAR, VARCHAR |
插件是mybatis提供的一个非常强大的机制,我们可以通过插件来修改mybatis的一些核心行为。
插件通过动态代理机制,可以介入下面四大对象的任何一个方法的执行。
mybatis允许在sql映射语句执行过程中的某一点进行拦截调用。默认情况下,mybatis允许使用插件来拦截的方法调用如下:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
environments标签
- mybatis可以通过environments标签配置多种环境,比如开发,测试和生产环境需要不同的配置
- 每种环境使用一个environment标签进行配置并指定唯一标识符
- 可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境(default属性对应environment标签的id属性)
environment标签
- environment标签用来配置一个具体的环境信息,包括id属性和两个标签
- id属性:指定当前环境的唯一标识
- 两个标签:transactionManager标签和dataSource标签
transactionManager标签
- transactionManager标签用来配置事务管理器,其中type属性用来配置事务管理器的类型
- type属性:JDBC | MANAGED | 自定义
- JDBC(JdbcTransactionFactory):使用了JDBC的提交和回滚设置,依赖于从数据源得到的连接来管理实务范围
- MANAGED(ManagedTransactionFactory):不提交或回滚一个连接,让容器来管理实务的整个生命周期(比如JEE应用服务器的上下文)
- 自定义:实现TransactionFactory接口,type==全类名/别名
dataSource标签
- dataSource标签用来配置数据源,其中type属性用来配置数据源类型
- type属性:UNPOOLED | POOLED | JNDI | 自定义
- UNPOOLED(UnpooledDataSourceFactory):不适用连接池
- POOLED(PooledDataSourceFactory):使用连接池
- JNDI(JndiDataSourceFactory):在EJB或应用服务器这类容器汇总查找指定的数据源
- 自定义:实现DataSourceFactory接口,定义数据源的获取方式,type==全类名/别名
注意:在environments标签下,尽管可以配置多个环境,但是default只能选择运用某一个环境(开发环境,测试环境,生产环境等)
mybatis通过databaseIdProvider标签支持多数据厂商,即根据不同的数据库厂商执行不同的语句
type属性是必须的,不配置时会报错,该属性值使用的是DB_VENDOR(VendorDatabaseIdProvider类的别名)。其作用就是得到数据库厂商的标识(数据库驱动自带),mybatis就能根据数据库厂商标识来执行不同的sql语句
property子标签的作用是配置一个数据库,其中name属性就是数据库名称,value属性就是我们自定义的别名,通过别名我们可以在sql语句中表示适用于哪种数据库运行
databaseIdProvider标签的配置:
2
3
4
5
6
sql映射文件中使用databaseId属性来标识数据库类型:
mappers标签的作用是将sql映射文件注册到全局配置文件中
- resource属性:引用类路径下的sql映射文件
- url属性:引用网络路径或磁盘路径下的sql映射文件
- class属性:直接引用接口(注册接口)。若有sql映射文件,则映射文件名必须和接口同名,并且放在与接口同一目录下。若没有sql映射文件(所有的sql都是利用注解写在接口上)。
- package子标签:批量注册,引入包下所有的映射接口。映射文件名必须与接口同名,并且映射文件与接口必须放在同一个目录下,name属性写包名。
使用resource属性(使用相对于类路径下的资源):
使用url属性(使用网络路径或者磁盘路径下的资源---全限定路径):
使用class属性(直接引用接口):
使用package子标签(引入包下所有的映射接口)