MyBatis的核心配置文件解析

浅浅的花香味﹌ 2024-04-06 10:30 143阅读 0赞

Java知识点总结:想看的可以从这里进入

目录

    • 3、MyBatis核心配置文件
      • 3.1、properties
      • 3.2、settings
      • 3.3、typeAliases
      • 3.4、typeHandlers
        • 3.4.1、简介
        • 3.4.2、自定义
      • 3.5、objectFactory
      • 3.6、environments
      • 3.7、mappers

3、MyBatis核心配置文件


MyBatis的核心 XML 配置文件的配置有严格的顺序限制,不能颠倒

  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. <properties resource=""/> <!--指定外部 properties 文件-->
  7. <properties>
  8. <property name="" value=""/> <!--配置一些默认值-->
  9. </properties>
  10. <!--MyBatis的设置-->
  11. <settings>
  12. <setting name="" value=""/>
  13. </settings>
  14. <!--为一些类设置别名-->
  15. <typeAliases >
  16. <!--为包下的多个类定义别名,即类名且不区分大小写-->
  17. <package name="net.biancheng.po"/>
  18. <!--为单个类设置别名-->
  19. <typeAlias type="类的路径" alias="别名"/> <!-- 设置了alias就是指定的名 -->
  20. <typeAlias type="类路径"/> <!--不写别名就是默认的,即类名且不区分大小-->
  21. </typeAliases>
  22. <!--类型处理器,将获取的值合理地转化为 Java 类型,分为 jdbcType 和 javaType-->
  23. <typeHandlers>
  24. <typeHandler handler="处理器路径" jdbcType="定义数据库类型" javaType="定义 Java 类型"/>
  25. </typeHandlers>
  26. <!--对象工厂,一般不会自定义而是使用默认的-->
  27. <objectFactory type="">
  28. <property name="" value=""/>
  29. </objectFactory>
  30. <!--插件-->
  31. <plugins>
  32. <plugin interceptor=""></plugin>
  33. </plugins>
  34. <!--配置运行环境,将 SQL 映射到多个不同的数据库上,default指定默认环境-->
  35. <environments default="">
  36. <environment id=""> <!--环境变量-->
  37. <transactionManager type=""></transactionManager> <!--事务管理器-->
  38. <dataSource type=""> <!--数据源-->
  39. <property name="" value=""/> <!--基本参数-->
  40. </dataSource>
  41. </environment>
  42. </environments>
  43. <!--数据库厂商标识-->
  44. <databaseIdProvider type=""></databaseIdProvider>
  45. <!--映射器,XML文件的路径-->
  46. <mappers>
  47. <mapper resource=""/>
  48. </mappers>
  49. </configuration>

3.1、properties

properties主要是配置运行参数,它提供了三种使用方式:

  • property子元素

    1. <properties>
    2. <property name="database.driver" value="com.mysql.cj.jdbc.Driver"/>
    3. </properties>
    4. <environments default="development">
    5. <environment id="development">
    6. <transactionManager type="JDBC"/>
    7. <dataSource type="POOLED">
    8. <property name="driver" value="${database.driver}"/> <!--引用到property的设置-->
    9. </dataSource>
    10. </environment>
    11. </environments>
  • 读取properties配置文件

    1. jdbc.driver=com.mysql.cj.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost:3306/库名?useUnicode=true&amp&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    3. jdbc.username=root
    4. jdbc.password=密码
    5. <properties resource="db.properties"/> <!--导入配置文件-->
    6. <environments default="development">
    7. <environment id="development">
    8. <transactionManager type="JDBC"/>
    9. <dataSource type="POOLED">
    10. <property name="driver" value="${jdbc.driver}"/> <!--引用-->
    11. </dataSource>
    12. </environment>
    13. </environments>
  • 程序代码传递(可能有些数据是加密的所以必须要先破解后才能使用,所以可以使用这种方式破解后进行替换)

    1. private static SqlSessionFactory factory;
    2. static {
    3. try {
    4. //先获取properties配置文件
    5. InputStream in = Resources.getResourceAsStream("db.properties");
    6. Properties properties = new Properties();
    7. properties.load(in);
    8. //对加密信息进行破解
    9. //获取mybatis的配置文件
    10. InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
    11. //获取工厂,替换成properties里的配置文件
    12. factory = new SqlSessionFactoryBuilder().build(inputStream,properties);
    13. } catch (IOException e) {
    14. e.printStackTrace();
    15. }
    16. }

3.2、settings

提供了众多的配置,不需要大规模配置,大部分情况下使用默认的即可。

  1. <settings>
  2. 全局性地开启或关闭缓存,默认true
  3. <setting name="cacheEnabled" value="true"/>
  4. 延迟加载,当开启时,关联对象都会延迟加载。默认false
  5. <setting name="lazyLoadingEnabled" value="true"/>
  6. 日志
  7. <setting name="logImpl" value="LOG4J"/>
  8. 是否允许单个语句返回多结果集(需要数据库驱动支持)。默认true
  9. <setting name="multipleResultSetsEnabled" value="true"/>
  10. 使用列标签代替列名,需要数据库驱动支持。。默认true
  11. <setting name="useColumnLabel" value="true"/>
  12. 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。
  13. <setting name="useGeneratedKeys" value="false"/>
  14. 指定 MyBatis 应如何自动映射列到字段或属性。
  15. NONE 表示关闭自动映射;
  16. PARTIAL (默认)只会自动映射没有定义嵌套结果映射的字段。
  17. FULL 会自动映射任何复杂的结果集(无论是否嵌套)。
  18. <setting name="autoMappingBehavior" value="PARTIAL"/>
  19. 指定发现自动映射目标未知列(或未知属性类型)的行为。
  20. NONE(默认): 不做任何反应
  21. WARNING: 输出警告日志
  22. FAILING: 映射失败 (抛出 SqlSessionException)
  23. <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  24. 配置默认的执行器。
  25. SIMPLE(默认) 就是普通的执行器;
  26. REUSE 执行器会重用预处理语句(PreparedStatement);
  27. BATCH 执行器不仅重用语句还会执行批量更新。
  28. <setting name="defaultExecutorType" value="SIMPLE"/>
  29. 设置超时时间,决定数据库驱动等待数据库响应的秒数。
  30. <setting name="defaultStatementTimeout" value="25"/>
  31. 为驱动的结果集获取数量(fetchSize)设置一个建议值。此参数只可以在查询设置中被覆盖。
  32. <setting name="defaultFetchSize" value="100"/>
  33. 是否允许在嵌套语句中使用分页(RowBounds)。允许使用则为 false。默认false
  34. <setting name="safeRowBoundsEnabled" value="false"/>
  35. 是否允许在嵌套语句中使用结果处理器(ResultHandler)。允许使用则为 false。默认false
  36. <setting name="safeResultHandlerEnabled" value="false"/>
  37. 是否开启驼峰命名自动映射, A_COLUMN →aColumn
  38. <setting name="mapUnderscoreToCamelCase" value="false"/>
  39. 默认值为 SESSION,会缓存一个会话中执行的所有查询。
  40. <setting name="localCacheScope" value="SESSION"/>
  41. 当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型。
  42. <setting name="jdbcTypeForNull" value="OTHER"/>
  43. 指定对象的哪些方法触发一次延迟加载。
  44. <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
  45. </settings>

3.3、typeAliases

XML文件中的映射关系都是使用的类全限定名,有些全限定名很长,所以可以通过此标签设置别名来代替全限定名。

  • 系统自定义别名:MyBatis初始化时,已经自动初始化的一些别名(我们常用的Sting、基本数据类型、集合等等)
  • XML自定义单个类的别名

    1. XML配置文件中配置别名后
    2. <typeAliases>
    3. <typeAlias alias="user" type="com.yu.entity.User"/>
    4. </typeAliases>
    5. 在映射文件中可以直接使用别名
    6. <select id="findAll" resultType="user"> 如果没有配置typeAlias,则需要写全限定名
    7. </select>
  • 直接扫描包,包内的类的别名为首字母变成小写

    1. <typeAliases>
    2. <package name="包名"/>
    3. </typeAliases>
  • 注解

    1. @Alias("user")
    2. public class User {
    3. ...
    4. }

3.4、typeHandlers

3.4.1、简介

typeHandlers 主要将获取的值合理地转化为 Java 类型。在 typeHandler 中,分为 jdbcType 和 javaType,其中 jdbcType 用于定义数据库类型,而 javaType 用于定义 Java 类型,typeHandler 的作用就是承担 jdbcType 和 javaType 之间的相互转换。

我们知道数据库的数据类型和Java的数据类型是不一样的,所以需要typeHandlers 来进行转换。MyBatis针对这些数据类型内部已经定义了很多的 typeHandler,且会自己探测转换,所以基本不需要我们显示的定义。































































































































































































类型处理器 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 类型,存储枚举的索引(而不是名称)。
InstantTypeHandler java.time.Instant TIMESTAMP
LocalDateTimeTypeHandler java.time.LocalDateTime TIMESTAMP
LocalDateTypeHandler java.time.LocalDate DATE
LocalTimeTypeHandler java.time.LocalTime TIME
OffsetDateTimeTypeHandler java.time.OffsetDateTime TIMESTAMP
OffsetTimeTypeHandler java.time.OffsetTime TIME
ZonedDateTimeTypeHandler java.time.ZonedDateTime TIMESTAMP
YearTypeHandler java.time.Year INTEGER
MonthTypeHandler java.time.Month INTEGER
YearMonthTypeHandler java.time.YearMonth VARCHAR or LONGVARCHAR
JapaneseDateTypeHandler java.time.chrono.JapaneseDate DATE
3.4.2、自定义

这些内置的转换器基本能适应大多数适应,但也有需要自己配置的情况(如枚举),自定义TypeHandler需要实现org.apache.ibatis.type.TypeHandler接口,或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler,然后可以选择性地将它映射到一个JDBC类型。。

  1. public class MyTypeHandler implements TypeHandler<String> {
  2. //将java类型转换为数据库需要的类型
  3. @Override
  4. public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
  5. }
  6. //将数据库中的类型转换为java类型
  7. @Override
  8. public String getResult(ResultSet rs, String columnName) throws SQLException {
  9. return null;
  10. }
  11. //将数据库中的类型转换为java类型
  12. @Override
  13. public String getResult(ResultSet rs, int columnIndex) throws SQLException {
  14. return null;
  15. }
  16. //将数据库中的类型转换为java类型
  17. @Override
  18. public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
  19. return null;
  20. }
  21. }

配置TypeHandler

  1. <typeHandlers>
  2. <typeHandler javaType="string" jdbcType="VARCHAR" handler="com.yu.util.MyTypeHandler"/>
  3. </typeHandlers>

3.5、objectFactory

在MyBatis返回结果集时,就会使用一个对象工厂来创建这个结果集对应的实例。MyBatis有一个默认的对象工厂 org.apache.ibatis.reflection.factory.DefaultObjectFactory完成相应的工作,它实现了org.apache.ibatis.reflection.factory.ObjectFactory 接口。

ObjectFactory 就是底层接口,我们可以同时实现它来自定义对象工厂,但一般情况下不会这么做。

  1. public interface ObjectFactory {
  2. /**设置配置属性。*/
  3. default void setProperties(Properties properties) {
  4. // NOP
  5. }
  6. /**使用默认构造函数创建一个新对象*/
  7. <T> T create(Class<T> type);
  8. /**使用指定的构造函数和参数创建一个新对象。 */
  9. <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs);
  10. /**如果此对象可以具有一组其他对象,则返回 true。 */
  11. <T> boolean isCollection(Class<T> type);
  12. }

3.6、environments

environments主要的作用是配置数据库信息,内部可以配置多个数据库信息,然后选择一个。

  • environment(环境变量)

    • transactionManager(事务管理器)

      • JDBC:使用时JdbcTransactionFactory生成的JdbcTransaction对象实现,以JDBC的方式对数据库的提交和回滚进行操作。
      • MANAGED:使用ManagedTransactionFactory生成的ManagedTransaction对象实现,把事务交给容器处理。默认关闭连接,需要将closeConnection设置成false
      • 也可以指定自定义事务工厂
    • dataSource(数据源)

      • POOLED(PooledDataSourceFactory):默认,数据池连接
      • UNPOOLED(UnpooledDataSourceFactory):jdbc原始的连接,以非数据库管理池的方式实现,每次请求都打开和关闭
      • JNDI(JudiDataSourceFactory):在EJB或应用服务器使用











3.7、mappers

映射器是Mybatis的核心组件,而mappers标签就是为了引入映射器。

  • 通过具体的文件引入

    1. <mappers>
    2. <mapper resource="mapping的全限定名"/>
    3. </mappers>
  • 通过包名引入包内所有的映射器

    1. <mappers>
    2. <mapper resource="mapping所在的包名"/>
    3. </mappers>

发表评论

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

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

相关阅读

    相关 Mybatis配置

    目录 一 核心配置文件 二 环境配置(environments) 三 属性(properties) 四 别名 五 设置 六 映射器 ---------------