当前位置: 首页 > news >正文

MyBatis配置全解析:核心要点详解

这段内容是关于 MyBatis 框架的配置(Configuration) 的详细说明,出自 MyBatis 官方文档。它解释了 mybatis-config.xml 文件中各个配置项的作用、用法和优先级。

我们可以从整体结构出发,逐部分来理解这个配置文件的核心组成部分。


🌐 一、MyBatis 配置文件的整体结构

<configuration><properties /><settings /><typeAliases /><typeHandlers /><objectFactory /><plugins /><environments /><databaseIdProvider /><mappers />
</configuration>

这是 MyBatis 主配置文件的标准结构。每一部分都有特定的功能,下面我们逐一解读。


🔧 1. <properties> —— 外部属性配置(类似 application.properties)

作用:用于定义可替换的变量,实现配置外部化(比如数据库连接信息),便于不同环境切换。

✅ 使用方式:

<properties resource="org/mybatis/example/config.properties"><property name="username" value="dev_user"/><property name="password" value="F2Fa3!33TYyg"/>
</properties>
  • resource:引用 classpath 下的 .properties 文件。
  • 内部 <property> 可以覆盖 properties 文件中的值。

💡 在其他地方使用 ${} 占位符引用:

<dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/>
</dataSource>

⚖️ 属性加载顺序(优先级由低到高):

  1. <properties> 标签内的 property 定义;
  2. resourceurl 加载的外部 properties 文件;
  3. 通过 Java 代码传入的参数(如 SqlSessionFactoryBuilder.build(reader, props))—— 最高优先级!

示例:props.put("username", "prod_user") 会覆盖前面所有定义。

🎯 默认值支持(MyBatis 3.4.2+)

<property name="username" value="${username:ut_user}"/>

表示如果未设置 username,则默认为 ut_user

⚠️ 但该功能默认关闭!需要开启:

<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>

还可以自定义分隔符避免冲突(例如 OGNL 表达式中有 :):

<property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/>
<property name="username" value="${db:username?:guest}"/>

⚙️ 2. <settings> —— 运行时行为调优

这是 MyBatis 最重要的运行时配置,直接影响其性能和行为。

设置项说明推荐值
cacheEnabled是否启用二级缓存true
lazyLoadingEnabled是否开启懒加载true
aggressiveLazyLoading调用任意方法是否触发懒加载false(推荐)
autoMappingBehavior自动映射级别:
NONE/PARTIAL/FULL
PARTIAL
mapUnderscoreToCamelCase下划线转驼峰命名true(常用)
useGeneratedKeys是否使用 JDBC 自动生成主键true(插入后获取 ID)
defaultExecutorType执行器类型:SIMPLE / REUSE / BATCHSIMPLE(BATCH 用于批量)
logImpl日志实现(SLF4J、LOG4J2 等)建议设为 SLF4J

📌 示例:

<settings><setting name="mapUnderscoreToCamelCase" value="true"/><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/><setting name="logImpl" value="SLF4J"/>
</settings>

👉 这些设置非常关键,建议根据项目需求合理调整。


📦 3. <typeAliases> —— 类型别名

作用:给全类名起一个短名字,减少 XML 中重复书写。

✅ 方式一:单个别名定义

<typeAliases><typeAlias alias="Author" type="domain.blog.Author"/>
</typeAliases>

之后可以用 Author 代替 domain.blog.Author

✅ 方式二:包扫描自动注册

<typeAliases><package name="domain.blog"/>
</package>
</typeAliases>
  • 默认规则:类名小写作为别名 → Authorauthor
  • 若想自定义别名,可在类上加注解:
@Alias("myAuthor")
public class Author { ... }

✅ 内建别名(无需配置)

MyBatis 提供了很多常见类型的别名,如:

别名对应类型
int / integerInteger
stringString
listList
dateDate
mapMap

注意:这些别名不区分大小写。


🔄 4. <typeHandlers> —— 类型处理器

作用:负责 Java 类型与 JDBC 类型之间的转换。

例如:Java 的 String ↔ SQL 的 VARCHAR,或枚举 ↔ 数据库存储值。

✅ 内置 TypeHandler 示例:

Java 类型JDBC 类型Handler
StringVARCHAR/CLOBStringTypeHandler
IntegerINTEGERIntegerTypeHandler
DateTIMESTAMPDateTypeHandler
EnumVARCHAR/INTEGEREnumTypeHandler / EnumOrdinalTypeHandler

✅ 自定义 TypeHandler(如处理 JSON 字段)

@MappedJdbcTypes(JdbcType.VARCHAR)
public class JsonTypeHandler extends BaseTypeHandler<String> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, new Gson().toJson(parameter));}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {return new Gson().fromJson(rs.getString(columnName), String.class);}// ...
}

注册:

<typeHandlers><typeHandler handler="com.example.JsonTypeHandler"/>
</typeHandlers>

🎯 枚举处理技巧

  • EnumTypeHandler: 存储枚举名称(字符串)
  • EnumOrdinalTypeHandler: 存储序号(数字)
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler"javaType="java.math.RoundingMode"/>

你也可以在 Mapper 映射中显式指定某个字段使用哪种处理器。


🏗️ 5. <objectFactory> —— 对象工厂

MyBatis 创建结果对象时使用的工厂,默认使用无参构造函数创建实例。

可以自定义,比如结合依赖注入框架(Spring)。

<objectFactory type="org.mybatis.example.ExampleObjectFactory"><property name="someProperty" value="100"/>
</objectFactory>

一般情况下不需要修改。


🔌 6. <plugins> —— 插件(拦截器)

MyBatis 允许你在执行过程中“拦截”某些核心方法,实现扩展功能,如:

  • 分页插件(PageHelper)
  • SQL 打印日志
  • 性能监控
  • 数据权限控制

✅ 实现 Interceptor 接口:

@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
})
public class ExamplePlugin implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {System.out.println("Before query...");Object result = invocation.proceed(); // 继续执行System.out.println("After query.");return result;}@Overridepublic void setProperties(Properties properties) {// 接收配置参数}
}

注册:

<plugins><plugin interceptor="org.mybatis.example.ExamplePlugin"><property name="debug" value="true"/></plugin>
</plugins>

⚠️ 插件强大但危险,不要随意修改核心逻辑。


🌍 7. <environments> —— 环境配置(数据源 + 事务管理)

允许配置多个环境(开发、测试、生产),但每次只能使用一个。

<environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment><environment id="production"><!-- 生产环境配置 --></environment>
</environments>

✅ transactionManager 类型:

  • JDBC: 使用 JDBC 原生事务(commit/rollback),适合独立应用。
  • MANAGED: 让容器(如 Spring、JEE)管理事务,MyBatis 不主动提交或关闭连接。

⚠️ 使用 Spring 时,MyBatis 的事务会被 Spring 覆盖,所以不用特别配置。

✅ dataSource 类型:

  • UNPOOLED: 每次新建连接,简单但慢。
  • POOLED: 使用连接池(推荐),提高性能。
  • JNDI: 从 JNDI 获取数据源(企业级应用服务器中使用)。
POOLED 参数举例:
<dataSource type="POOLED"><property name="poolMaximumActiveConnections" value="20"/><property name="poolMaximumIdleConnections" value="10"/><property name="poolTimeToWait" value="20000"/>
</dataSource>

🧩 8. <databaseIdProvider> —— 多数据库支持

作用:根据不同数据库厂商执行不同的 SQL 语句。

<databaseIdProvider type="DB_VENDOR"><property name="SQL Server" value="sqlserver"/><property name="Oracle" value="oracle"/><property "MySQL" value="mysql"/>
</databaseIdProvider>

然后在 Mapper XML 中:

<select id="getUsers" resultType="User" databaseId="mysql">SELECT * FROM users LIMIT 10
</select><select id="getUsers" resultType="User" databaseId="oracle">SELECT * FROM (SELECT * FROM users) WHERE ROWNUM <= 10
</select>

这样就可以根据不同数据库写出适配的 SQL。


🗺️ 9. <mappers> —— 注册 SQL 映射文件或接口

告诉 MyBatis 到哪里去找 SQL 映射。

四种方式:

<!-- 1. 引用 XML 文件 -->
<mappers><mapper resource="mapper/UserMapper.xml"/>
</mappers><!-- 2. 使用 URL(少见) -->
<mapper url="file:///D:/mappers/UserMapper.xml"/><!-- 3. 注册 Mapper 接口 -->
<mapper class="com.example.UserMapper"/><!-- 4. 扫描整个包(推荐) -->
<package name="com.example.mapper"/>

⚠️ 如果使用接口绑定模式(推荐做法),必须保证:

  • XML 文件与接口同名且在同一目录;
  • namespace 等于接口全路径名;
  • 方法名与 SQL id 一致。

✅ 总结:如何理解 MyBatis 配置?

配置项功能简述是否常用
<properties>外部化配置,支持占位符✅ 必用
<settings>控制 MyBatis 行为(懒加载、驼峰等)✅ 必调
<typeAliases>简化类名书写✅ 推荐
<typeHandlers>自定义类型转换逻辑❓ 按需
<objectFactory>自定义对象创建方式❌ 少用
<plugins>拦截执行过程,增强功能✅ 常见(分页)
<environments>数据源和事务管理✅ 必配
<databaseIdProvider>多数据库兼容✅ 多库项目必用
<mappers>注册 SQL 映射位置✅ 必配

📝 实际开发建议

  1. 使用 properties 文件管理数据库配置
  2. 开启 mapUnderscoreToCamelCase 支持下划线转驼峰
  3. 合理配置 lazyLoadingEnabledaggressiveLazyLoading
  4. 使用连接池(POOLED)提升性能
  5. 通过 plugins 引入分页插件(如 PageHelper)
  6. 使用 package 扫描自动注册 mappers
  7. 多数据库场景下使用 databaseIdProvider

如果你正在学习 MyBatis,建议先掌握:

  • properties + environments + mappers → 基础运行
  • settings 中的 mapUnderscoreToCamelCaseuseGeneratedKeys
  • typeAliases 简化类名
  • 后续再深入 typeHandlersplugins

如有具体问题(比如“怎么配置 MySQL 分页?”、“枚举怎么存数据库?”),欢迎继续提问!

http://www.dtcms.com/a/460998.html

相关文章:

  • apache-tomcat 安装部署
  • 如何为卫生中心构建安全高效的网络系统?
  • 抖音代运营业务介绍seo文案范例
  • 珠海网站排名提升昆明网站建设frf
  • 使用 Loki + Promtail + Grafana 实现 Docker 容器日志采集与可视化
  • Dockerfile实战案例详解
  • Paimon系列:主键表流读之changelog producer
  • 本地 Docker 镜像送上云:腾讯云无服务器与容器化全栈迁移实战
  • win10安装spark3.1详细流程(小白用)
  • Spark on k8s部署
  • Kotlin 内联函数、高阶函数、扩展函数
  • 用化学方法nmp溶剂从佳能cmos传感器上剥离拜耳矩阵和微透镜
  • Apache Tomcat 详解
  • 矩阵奇异值分解(SVD)中Golub–Kahan 双对角化 + 对双对角矩阵的隐式QR详解
  • QT MVC中Model的特点及使用注意事项
  • wordpress最快仿站宁波网络营销服务
  • 徕卡RTC360助力铝单板设计效率提升
  • EasyExcel 读取 Excel 文件指南
  • LabVIEW光栅旋转式光谱仪
  • 上海营销网站设计去设计公司还是去企业
  • 怎么查询自己注册的商标东营网站建设课程定位优化
  • 【rabbitmq 高级特性】RabbitMQ 延迟队列全面解析
  • linux学习笔记(22)线程同步——线程信号量
  • 如何用营销自动化提升开信率与转化率
  • 人形机器人安全研究
  • 比斯特自动化|为什么焊接18650电池离不开点焊机?
  • 多字节串口收发IP设计(二)串口通信扫盲
  • 人工智能基础知识笔记十七:微调方法
  • 北京企业免费建站农八师建设兵团社保网站
  • 《强化学习数学原理》学习笔记11——阶段策略迭代算法