MyBatis 核心配置详解
配置、环境、数据源、类型处理器、插件
mybatis-config.xml 结构
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 1. 属性配置 -->
<properties resource="db.properties"/>
<!-- 2. 设置 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 3. 类型别名 -->
<typeAliases>
<typeAlias type="com.example.entity.User" alias="User"/>
<package name="com.example.entity"/>
</typeAliases>
<!-- 4. 类型处理器 -->
<typeHandlers>
<typeHandler handler="com.example.handler.LocalDateHandler"/>
</typeHandlers>
<!-- 5. 对象工厂 -->
<objectFactory type=""/>
<!-- 6. 插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>
<!-- 7. 环境配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 8. Mapper 配置 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
<mapper class="com.example.mapper.UserMapper"/>
<package name="com.example.mapper"/>
</mappers>
</configuration>properties 属性配置
外部配置文件 (db.properties)
properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_db?useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=password引用方式
xml
<properties resource="db.properties"/>
<dataSource>
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
</dataSource>settings 设置
重要配置项
xml
<settings>
<!-- 开启驼峰命名自动映射:user_id → userId -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 积极加载(按需加载) -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 日志实现 -->
<setting name="logImpl" value="SLF4J"/>
<!-- 开启二级缓存(默认 true) -->
<setting name="cacheEnabled" value="true"/>
<!-- JDBC 类型为 null 时使用 OTHER -->
<setting name="jdbcTypeForNull" value="NULL"/>
<!-- 自动生成主键(selectKey) -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 指定触发延迟加载的方法 -->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>typeAliases 类型别名
单个定义
xml
<typeAliases>
<typeAlias type="com.example.entity.User" alias="User"/>
<typeAlias type="com.example.entity.Order" alias="Order"/>
</typeAliases>批量定义(包扫描)
xml
<typeAliases>
<package name="com.example.entity"/>
</typeAliases>使用 @Alias 注解
java
@Alias("User")
public class User {
private Long id;
private String name;
}内置类型别名
| 别名 | Java 类型 |
|---|---|
| string | String |
| integer / int | Integer / int |
| long | Long |
| double | Double |
| float | Float |
| boolean | Boolean |
| date | Date |
| decimal / bigdecimal | BigDecimal |
| map | Map |
| hashmap | HashMap |
| list / arraylist | List / ArrayList |
typeHandlers 类型处理器
内置类型处理器
| 处理器 | 对应 Java 类型 | JDBC 类型 |
|---|---|---|
| StringTypeHandler | String | VARCHAR |
| IntegerTypeHandler | Integer | INTEGER |
| LongTypeHandler | Long | BIGINT |
| BooleanTypeHandler | Boolean | BIT |
| DateTypeHandler | Date | TIMESTAMP |
| LocalDateTimeHandler | LocalDateTime | TIMESTAMP |
自定义类型处理器
java
@MappedTypes(LocalDate.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class LocalDateTypeHandler extends BaseTypeHandler<LocalDate> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
LocalDate parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter.toString());
}
@Override
public LocalDate getNullableResult(ResultSet rs, String columnName)
throws SQLException {
String date = rs.getString(columnName);
return date == null ? null : LocalDate.parse(date);
}
@Override
public LocalDate getNullableResult(ResultSet rs, int columnIndex)
throws SQLException {
String date = rs.getString(columnIndex);
return date == null ? null : LocalDate.parse(date);
}
@Override
public LocalDate getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
String date = cs.getString(columnIndex);
return date == null ? null : LocalDate.parse(date);
}
}注册方式
xml
<typeHandlers>
<typeHandler handler="com.example.handler.LocalDateTypeHandler"/>
<package name="com.example.handler"/>
</typeHandlers>environments 环境配置
环境定义
xml
<environments default="development">
<!-- 开发环境 -->
<environment id="development">
<transactionManager type="JDBC">
<property name="closeConnection" value="false"/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 连接池配置 -->
<property name="poolMaximumActiveConnections" value="10"/>
<property name="poolMaximumIdleConnections" value="5"/>
<property name="poolMaximumCheckoutTime" value="20000"/>
<property name="poolTimeToWait" value="20000"/>
</dataSource>
</environment>
<!-- 生产环境 -->
<environment id="production">
<transactionManager type="MANAGED"/>
<dataSource type="JNDI">
<property name="data_source" value="java:comp/env/jdbc/mybatis"/>
</dataSource>
</environment>
</environments>事务管理器类型
| 类型 | 说明 |
|---|---|
| JDBC | 直接使用 JDBC 提交/回滚 |
| MANAGED | 容器管理事务(Spring/JEE) |
| 自定义 | 实现 TransactionFactory |
数据源类型
| 类型 | 说明 |
|---|---|
| UNPOOLED | 每次请求创建新连接 |
| POOLED | 连接池(推荐) |
| JNDI | JNDI 数据源 |
mappers 映射器注册
方式一:XML 资源路径
xml
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
<mapper resource="mapper/OrderMapper.xml"/>
</mappers>方式二:类注册
xml
<mappers>
<mapper class="com.example.mapper.UserMapper"/>
<mapper class="com.example.mapper.OrderMapper"/>
</mappers>方式三:包扫描
xml
<mappers>
<package name="com.example.mapper"/>
</mappers>方式四:URL 注册
xml
<mappers>
<mapper url="file:///D:/mybatis/mapper/UserMapper.xml"/>
</mappers>插件机制
插件接口
java
@Intercepts({
@Signature(type = Executor.class, method = "query",
args = {MappedStatement.class, Object.class,
RowBounds.class, ResultHandler.class}),
@Signature(type = Executor.class, method = "update",
args = {MappedStatement.class, Object.class})
})
public class ExamplePlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 执行前处理
System.out.println("执行前...");
// 执行目标方法
Object result = invocation.proceed();
// 执行后处理
System.out.println("执行后...");
return result;
}
}注册插件
xml
<plugins>
<plugin interceptor="com.example.plugin.ExamplePlugin"/>
</plugins>相关页面
- **Java\MyBatis\MyBatis-完全指南** - 返回总览
- **Java\MyBatis\MyBatis-Mapper映射** - SQL 映射详解
- **Java\MyBatis\MyBatis-关联查询** - 复杂关系查询
#标签 #mybatis #配置 #settings #properties #typeHandler