MyBatis-2-MyBatis的全局配置文件

傷城~ 2023-10-05 08:48 103阅读 0赞

目录

全局配置文件属性:configuration 配置

1:properties属性-引入外部配置文件

2:settings 设置-这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。

3:typeAliases—为常用的类型起别名,主要是解决javabean类完全限定名的冗余

3.1:为类取别名(推荐)

3.2:为包名取别名(不推荐)

3.3:mybatis已占用的别名,不得使用

4:typeHandlers—-可以将自定义的类型处理器放在mybatis中

5:插件(plugins)-通过插件来修改MyBatis的一些核心行为

6:environments—-配置环境

7:databaseIdProvider—-MyBatis 可以根据不同的数据库厂商执行不同的语句

8:mappers:写好的mapper映射文件需要注册进来

8.1:mapper—-引入我们接口的实现的文件

注:class还有另一种用法;使用注解直接在接口上写sql(xml和配置可以配合使用,复杂的用xml)

8.2:批量注册:直接扫描包


全局配置文件属性:configuration 配置

  • properties 属性
  • settings 设置
  • typeAliases 类型命名
  • typeHandlers 类型处理器
  • objectFactory 对象工厂,
  • plugins 插件,
  • environments 环境

    • environment 环境变量

      • transactionManager 事务管理器
      • dataSource 数据源
  • databaseIdProvider 数据库厂商标识
  • mappers 映射器

1:properties属性-引入外部配置文件

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNjk0OTA2_size_16_color_FFFFFF_t_70

  1. <!--引入外部配置文件
  2. resource:从类路径下开始引用
  3. url:从网络或者磁盘下引用
  4. -->
  5. <properties resource="datasource.properties"></properties>
  6. <environments default="development">
  7. <environment id="development">
  8. <transactionManager type="JDBC"/>
  9. <!--配置连接池-->
  10. <dataSource type="POOLED">
  11. <!--从${}下取出配置文件的值-->
  12. <property name="driver" value="${driver}"/>
  13. <property name="url" value="${url}"/>
  14. <property name="username" value="${username}"/>
  15. <property name="password" value="${password}"/>
  16. </dataSource>
  17. </environment>
  18. </environments>

2:settings 设置-这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。




























































































































































设置参数 描述 有效值 默认值
cacheEnabled 该配置影响的所有映射器中配置的缓存的全局开关。 true | false true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 true | false false
aggressiveLazyLoading 当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载。 true | false true
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 Specify the behavior when detects an unknown column (or unknown property type) of automatic mapping target.

  • NONE: Do nothing

  • WARNING: Output warning log (The log level of ’org.apache.ibatis.session.AutoMappingUnknownColumnBehavior’ must be set to WARN)

  • FAILING: Fail mapping (Throw SqlSessionException)

NONE, WARNING, FAILING NONE
defaultExecutorType 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。 SIMPLE REUSE BATCH SIMPLE
defaultStatementTimeout 设置超时时间,它决定驱动等待数据库响应的秒数。 Any positive integer Not Set (null)
defaultFetchSize Sets the driver a hint as to control fetching size for return results. This parameter value can be override by a query setting. Any positive integer Not Set (null)
safeRowBoundsEnabled 允许在嵌套语句中使用分页(RowBounds)。 If allow, set the false. true | false False
safeResultHandlerEnabled 允许在嵌套语句中使用分页(ResultHandler)。 If allow, set the false. true | false True
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
defaultScriptingLanguage 指定动态 SQL 生成的默认语言。 A type alias or fully qualified class name. org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver
callSettersOnNulls 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的。 true | false false
logPrefix 指定 MyBatis 增加到日志名称的前缀。 Any String Not set
logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING Not set
proxyFactory 指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。 CGLIB | JAVASSIST JAVASSIST (MyBatis 3.3 or above)
vfsImpl Specifies VFS implementations Fully qualified class names of custom VFS implementation separated by commas. Not set
useActualParamName Allow referencing statement parameters by their actual names declared in the method signature. To use this feature, your project must be compiled in Java 8 with -parameters option. (Since: 3.4.1) true | false true

完整的settings实例:

  1. <settings>
  2. <setting name="cacheEnabled" value="true"/>
  3. <setting name="lazyLoadingEnabled" value="true"/>
  4. <setting name="multipleResultSetsEnabled" value="true"/>
  5. <setting name="useColumnLabel" value="true"/>
  6. <setting name="useGeneratedKeys" value="false"/>
  7. <setting name="autoMappingBehavior" value="PARTIAL"/>
  8. <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  9. <setting name="defaultExecutorType" value="SIMPLE"/>
  10. <setting name="defaultStatementTimeout" value="25"/>
  11. <setting name="defaultFetchSize" value="100"/>
  12. <setting name="safeRowBoundsEnabled" value="false"/>
  13. <setting name="mapUnderscoreToCamelCase" value="false"/>
  14. <setting name="localCacheScope" value="SESSION"/>
  15. <setting name="jdbcTypeForNull" value="OTHER"/>
  16. <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
  17. </settings>

3:typeAliases—为常用的类型起别名,主要是解决javabean类完全限定名的冗余

3.1:为类取别名(推荐)

  1. <!--为常用的类型起别名,主要是解决javabean类完全限定名的冗余-->
  2. <typeAliases>
  3. <!--type是类的权限定名,不写别名默认是类名;或者用alias配置别名-->
  4. <typeAlias type="com.wkl.bean.Employee" alias="person"></typeAlias>
  5. </typeAliases>
  6. <select id="getEmployee" resultType="person">
  7. select * from t_employee where id =#{id}
  8. </select>

3.2:为包名取别名(不推荐)

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

  1. <typeAliases>
  2. <package name="domain.blog"/>
  3. </typeAliases>

每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。看下面的例子:

  1. @Alias("author")
  2. public class Author {
  3. ...
  4. }

3.3:mybatis已占用的别名,不得使用

已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理。






















































































































别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

4:typeHandlers—-可以将自定义的类型处理器放在mybatis中

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 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
ClobReaderTypeHandler java.io.Reader -
ClobTypeHandler java.lang.String CLOB, LONGVARCHAR
NStringTypeHandler java.lang.String NVARCHAR, NCHAR
NClobTypeHandler java.lang.String NCLOB
BlobInputStreamTypeHandler java.io.InputStream -
ByteArrayTypeHandler byte[] 数据库兼容的字节流类型
BlobTypeHandler byte[] BLOB, LONGVARBINARY
DateTypeHandler java.util.Date TIMESTAMP
DateOnlyTypeHandler java.util.Date DATE
TimeOnlyTypeHandler java.util.Date TIME
SqlTimestampTypeHandler java.sql.Timestamp TIMESTAMP
SqlDateTypeHandler java.sql.Date DATE
SqlTimeTypeHandler java.sql.Time TIME
ObjectTypeHandler Any OTHER 或未指定类型
EnumTypeHandler Enumeration Type VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引)
EnumOrdinalTypeHandler Enumeration Type 任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(而不是名称)。

你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个 JDBC 类型。比如:

  1. @MappedJdbcTypes(JdbcType.VARCHAR)
  2. public class ExampleTypeHandler extends BaseTypeHandler<String> {
  3. @Override
  4. public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
  5. ps.setString(i, parameter);
  6. }
  7. @Override
  8. public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
  9. return rs.getString(columnName);
  10. }
  11. @Override
  12. public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
  13. return rs.getString(columnIndex);
  14. }
  15. @Override
  16. public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
  17. return cs.getString(columnIndex);
  18. }
  19. }

5:插件(plugins)-通过插件来修改MyBatis的一些核心行为

• 插件是 MyBatis 提供的一个非常强大的机制,我们可以通过插件来修改 MyBatis 的一些核心行为。 插件通过动态代理机制 ,可以介入四大对象的任何一个方法的执行。后面会有专门的章节我们来介绍 mybatis 运行原理以及 插件

Executor (update, query, flushStatements , commit, rollback, getTransaction , close, isClosed )

ParameterHandler ( getParameterObject , setParameters )

ResultSetHandler ( handleResultSets , handleOutputParameters )

StatementHandler (prepare, parameterize, batch, update, query)

6:environments—-配置环境

  1. <!--配置环境们,default:当前默认选用的环境-->
  2. <environments default="development">
  3. <!--真正配置的环境,id是唯一的标识-->
  4. <environment id="development">
  5. <!--配置事务管理
  6. type: JDBC | MANAGED | 自定义
  7. JDBC:使用了 JDBC 的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围。 JdbcTransactionFactory
  8. MANAGED:不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 ManagedTransactionFactory
  9. 自定义:实现TransactionFactory接口,type=全类名/别名
  10. -->
  11. <transactionManager type="JDBC"/>
  12. <!--配置连接池
  13. type: UNPOOLED | POOLED | JNDI | 自定义
  14. UNPOOLED:不使用连接池, UnpooledDataSourceFactory
  15. POOLED:使用连接池, PooledDataSourceFactory
  16. JNDI: 在EJB 或应用服务器这类容器中查找指定的数据源
  17. 自定义:实现DataSourceFactory接口,定义数据源的获取方式。
  18. -->
  19. <dataSource type="POOLED">
  20. <!--从${}下取出配置文件的值-->
  21. <property name="driver" value="${driver}"/>
  22. <property name="url" value="${url}"/>
  23. <property name="username" value="${username}"/>
  24. <property name="password" value="${password}"/>
  25. </dataSource>
  26. </environment>
  27. </environments>

7:databaseIdProvider—-MyBatis 可以根据不同的数据库厂商执行不同的语句

在全部中这样配置;

  1. <!--mybatis考虑数据库移植-->
  2. <databaseIdProvider type="DB_VENDOR">
  3. <!--name:数据库厂商标识;value:别名-->
  4. <property name="MySQL" value="mysql"/>
  5. <property name="SQL Server" value="sqlserver"/>
  6. <property name="Oracle" value="orcl"/>
  7. </databaseIdProvider>

在mapper文件中可以这样:

  1. <!--默认执行这个-->
  2. <select id="getEmployee" resultType="person">
  3. select * from t_employee where id =#{id}
  4. </select>
  5. <!--当前数据库是oracle的话执行这个;精确优先-->
  6. <select id="getEmployee" resultType="person" databaseId="orcl">
  7. select * from t_employee where id =#{id}
  8. </select>

8:mappers:写好的mapper映射文件需要注册进来

8.1:mapper—-引入我们接口的实现的文件

  1. <!--引入我们自己编写的每一个接口的实现文件-->
  2. <!--
  3. resource:从类路径下找
  4. url:从网络或者磁盘下找
  5. class:直接引用接口全类名
  6. 可以将xml和dao接口放在同一个包下;而且文件名一直,他就会自己找
  7. -->
  8. <mappers>
  9. <mapper resource="mapper/EmployeeDao.xml"/>
  10. </mappers>

注:class还有另一种用法;使用注解直接在接口上写sql(xml和配置可以配合使用,复杂的用xml)

  1. package com.wkl.dao;
  2. import com.wkl.bean.Employee;
  3. import org.apache.ibatis.annotations.Select;
  4. /**
  5. * Description:
  6. * Date: 2020/8/19 - 下午 4:31
  7. * author: wangkanglu
  8. * version: V1.0
  9. */
  10. public interface EmployeeDaoAonotation {
  11. @Select("select * from t_employee where id =#{id}")
  12. public Employee getEmployee(Integer id);
  13. }

20200820142325255.png

8.2:批量注册:直接扫描包

这种方式要求SQL映射文件名必须和接口名相同并且在同一目录下

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNjk0OTA2_size_16_color_FFFFFF_t_70 1

或者直接可以扫描注解的接口

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNjk0OTA2_size_16_color_FFFFFF_t_70 2

发表评论

表情:
评论列表 (有 0 条评论,103人围观)

还没有评论,来说两句吧...

相关阅读